Får inte SleepMode att fungera korrekt - Arduino MEGA

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av fosfor »

Hej!

Jag blir väldigt förvirrad av det här med interrupts och deras adresser...
Känns som att det Lär vara det som ställer till det nu.
Jag har använt guiden i länken nedanför.
Och det verkar som att jag kan försätta Arduinon i Sleep Mode.
Men däremot inte väcka upp den ifrån det.
Jag har testat att byta HIGH till LOW här och där utan resultat, koden nedan är den som fungerar "bäst" hittils.

En knapp kan få Arduinon att somna.
Men det händer inget när jag trycker den som ska vara Wake Up. Den har ett fysiskt pullup motstånd till knappen, och
knappen är bekräftad fungera. Men den kan inte väcka upp via interrupt.

SLEEP är inkopplat till pinne 18 på Arduino MEGA (digitalpin 18/ext int 3) på Arduino MEGA.
WAKE UP är inkopplad till pinne 19 (digitalpin 19/ext int 2) på Arduino MEGA.
Är det verkligen siffran 2 man ska skriva in i attach interrupt då? Hmm.. :shock:

Jag är totalt förvirrad just nu, är det något uppenbart som ni kan se här?


Kod: Markera allt


// SLEEP MODE MALL https://arduino.stackexchange.com/questions/23555/pir-sensor-and-sleep-interrupt-on-mega2560

// SLEEP MODE biblioteket här
#include <avr/sleep.h>

int WakeUpPin = 19;           // KNAPP        ---        Väcker maskinen
int GoToSleepPin = 18;        // KNAPP        ---        Knapp som försätter MEGA i SLEEP MODE - Ext Int 3

// SLEEP MODE
void wakeUpNow() {  
}  


  pinMode(WakeUpPin, INPUT);              //Declarar denna som input     MEGA's  input är 19        Knapp       -        VÄCKER
  pinMode(GoToSleepPin, INPUT);          //Declarar denna som input     MEGA's  input är 18        Knapp       -        Sparar pos och försätter i SLEEP MODE


// SLEEP MODE lägger till denna
{  
  //  pinMode(WakeUpPin, INPUT_PULLUP);       // originaltext
  //  attachInterrupt(2, wakeUpNow, LOW);     // originaltext - use interrupt 0 (pin 2) and run function wakeUpNow when pin 2 gets LOW  
  
  pinMode(WakeUpPin, INPUT_PULLUP);            
  attachInterrupt(2, wakeUpNow, HIGH);         // Om denna står på LOW så blir displayen tom - Fel interrupt??
}  


}

// SLEEP MODE - SleepNow måste declareras, raden nedan gör detta, annars blir det 'sleepNow' was not declared in this scope
void sleepNow() {  
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);        // sleep mode is set here  
    sleep_enable();                             // enables the sleep bit in the mcucr register 
    sleep_mode();                               // here the device is actually put to sleep!!  
    
attachInterrupt(2, wakeUpNow, HIGH);             // use interrupt 0 (pin 2) and run function 
     
    
    // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP  
    sleep_disable();                            // first thing after waking from sleep: disable sleep...  
    detachInterrupt(2);                         // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.  
}


  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // -------- Denna ska väcka upp Arduinon från SLEEP MODE --------

  {
    val = digitalRead(WakeUpPin);              // Knapp som sparar position
    if (val == HIGH) {                         // Kollar om knappen är tryckt

// HÄR NEDANFÖR SKA KOD FÖR UPPVÄCKNING LIGGA

 //   wakeUpNow();  
    sleep_disable();                            // first thing after waking from sleep: disable sleep...  
    detachInterrupt(2);                         // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.  

      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("ARISE!");
      Serial.println("Waking up the machine");
      delay(750);
    }
  }




  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // -------- SPARAR POSITION OCH FÖRSÄTTER MEGA I SLEEP MODE --------

  {
    val = digitalRead(GoToSleepPin);           // Knapp som sparar position och går in i SLEEP MODE
    if (val == HIGH) {                         // Kollar om knappen är tryckt
      UserStopPulseCount4 = PulseCount;
      EEPROM.put(24, UserStopPulseCount4);     // Skriver PulseCount numret till minnet, adressen är 24
      EEPROM.put(28, UserStopPulseCount4 + 1); //
      lcd.setCursor(0, 1);                     // Dessa två rader skriver till LCD, 0, 1 ärrad 2 och 1, 0 vore rad 1
      lcd.print(PulseCount);
      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("OffOn SLEEP");
      Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
      delay(750);
      lcd.clear();                              // Tömmer skärmen
      lcd.setCursor(1, 0);                      // Visar Goodbye... på första raden av LCD
      lcd.print("Goodbye...");                  // Sista meddelandet innan den stänger ner
      delay(750);                               // Väntar lite
      lcd.clear();                              // Tömmer skärmen

// SOV FUNKTION HÄRUNDER

    sleepNow();                                 // Aktiverar SLEEP MODE - Kommer behöva interrupt wake up för att vakna från detta


    }
  }




Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av Mr Andersson »

