This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LPC936 timer issues with xdata vars vs. idata vars

I've had a working project/system for over 10 years now, and we developed an offshoot product using the same LPC936 chip. My delays on the working system uses Timer 0 and I have the interrupt set on 1 ms (millisecond). I use a routine like 'delay(500)' to delay 500ms. It works perfectly.

I copied (or so I thought) the delay routines over to my new product, and found out the delays were off substantially. I discovered that in my working system, I had timer variables defined as 'xdata'. In my new system, I had defined them as 'idata'. No other differences. I changed the new system to use 'xdata', and guess what, the delays started working perfectly. On the money, every time, every delay. I changed it back to 'idata' and a couple of delays are correct, but some are way under the proper delay. Some are longer then delay. What can cause that weird behavior?

I have a test case that does nothing but turns on an LED and delays, to cut out all other activity. This is the only timer running and no other interrupts are set up. I assume there is a register or stack corruption problem or some race condition when using idata over xdata, but don't know at this stage.

Any ideas?

Sutton

Parents
  • Hmm, it could be that the ISR doesn't complete until the next interrupt request and you're loosing interrupts. You might also have ISR masking issues.

    My guess is that you simply reset the timer to 0 in the ISR instead of Subtracting the cycle from the timer register, to compensate for time passed since the interrupt was requested.

Reply
  • Hmm, it could be that the ISR doesn't complete until the next interrupt request and you're loosing interrupts. You might also have ISR masking issues.

    My guess is that you simply reset the timer to 0 in the ISR instead of Subtracting the cycle from the timer register, to compensate for time passed since the interrupt was requested.

Children