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 ответа
Большинству подпрограмм обслуживания прерываний необходимо повторно активировать прерывание (иногда называемое "подтверждение прерывания"), которое его вызвало. В противном случае ISR вызывается только один раз. Как правило, это делается после завершения критической части ISR.
В случае 503418, я думаю, что повторное включение выполняется путем считывания регистра счетчика. Смотрите код внизу этого.
Возможная проблема, с которой вы можете столкнуться, - неправильно настроенная подпрограмма обработки прерываний в Timer8INT.asm. При использовании директивы #pragma interrupt_handler
вам нужно убедиться, что вы используете правильную инструкцию для вызова подпрограммы обработки прерываний C в ISR Timer8INT.asm.
Если эта директива определена reti
инструкция будет добавлена в конец этой функции, что неправильно, если вы используете lcall
чтобы вызвать эту функцию C из вашего Timer8INT.asm. В этом случае вам действительно нужно простое ljmp
инструкция к этой функции C.
При использовании директивы #pragma interrupt_handler
Timer8INT.asm должен иметь
_Timer8_ISR:
ljmp _myTimerInt
reti
Без директивы #pragma interrupt_handler
Timer8INT.asm должен иметь
_Timer8_ISR:
PRESERVE_CPU_CONTEXT
lcall _myTimerInt
RESTORE_CPU_CONTEXT
reti