Question

It seems to me that my timer interrupt does not work correctly. Problem is that counter inside interrupt function increments only once. Here is my code from main and timer settings.

#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);
}
Was it helpful?

Solution

Most interrupt service routines need to re-arm the interrupt (sometimes called "acknowledging the interrupt) which called it. Otherwise, the ISR is only called once. Typically, this is done after the critical part of the ISR is complete.

In the case of the 503418, I think the reenabling is done by reading the counter register. See the code at the bottom of this.

OTHER TIPS

A possible problem you might have is a misconfigured interrupt service routine in Timer8INT.asm. When using the directive #pragma interrupt_handler you need to make sure you're using the right instruction to call the C interrupt service routine in your Timer8INT.asm ISR.

If this directive is defined a reti instruction will be add to the end of that function which is incorrect if you use lcall to call that C function from your Timer8INT.asm. In this case you actually need a simple ljmp instruction to that C function.

When using directive #pragma interrupt_handler Timer8INT.asm should have

_Timer8_ISR:

    ljmp _myTimerInt

    reti

Without directive #pragma interrupt_handler Timer8INT.asm should have

_Timer8_ISR:

    PRESERVE_CPU_CONTEXT
    lcall _myTimerInt
    RESTORE_CPU_CONTEXT

    reti
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top