Go Down

Topic: Which external interrupt to wake 328P? (Read 13223 times) previous topic - next topic

nickgammon

Atmel has reproduced the behavior, and has escalated the issue. I asked whether it might just be a documentation error (reply #12 above).
Have you got a link to your report, Jack? I submitted my own one yesterday and got this response (the implication being it was news to them)  :

Quote
Commented by Manoraj Gnanadhas (Atmel)
2015-01-08 11:27:32 GMT
[Recipients: Nick Gammon]

Hello Nick,

Thank you for contacting Atmel Technical Support.

It looks like a mistake in the datasheet. We tested here and also able to reproduce the same behavior here. If you refer "Section - 13. External Interrupts (Page-70)", you can read the following information.

"Low level interrupts and the edge interrupt on INT2:0 are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep modes other than Idle mode."

This is contradicting with the 'Note-3' mentioned under Table 10-1. Therefore I need to confirm this with the concerned team. I will get back to you once I receive any valid update from the design team.

Best Regards,
Manoraj Gnanadhas

Please post technical questions on the forum, not by personal message. Thanks!

More info: http://www.gammon.com.au/electronics

nickgammon

I got this confirmation today that the datasheet was wrong:

Quote
Commented by Manoraj Gnanadhas (Atmel)
2015-01-20 06:23:36 GMT
(Recipients: Nick Gammon)

Hello Nick,

Our design team has confirmed that "Note-3 mentioned under Table 10-1" is a datasheet bug. So you can use any type of interrupt (Rising edge/ Falling edge / Low level / Any logical change) to wake up from sleep mode. Sorry for the inconvenience caused.

Best Regards,
Manoraj Gnanadhas
Please post technical questions on the forum, not by personal message. Thanks!

More info: http://www.gammon.com.au/electronics

ChilliTronix

Well done for getting that out of them Nick!

nickgammon

Thanks! I've amended my Interrupts page to mention this altered information.
Please post technical questions on the forum, not by personal message. Thanks!

More info: http://www.gammon.com.au/electronics

ChilliTronix

Good, because that is where I would look if I were checking!

It is also good to note that almost any form of interrupt would work.

Charly86

Humm,

This is an interessting post, to be honest, I was using interrupt like that (and worked) without really have read the datasheet on this point. It looked to me so logical (and worked) that I missed this one, good catch.

By the way, while on interrupt post, I would like if possible to ask you guys on your high level of expertise on interrupt. I read all Nick dedicated post about interrupt on his forum (my godness this site is my most technical reference bible) and still have a interrogation due to strange thing happening on my ULPNode prototypes with IRQ and sleep mode.

Let's say I have this code (I simplified it from my lib)

Code: [Select]


// blah blah configure IRQ that could wake us (in my case INT0 and a Pin change)

volatile uint8_t counter = 0;

// we don't want to be waked by the watchdog, so be
// sure to disable it by changing the config
WDTCSR = _BV(WDCE) | _BV(WDE);
WDTCSR = 0;    

set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
  
// turn off BOD (sequenced order see datasheet)
// Don't change anything before we're waked
MCUCR = _BV(BODS) | _BV(BODSE);
MCUCR = _BV(BODS);
sei();          
sleep_cpu();  
  
// ...........
// ZZZZZZZZZZZ
// ...........
  
// Waked !!!
counter++;
nop(); // be sure to avoid compiler optimization changing 3*+1 counter increment to 1*3
counter++;
nop(); // be sure to avoid compiler optimization changing 3*+1 counter increment to 1*3
counter++;
  


I think while reading this code, your mind is already anticipating my question  ;)

So my question is : what is the 1st instruction executed after wake up ? If I check counter in my IRQ which should have been the 1st instruction executed (well after the IRQ push stack overhead of course) I should always read it to 0 or is there a change that the IRQ trigger was delayed due to wake up and counter incremented before my IRQ was triggered ?

Really thanks for your help



Coding Badly

So my question is : what is the 1st instruction executed after wake up ?
Call to the interrupt service routine vector which is nearly always a jump to the interrupt service routine.  In your case, the vector for the watchdog.


Charly86

Hey,

Thank you for your answer, that's what I thought, but sometimes, I saw strange things just like if my code was executed just before entering into my IRQ (the one who wake up me). But I have so much IRQ stuff in my project that it can be another thing. I think I will need to isolate one and write a small sketch with only this config and one IRQ. Then stress it with a switch push button to verify.

Go Up