Du stoppar ju processorn innan du lagt till uppvakningsinterruptet.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av snigelen »

Precis, dessutom är det

Arduino pinne 19, arduino interrupt INT.4. Men interruptnummret behöver du inte bry dig om om du skriver

Kod: Markera allt

attachInterrupt(digitalPinToInterrupt(WakeUpPin), WakeUpNow, LOW);
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av fosfor »

Mr Andersson skrev:Du stoppar ju processorn innan du lagt till uppvakningsinterruptet.
Vart då!? :humm:
Processorn är väl stoppad helt i vilket fall om den är i sleep mode?
Och den stoppas bara när jag tryckt på knappen.
Senast redigerad av fosfor 16 maj 2019, 14:06:11, redigerad totalt 3 gånger.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av fosfor »

snigelen skrev:Precis, dessutom är det

Arduino pinne 19, arduino interrupt INT.4. Men interruptnummret behöver du inte bry dig om om du skriver

Kod: Markera allt

attachInterrupt(digitalPinToInterrupt(WakeUpPin), WakeUpNow, LOW);

Vad menar du? :shock:
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av snigelen »

Först Mr.Andersson poäng

Du skrev så här:

Kod: Markera allt

void sleepNow() { 
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);        // sleep mode is set here 
    sleep_enable();                             // enables the sleep bit in the mcucr register
    sleep_mode();                               // here the device is actually put to sleep!! 
   
attachInterrupt(2, wakeUpNow, HIGH);             // use interrupt 0 (pin 2) and run function


Men då aktiverar du ju avbrottet efter du gått i sleep, då kan den ju inte vakna. Gör t.ex detta istället:

Kod: Markera allt

void sleepNow() { 
    attachInterrupt(2, wakeUpNow, LOW);             // use interrupt 0 (pin 2) and run function

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);        // sleep mode is set here 
    sleep_enable();                             // enables the sleep bit in the mcucr register
    sleep_mode();                               // here the device is actually put to sleep!! 
(där jag bytte HIGH till LOW efterom HIGH inte existerar på AVR. Står t.om. i Arduinos dokumentation)

Min kommentar var att om du, som rekomenderas i Arduinos dokumentation, skriver

Kod: Markera allt

attachInterrupt(digitalPinToInterrupt(WakeUpPin), WakeUpNow, LOW);
istället för

Kod: Markera allt

attachInterrupt(2, wakeUpNow, LOW);
så behöver du inte hålla reda på vilket nummer Arduino råkar ha gett avbrottet associerat med arduino-pinne WakeUpPin. I ditt fall är ju dessutom Arduinos avbrottsnummer 4, så skriver du 2 lär det inte funka.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av SeniorLemuren »

Jag länkade till en tutorial som visar exakt för dummies hur du kan göra. Läste du den?
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av snigelen »

Vilken arduino-pinne är det du faktiskt tänker använda för wake-up?

Du skriver

Kod: Markera allt

int WakeUpPin = 19;           // KNAPP        ---        Väcker maskinen
och senare

Kod: Markera allt

attachInterrupt(2, wakeUpNow, HIGH);             // use interrupt 0 (pin 2) and run function
där du snackar om pinne 2. Det går inte ihop. (dessutom körs inte funktionen som du påstår i kommentaren, den körs när avbrottet triggas).
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av fosfor »

Ojojoj...
Nu har jag iaf gjort lite ändringar här då..
Nu är problemet att den startar dött, inget händer, men trycker jag på Vakna Upp knappen
så vaknar displayen och visar lite text som den ska, men sen kan man inte göra nåt mer.
Den låser :cry:




Kod: Markera allt


// SLEEP MODE biblioteket här
#include <avr/sleep.h>

int WakeUpPin = 19;           // KNAPP        ---        Väcker maskinen
int GoToSleepPin = 18;        // KNAPP        ---        Knapp som försätter MEGA i SLEEP MODE - Ext Int 3

// SLEEP MODE
void wakeUpNow() {  
}  


// Dessa ligger efter void setup
  pinMode(WakeUpPin, INPUT);             //Declarar denna som input     MEGA's  input är 19        Knapp       -        VÄCKER
  pinMode(GoToSleepPin, INPUT);          //Declarar denna som input     MEGA's  input är 18        Knapp       -        Sparar pos och försätter i SLEEP MODE





