初学PSOC遇到了问题
我现在在初学PSOC,但是遇到了问题。用定时器Terminalcountout中断控制一个发光二极管每一秒钟闪烁一次,但是程序下进后二极管一直亮着,是不是没有响应中断啊?
我的程序代码:
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler Timer8_ISR_C
/*
extern void Timer8_EnableInt(void);
extern void Timer8_DisableInt(void);
extern void Timer8_Start(void);
extern void Timer8_Stop(void);
extern BYTE Timer8_bReadTimer(void);
extern BYTE Timer8_bReadTimerSaveCV(void);
extern void Timer8_WritePeriod(BYTE bPeriod);
extern BYTE Timer8_bReadCompareValue(void);
extern void Timer8_WriteCompareValue(BYTE bCompareValue);
*/
void main()
{
// Insert your main routine code here.
//Timer8_WritePeriod(183);
M8C_EnableGInt;
Timer8_EnableInt();
Timer8_Start();
while(1);
}
void Timer8_ISR_C()
{
PRT0DR^ =0x02;
}
芯片配置
Global Resources
CPU_Clock =12 MHz
VC1 =16 Divide 24 MHz SysClock by 16.
VC2 =16 Divide VC1 by 16.
VC3 Source =VC2 Set the source for VC3 as VC2.
VC3 Divider =256 Divide VC2 by 256 (to produce a 366 Hz clock)
User Module Parameters
Timer8_1 Clock =VC3 Input 366 Hz clock from VC3.
Capture =Low Not used.
TerminalCountOut =Row_0_Output_0 For routing to Pin2.
CompareOut =None Not used.
Period =182 Set to 182 and count down.
Compare Value =0 Not used.
Compare Type=Less Than Not used.
Interrupt Type =Terminal Count To generate interrupt after the down counter reaches 0.
Clock Sync =Sync To SysClk Synchronize to system clock.
TC_PulseWidth =Full width Generate a full pulse width at every terminal count. InvertCapture =Normal Not used.
那个中断服务程序的框架在硬件配置好后Designer会自动生成吗?我没有看到框架生成,是不是构建Project的时候出了问题才这样的 你如果使用T8用户模块配置的,请使用它提供应用函数。
如果你要自己写中断,还是比较麻烦的。可以讲这已经属于中高级的使用了。 上面的问题我解决了,我在timer8的中断汇编程序中加了一句
ljmp Timer8_ISR_C
就好了 可以的。但要注意所加LJMP的位置。
如果在代码中不使用T8提供的函数,就要加在最开始处。
如果在代码中还要使用T8提供的函数,就只能加在最后面的中断返回前的位置,但这样可能会对T8函数的精度有影响(如果你的中断代码太多的话)
另外的方法是直接修改boot.tpl文件中相对应的地方,原理是相同的,就是把中断直接转移到自己的中断中。但此时T8的函数全部不能使用。下面是我改Sleep Timer 中断直接到自己中断的例子:
在boot.tpl文件中找到Sleep Timer的定位 org 64h处,将原来的`@INTERRUPT_25注销掉,加上转移指令。
org 64h ;Sleep Timer Interrupt Vector
;`@INTERRUPT_25`
ljmp _isr_sleeptimer
reti
如果对定时要求不高,只是产生一个简单的比较粗的时间定时的话,可以先考虑是否可以直接使用系统资源的Sleep Timer,而不使用T8。这样可以节省一个数字模块资源,做它用。这样才能充分发挥PSoC的特点。
做这些改动,要概念清楚,具备比较好的汇编的基础(不是说一定非常了解PSoC的汇编),知道汇编、中断、C代码中断的编写方法,以及它们之间的关系等等。所以我说“属于中高级的使用”。
尽管LZ说自己初学PSoC,但我觉的LZ应该是具备比较深厚其它8位或32位的功底的。你会很快成为PSoC高手的。
页:
[1]