Buggfix Plus
Aktuellt datum och tid: 12.16 2019-05-22

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 47 inlägg ]  Gå till sida Föregående  1, 2, 3, 4  Nästa
Författare Meddelande
InläggPostat: 10.20 2019-05-16 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 362
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: [Expandera/Minimera] [Hämta] (Untitled.txt)

// 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


    }
  }






Upp
 Profil  
 
InläggPostat: 10.32 2019-05-16 

Blev medlem: 21.06 2011-01-29
Inlägg: 833
Du stoppar ju processorn innan du lagt till uppvakningsinterruptet.


Upp
 Profil  
 
InläggPostat: 10.43 2019-05-16 

Blev medlem: 10.02 2009-05-08
Inlägg: 656
Ort: Lund
Precis, dessutom är det

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

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
attachInterrupt(digitalPinToInterrupt(WakeUpPin), WakeUpNow, LOW);


Upp
 Profil  
 
InläggPostat: 13.04 2019-05-16 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 362
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 13.06 2019-05-16, redigerad totalt 3 gånger.

Upp
 Profil  
 
InläggPostat: 13.05 2019-05-16 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 362
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
attachInterrupt(digitalPinToInterrupt(WakeUpPin), WakeUpNow, LOW);



Vad menar du? :shock:


Upp
 Profil  
 
InläggPostat: 13.33 2019-05-16 

Blev medlem: 10.02 2009-05-08
Inlägg: 656
Ort: Lund
Först Mr.Andersson poäng

Du skrev så här:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
attachInterrupt(digitalPinToInterrupt(WakeUpPin), WakeUpNow, LOW);

istället för
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
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.


Upp
 Profil  
 
InläggPostat: 13.35 2019-05-16 

Blev medlem: 11.20 2009-05-26
Inlägg: 5640
Ort: Kristinehamn
Jag länkade till en tutorial som visar exakt för dummies hur du kan göra. Läste du den?


Upp
 Profil  
 
InläggPostat: 13.40 2019-05-16 

Blev medlem: 10.02 2009-05-08
Inlägg: 656
Ort: Lund
Vilken arduino-pinne är det du faktiskt tänker använda för wake-up?

Du skriver
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
int WakeUpPin = 19;           // KNAPP        ---        Väcker maskinen
och senare
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
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).


Upp
 Profil  
 
InläggPostat: 15.29 2019-05-16 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 362
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: [Expandera/Minimera] [Hämta] (Untitled.txt)

// 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


    }
  }






Upp
 Profil  
 
InläggPostat: 15.36 2019-05-16 
Användarvisningsbild

Blev medlem: 16.52 2009-10-20
Inlägg: 118
Ort: Göinge
Det kanske är dags att du lär dig debugga sånt här själv.

I all välmening.


Upp
 Profil  
 
InläggPostat: 16.42 2019-05-16 

Blev medlem: 11.20 2009-05-26
Inlägg: 5640
Ort: Kristinehamn
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.


Upp
 Profil  
 
InläggPostat: 16.22 2019-05-20 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 362
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: [Expandera/Minimera] [Hämta] (Untitled.txt)

// 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


    }
  }











Upp
 Profil  
 
InläggPostat: 16.23 2019-05-20 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 362
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!?


Upp
 Profil  
 
InläggPostat: 16.24 2019-05-20 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23782
Ort: Aabenraa, Danmark
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.


Upp
 Profil  
 
InläggPostat: 20.28 2019-05-20 
Användarvisningsbild

Blev medlem: 03.27 2004-03-14
Inlägg: 488
Ort: Eskilstuna
Håller med Señor Lemuren, lägg in hela sketchen istället för att klippa bitar.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 47 inlägg ]  Gå till sida Föregående  1, 2, 3, 4  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 4 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010