在我看来,我的计时器中断无法正常工作。问题是计数器内部中断功能只增加一次。这是我的主要和计时器设置的代码。
#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);
}
答案 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}}