Hi, i have got some problems with my arduino that is equipped with an atmega 168. I want to put the atmega into sleep mode for x milliseconds. The wakeup is realized with a Timer2 interrupt. If I use in the loop function the "delay(1)" just for testing purposes the led that is connected to pin 13 blinks in 5 sec interval. (as it should be) But if I remove the delay and write the "sleep_now()" instead, the led flashes every 10 seconds. Does anybody have an explanation for this weird behavior? Cheers, Jochen Here is the code: #include <avr/interrupt.h> #include <avr/io.h> #include <avr/sleep.h> int volatile time=5000; //sleep time boolean volatile timerEnabled=false; int volatile counter = 0; void sleepNow() / set_sleep_mode(SLEEP_MODE_PWR_SAVE); // sleep mode is set here sleep_enable(); // enables the sleep bit in the mcucr register // so sleep is possible. just a safety pin sleep_mode(); // here the device is actually put to sleep!! // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP sleep_disable(); // first thing after waking from sleep: // disable sleep... } void setup() { // Serial.begin(19200); pinMode(13,OUTPUT); TCCR2A |= (1 << WGM21); //ctc mode OCR2A = 124; //set timer maximum to 124 TCNT2 = 0;//reset timer TCCR2B = 0b00000100; //((1 << CS22)|(1 << CS20)); //prescaler 64 sei(); } ISR(TIMER2_COMPA_vect) { counter ++; if (counter == time) { TCCR2A =0; // stop timer compA interrupts counter=0; timerEnabled=false; } } ///////////////////////////////////////////////////////////////// void loop() { if(timerEnabled==true) sleepNow(); //delay(1100); else { //Serial.println("TEST"); timerEnabled=true; digitalWrite(13,HIGH); delay(10); digitalWrite(13,LOW); //time=1000; TCNT2 = 0; //reset timer TIMSK2 |= (1 << OCIE2A); //enable timer interrupt } }
Hi Jochen, perhaps, it is the missing bracket here void sleepNow() { / set_sleep_mode(SLEEP_MODE_PWR_SAVE); // sleep mode is set here so this part of the programm will not work
Hi guys, thanks for the reply, but the bracket is definitly not the cause. I have deleted it by mistake when i was edinting the code to post it here in the forum. The code compiles without problems. Cheers Jochen
1) Deactivated ALL OTHER interrupts?? Maybe some pin is catching interference? 2) Watchdog disabled?
Maybe it is the startup time the atmega168 needs to wakeup. Does anybody know how much it is?
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.