I'm having trouble with timer output compare interrupts on the HCS12. The problem seems to be that I'm writing calculated values to the output compare registers rather than immediates, ie...
OCval = x + y ; ldd OC1, OCval ; // what I need to do
ldd OC1, #3000 ; // what works
With the calculated values, the timer interrupt is erratic, which is unacceptable in my application. The problem has been firmly pinned down to the documented requirement to access the timer and OC registers in a single cycle, anything other than an immediate write violates this. I also note that all the sample code on the web uses immediate ops.
Just wondering if there is a software workaround. I need to allow the counter to free run (ie. no reset) because there are other output compares with immediate writes that have to remain in action. Only two of my interrupts need to be calculated.
A software fix would be nice because the only other options I can see involve additional hardware to handle the dynamic timing, messy. TIA
volatile uint16_t result = x + y; OCval = result;. - LundinFLAGREG |= MASK;which results in "read FLAGREG, store result in accumulator, add mask, write result back". And then as flags are cleared by writing a 1 to them, you also destroy all other flags in the same register. To get the right assembler code (BSET),FLAGREG = MASK;usually gives the correct instructions. Depending on compiler. - Lundin