05-25-2009, 09:30 AM
|
#1391 (permalink)
|
Master EcoModder
Join Date: Jun 2008
Location: London, Ontario
Posts: 1,096
Thanks: 0
Thanked 17 Times in 14 Posts
|
Just doing my post-weekend catchup read. Good work again, Paul. I'm glad that you're getting things sorted out now that you're using a few extra bits.
FYI, there are a few ways that interrupts can act if they overrun.
1. A new interrupt can interrupt the currently interrupting interrupt. Whe that one is done, it returns to the first one to complete it. If it gets interrupted before it is done, the same thing happens, if this continues we have a stack overflow and the cpu goes crazy.
2. A new interrupt can be completely ignored because the first one is not done.
3. A new interrupt can be queued up to run after the first. Only one can be queued up, so if you take too long, or repeatedly take a little too long, then you'll skip one.
It all depends on how you have set up your interrupt handlers and masks. Ideally, though... you arrange the code so that in the worst case, you aren't using the full available time... the system has to do other things too, remember.
Do you have your ADC reading and/or filtering happening during interrupts as well, or polled?
|
|
|
Today
|
|
|
Other popular topics in this forum...
|
|
|
05-25-2009, 09:57 AM
|
#1392 (permalink)
|
needs more cowbell
Join Date: Feb 2008
Location: ÿ
Posts: 5,038
Thanks: 158
Thanked 269 Times in 212 Posts
|
Quote:
Originally Posted by MazdaMatt
...Do you have your ADC reading and/or filtering happening during interrupts as well, or polled?
|
If it still looks anything like the svn code:
/trunk/HighVoltageControllerIMPROVED_ECOM.C - Open ReVolt - Trac
everything is done in a timer interrupt, which might be a problem. Could use a lower priority interrupt for updating some of the variables (i.e. temperature). And any variables updated in an interrupt "thread" should be declared volatile.
Paul, did you measure how long that isr takes to complete in worst case?
__________________
WINDMILLS DO NOT WORK THAT WAY!!!
|
|
|
05-25-2009, 10:04 AM
|
#1393 (permalink)
|
Master EcoModder
Join Date: Jun 2008
Location: London, Ontario
Posts: 1,096
Thanks: 0
Thanked 17 Times in 14 Posts
|
Another thought - is it really necessary to control the current at 16kHz? Could you back it off to 8kHz or 4kHz? Your current and throttle values are being fed through rolling average filters, so it isn't like you're actually responding to "this cycle's" current reading.
A question about AtMegas in general - can you easily erase and rewrite flash sectors on the fly? On the Coldfire, if I wanted to store some user settings, i could just drop them into the program flash - just need tomake sure that the compiler is avoiding that section of flash.
|
|
|
05-25-2009, 10:53 AM
|
#1394 (permalink)
|
needs more cowbell
Join Date: Feb 2008
Location: ÿ
Posts: 5,038
Thanks: 158
Thanked 269 Times in 212 Posts
|
The megas have eprom built in
http://atmel.com/dyn/resources/prod_...ts/doc2486.pdf
You can overwrite flash too, but that affects reliability IMHO. Best to use the eprom so writes that go wonky dont overwrite code.
__________________
WINDMILLS DO NOT WORK THAT WAY!!!
|
|
|
05-25-2009, 10:56 AM
|
#1395 (permalink)
|
Master EcoModder
Join Date: Jun 2008
Location: London, Ontario
Posts: 1,096
Thanks: 0
Thanked 17 Times in 14 Posts
|
Cool. That could definately be used for some mild datalogging.
|
|
|
05-25-2009, 11:28 AM
|
#1396 (permalink)
|
PaulH
Join Date: Feb 2008
Location: Maricopa, AZ (sort of. Actually outside of town)
Posts: 3,832
Thanks: 1,362
Thanked 1,202 Times in 765 Posts
|
Hey Adam, I might have to wait until tomorrow to reproduce it. We are having a big party, and all my "gCode" is on the backs of old credit card bills in the garage and in a couple different notebooks that can't find right now.
Matt, that's a good idea about lowering the frequency at which I check the current. Sampling at 4 KHz would allow for plenty of time during worst case to have everything inside a single interrupt. I could definitely move the temperature measurement outside, but I've never done multiple interrupts at different priorities. I need to look that up. I did a couple different timer interrupts once but that's about it. I didn't know what had what priority.
I haven't been sampling the throttle, because it was pretty clean, but there is a bit of a wiggle to the throttle signal too because the A/D conversions are happening pretty fast. So, maybe I could do the same thing with the throttle too, but maybe only 4 or 8 averages? If I had plenty of time, I could do
I guess the only thing I would lose would be the coveted current measure at the same point on the waveform each time. Maybe not though. I need to try some things. I'm pretty new to microcontroller interrupt handling.
EDIT: The general interrupt control register looks promising! I need to read more. Actually I should be doing other things! haha!
Last edited by MPaulHolmes; 05-25-2009 at 11:34 AM..
|
|
|
05-25-2009, 11:37 AM
|
#1397 (permalink)
|
Master EcoModder
Join Date: Jun 2008
Location: London, Ontario
Posts: 1,096
Thanks: 0
Thanked 17 Times in 14 Posts
|
Wait wait... you misread... Keep sampling the current at every waveform and keep doing the rolling average thing. What i meant was, can you do the PI thing at 4 or 8kHz? Adjust your PWM duty every 2 or 4 pwm cycles. You are reacting on every single cycle to a value that is averaged out over the last X cycles.
If you find that the throttle is being read smoothly, then don't bother filtering it. I would assume that you already have a filter capacitor on the throttle, that should be fine.
|
|
|
05-25-2009, 11:42 AM
|
#1398 (permalink)
|
PaulH
Join Date: Feb 2008
Location: Maricopa, AZ (sort of. Actually outside of town)
Posts: 3,832
Thanks: 1,362
Thanked 1,202 Times in 765 Posts
|
I'm doing the PI thing at 1kHz right now, but inside the interrupt that's being called at 16 kHz. I do a quick test of:
if (ISRCounter % 16 == 0)
do PI stuff...
if (ISRCounter % 32000 == 0)
do temperature stuff.
So, most of the time, I'm only doing some quick things related to current.
|
|
|
05-25-2009, 11:44 AM
|
#1399 (permalink)
|
Master EcoModder
Join Date: Jun 2008
Location: London, Ontario
Posts: 1,096
Thanks: 0
Thanked 17 Times in 14 Posts
|
I'm sorry... i thought that i read above that you were doing PI at 16Khz... ignore this entire line of questioning. My bad.
edit - i highly recommend putting each of those if( blah % x) into its own timer interrupt. Arrange the priorities correctly and you'll never overrun an interrupt time.
|
|
|
05-25-2009, 11:49 AM
|
#1400 (permalink)
|
needs more cowbell
Join Date: Feb 2008
Location: ÿ
Posts: 5,038
Thanks: 158
Thanked 269 Times in 212 Posts
|
Paul, I looked at the base timing of the ISR (calling it within AVR studio) of the svn version, and a typical call looked like about 1225 cycles, or 80us @ 16mhz. Plenty of room there if the interrupt is happening @~1000 Hz, but not the latest code and optimized for size (not even sure what compiler I'm using).
__________________
WINDMILLS DO NOT WORK THAT WAY!!!
|
|
|
|