// SLEEP MODE lägger till denna
{  
  pinMode(WakeUpPin, INPUT_PULLUP);       
  attachInterrupt(digitalPinToInterrupt(WakeUpPin), wakeUpNow, LOW);
}  



}




// SLEEP MODE - SleepNow måste declareras, raden nedan gör detta, annars blir det 'sleepNow' was not declared in this scope

void sleepNow() { 
    attachInterrupt(19, wakeUpNow, LOW);         // NY rek. kod - use interrupt ? (pin ?) and run function

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);        // sleep mode is set here 
    sleep_enable();                             // enables the sleep bit in the mcucr register
    sleep_mode();                               // here the device is actually put to sleep!! 

    
attachInterrupt(19, wakeUpNow, HIGH);             // use interrupt ? (pin ?) and run function 
     
    // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP  
    sleep_disable();                            // first thing after waking from sleep: disable sleep...  
    detachInterrupt(19);                         // disables interrupt ? on pin ? so the wakeUpNow code will not be executed during normal running time.  
}





  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // -------- Denna ska väcka upp Arduinon från SLEEP MODE --------

  {
    val = digitalRead(WakeUpPin);              // Knapp som sparar position
    if (val == HIGH) {                         // Kollar om knappen är tryckt

// HÄR NEDANFÖR SKA KOD FÖR UPPVÄCKNING LIGGA

 //   wakeUpNow();  
    sleep_disable();                            // first thing after waking from sleep: disable sleep...  
    detachInterrupt(19);                         // disables interrupt ? on pin ? so the wakeUpNow code will not be executed during normal running time.  

      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("ARISE!");
      Serial.println("Waking up the machine");
      delay(750);
    }
  }



 // ------------------------------------------------------------------------------------------------------------------------******************************************
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // -------- SPARAR POSITION OCH FÖRSÄTTER MEGA I SLEEP MODE --------

  {
    val = digitalRead(GoToSleepPin);           // Knapp som sparar position och går in i SLEEP MODE
    if (val == HIGH) {                         // Kollar om knappen är tryckt
      UserStopPulseCount4 = PulseCount;
      EEPROM.put(24, UserStopPulseCount4);     // Skriver PulseCount numret till minnet, adressen är 24
      EEPROM.put(28, UserStopPulseCount4 + 1); //
      lcd.setCursor(0, 1);                     // Dessa två rader skriver till LCD, 0, 1 ärrad 2 och 1, 0 vore rad 1
      lcd.print(PulseCount);
      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("OffOn SLEEP");
      Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
      delay(750);
      lcd.clear();                              // Tömmer skärmen
      lcd.setCursor(1, 0);                      // Visar Goodbye... på första raden av LCD
      lcd.print("Goodbye...");                  // Sista meddelandet innan den stänger ner
      delay(750);                               // Väntar lite
      lcd.clear();                              // Tömmer skärmen

// SOV FUNKTION HÄRUNDER

    sleepNow();                                 // Aktiverar SLEEP MODE - Kommer behöva interrupt wake up för att vakna från detta


    }
  }




Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av ffredrik »

Det kanske är dags att du lär dig debugga sånt här själv.

I all välmening.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av SeniorLemuren »

Rörigt värre det där. Jag ser inte vad du gör i "void loop()" Det är ju där programmet fortsätter när du gjort vakeup. Bättre du lägger in hela programmet och inte bara bitar för att man skall se vad du gör.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av fosfor »

Hoy!

Framsteg har efter mycket trial and error, gråt, magsår och slit till slut gjorts! :bravo: :D

Nu fungerar det som tänkt med skillnad från EN sak.
Jag kan nu alltså trycka på en knapp som sätter den i Sleep Mode.
Jag kan nu trycka på en annan knapp som väcker den, och den vaknar precis i det läget jag vill ha den.

MEN jag måste ha tryckt på WakeUp knappen en gång först/innan jag trycker på Sleep knappen. Annars fungerar inte WakeUp knappen.
Det räcker att jag trycker den en enda gång, så fungerar den alltid framöver. Tills jag resettat Arduinon, då måste jag trycka på den en gång igen.
:shock: :shock:
SKUMT!?!

Några förslag?
Kod nedan.


Kod: Markera allt


// Testar lägga till olika energispar LBR's SLEEP MODE här
#include <avr/sleep.h>

int WakeUpPin = 19;           // KNAPP        ---        Väcker maskinen
int GoToSleepPin = 18;        // KNAPP        ---        Knapp som försätter MEGA i SLEEP MODE - Ext Int 3


// SLEEP MODE - Ligger under alla int's - Om tas bort blir det 'wakeUpNow' was not declared in this scope
void wakeUpNow() {  
 }  

