PSoC定时器中断

时间:2014-03-30 10:58:38

标签: c embedded interrupt psoc

在我看来,我的计时器中断无法正常工作。问题是计数器内部中断功能只增加一次。这是我的主要和计时器设置的代码。

#include <m8c.h>
#include "PSoCAPI.h"
#include <stdio.h>
#include <stdlib.h>

char theStr[] = "PSoC LCD";
static char tmp[3];
static int counter = 0;

void main(void){

    LCD_Start();
    LCD_Position(0,5);
    LCD_PrString(theStr);
    M8C_EnableGInt;
    Timer8_EnableInt();
    Timer8_Start();
    while (1);
}

#pragma interrupt_handler myTimerInt
void myTimerInt(void){
    counter ++;
    LCD_Position(1,0);
    itoa(tmp, counter, 10);
    LCD_PrString(tmp);
}

2 个答案:

答案 0 :(得分:1)

大多数中断服务程序需要重新设置调用它的中断(有时称为“#34;确认中断”)。否则,ISR只被调用一次。通常,这是在ISR的关键部分完成之后完成的。

对于503418,我认为重新启用是通过读取计数器寄存器来完成的。请参阅this底部的代码。

答案 1 :(得分:0)

您可能遇到的一个问题是Timer8INT.asm中的中断服务程序配置错误。 使用指令#pragma interrupt_handler时,您需要确保使用指令reti 在Timer8INT.asm ISR中调用C中断服务程序的正确指令。

如果定义了这个指令,那么如果你使用lcall从Timer8INT.asm调用该C函数,那么ljmp指令将被添加到该函数的末尾,这是不正确的。在这种情况下,您实际上需要对该C函数执行简单的#pragma interrupt_handler指令。

当使用指令_Timer8_ISR: ljmp _myTimerInt reti 时,Timer8INT.asm应该有

#pragma interrupt_handler

没有指令_Timer8_ISR: PRESERVE_CPU_CONTEXT lcall _myTimerInt RESTORE_CPU_CONTEXT reti Timer8INT.asm应该有

{{1}}