melody_lin 发表于 2009-3-14 23:38:34

初学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的时候出了问题才这样的

machao 发表于 2009-3-15 15:11:01

你如果使用T8用户模块配置的,请使用它提供应用函数。

如果你要自己写中断,还是比较麻烦的。可以讲这已经属于中高级的使用了。

melody_lin 发表于 2009-3-17 09:08:32

上面的问题我解决了,我在timer8的中断汇编程序中加了一句
ljmp Timer8_ISR_C
就好了

machao 发表于 2009-3-17 10:49:42

可以的。但要注意所加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高手的。

armok 发表于 2009-7-28 23:21:30

页: [1]
查看完整版本: 初学PSOC遇到了问题