// Ligger i Void Setupen
  pinMode(WakeUpPin, INPUT);                //Declarar denna som input     MEGA's  input är 19        Knapp       -        VÄCKER
  pinMode(GoToSleepPin, INPUT);          //Declarar denna som input     MEGA's  input är 18        Knapp       -        Sparar pos och försätter i SLEEP MODE

// ---- Ligger under Void Setup
// ---- SleepNow måste declareras, raden nedan gör detta, annars blir det 'sleepNow' was not declared in this scope
void sleepNow() {  
    attachInterrupt(19, wakeUpNow, LOW);           // NY rek. kod - use interrupt ? (pin ?) and run function
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);               // sleep mode is set here  
    sleep_enable();                                    // enables the sleep bit in the mcucr register  
    sleep_mode();                                      // here the device is actually put to sleep!!  
    attachInterrupt(19, wakeUpNow, HIGH);        // NY rek. kod - use interrupt ? (pin ?) and run function
    
    // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP  
    sleep_disable();         // first thing after waking from sleep: disable sleep...  
    detachInterrupt(19);      // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.  
}



  // Ligger i Void Loop
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // -------- Denna VÄCKER Arduinon från SLEEP MODE -------- PROBLEM = Väcker bara Arduino om WakeUp knappen tryckts en gång innan man sätter den i Sleep Mode (konstigt)

  {
    val = digitalRead(WakeUpPin);              // Knapp som väcker Arduino från Sleep Mode
    if (val == HIGH) {                         // Kollar om knappen är tryckt

// HÄR NEDANFÖR SKA KOD FÖR UPPVÄCKNING LIGGA

  // SLEEP MODE lägger till denna - Finns inte i gamla mallen
   pinMode(WakeUpPin, INPUT_PULLUP);       
   attachInterrupt(digitalPinToInterrupt(WakeUpPin), wakeUpNow, HIGH);
   
//    wakeUpNow();                                 // Väcker - Verkar inte behövas med raderna ovan i bruk
//    sleep_disable();                             // first thing after waking from sleep: disable sleep...  - Verkar inte behövas med raderna ovan i bruk
    detachInterrupt(19);                         // disables interrupt ? on pin ? so the wakeUpNow code will not be executed during normal running time.  

      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("ARISE!");
      Serial.println("Waking up the machine");
      delay(750);
    }
  }




  // Ligger i Void Loop
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // ------------------------------------------------------------------------------------------------------------------------******************************************
  // -------- SPARAR POSITION OCH FÖRSÄTTER MEGA I SLEEP MODE --------

  {
    val = digitalRead(GoToSleepPin);           // Knapp som sparar position och går in i SLEEP MODE
    if (val == HIGH) {                         // Kollar om knappen är tryckt
      UserStopPulseCount4 = PulseCount;
      EEPROM.put(24, UserStopPulseCount4);     // Skriver PulseCount numret till minnet, adressen är 24
      EEPROM.put(28, UserStopPulseCount4 + 1); //
      lcd.setCursor(0, 1);                     // Dessa två rader skriver till LCD, 0, 1 ärrad 2 och 1, 0 vore rad 1
      lcd.print(PulseCount);
      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("OffOn SLEEP");
      Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
      delay(750);
      lcd.clear();                              // Tömmer skärmen
      lcd.setCursor(1, 0);                      // Visar Goodbye... på första raden av LCD
      lcd.print("Goodbye...");                  // Sista meddelandet innan den stänger ner
      delay(750);                               // Väntar lite
      lcd.clear();                              // Tömmer skärmen

// SOV FUNKTION HÄRUNDER

    sleepNow();                                 // Aktiverar SLEEP MODE - Kommer behöva interrupt wake up för att vakna från detta


    }
  }









Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av fosfor »

SeniorLemuren skrev:Rörigt värre det där. Jag ser inte vad du gör i "void loop()" Det är ju där programmet fortsätter när du gjort vakeup. Bättre du lägger in hela programmet och inte bara bitar för att man skall se vad du gör.
Kan man alltså placera en knappfunktion utanför Void Loop!?
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av Icecap »

Tja - den kan ju inte vakna om den inte har blivit sövd. Alltså måste du kolla knappen och gå i det läge som behövs om den påverkas.
Användarvisningsbild
papabear
Inlägg: 821
Blev medlem: 14 mars 2004, 03:27:12
Ort: Eskilstuna
Kontakt:

Re: Får inte SleepMode att fungera korrekt - Arduino MEGA

Inlägg av papabear »

Håller med Señor Lemuren, lägg in hela sketchen istället för att klippa bitar.
Skriv svar