Sida 1 av 4

Får inte SleepMode att fungera korrekt - Arduino MEGA

Postat: 12 juni 2018, 16:30:55
av fosfor
Hallå allihop!

Jag har ett program som fungerar bra som jag skulle vilja lägga in en Sleep funktion i. :idea:
Som slår igång när man inte använt apparaten på en stund, men som väcks sen när man trycker på en knapp.
Men när jag gör det, utefter en guide på Arduinos sida och som finns på YouTube, så ballar precis allt ur och inget fungerar.

Jag har en rotaryencoder motor som kan gå fram och tillbaka, räkna pulser och visa allt på en skärm.
Styrs enkelt med knapptryckningar.

Men med denna kod, som jag trippelkollat ska stämma enligt Arduinos guide, så fungerar inget alls.
Skärmen bara lyser, och kortet verkar gå ner i Sleep Mode direkt och inte kunna väckas ur den hur jag än gör.
Har testat massa kombinationer med External Interrupts osv.

En grej jag misstänker är att lite rader som står som void kanske inte ska ligga under void loop? :humm:
(Nybörjare).

Någon som har något förslag? Jag bifogar filen.
Allt fungerar i koden förutom det som står under texten "SLEEP MODE", som står på ett par ställen i koden.

Kortet är en Arduino Mega.

Jag har testat att köra både djupt och icke djupt viloläge.
Under djupt viloläge så indikerar IBLAND serial monitor att den vaknar till, men somnar direkt igen.
Under lätt viloläge så vaknar den till var femte sekund.
Vida båda dessa tillfällen kan man inte göra ett smack med apparaten, den reagerar inte övervhududtaget på knapptryckningar eller så. :|

Jag misstänker att jag helt enkelt bara lagt koden i fel ordning eller så.
Koden går igenom kompilern.

Någon som vet vad det kan vara?
(Förutom nybörjare bakom spakarna)

Mvh F

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

Postat: 12 juni 2018, 17:27:15
av HUGGBÄVERN
Samma projekt som i alla dina trådar om Arduino?!

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

Postat: 13 juni 2018, 10:58:50
av fosfor
Japp :D

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

Postat: 13 juni 2018, 16:31:22
av HUGGBÄVERN
Det blir stökigt att hålla reda på vad du håller på med och ge vettiga råd. :idea:

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

Postat: 18 juni 2018, 16:14:35
av fosfor
Alla tidigare trådar och ämnen är lösta.
Nu är det enbart att försätta prylen i ett bra sleepmode som är på agendan :)

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

Postat: 18 juni 2018, 18:36:28
av jesse
Nu kan inte jag Arduino alls, men som gammal programmerare så reagerar jag på några detaljer när jag söker på "sleep" i koden...

delay(5000); orsakar troligen det mesta av problemen. Du kan inte ha en delay på 5 sek inne i loopen. Du måste istället sätta igång en variabel som räknar upp (eller ner) med bestämda tidsintervall - finns säkert stöd för det i Arduino med nån funktion eller så. ??? När den kommit till 50 eller 500 (beroende på om den räknas upp 10 ggr/sek eller 100 ggr/sek till exempel) så går man in i sleep-mode och nollställer samtidigt räknaren.

Risken är väl att en snurrande räknare/timer (med interrupt) väcker processorn hela tiden. I så fall får man inaktivera timern innan man går in i sleep.

sleepSetup(); // borde inte finnas i loopen - Det borde funka att lägga den före loopen, dvs. i setup().

Men eftersom dessa två funktioner var de enda som fanns i loopen så blir det ju tomt.... någonting annat ska den väl göra än bara sova och vänta?

Eller görs allt i pin-interrupten? Det kanske funkar, men känns inte riktigt bra. Interruptrutiner ska vara så korta som möjligt: Minsta möjliga mängd kod, och helst inga funktionsanrop inuti om man inte måste.

Jag har inte alls kollat koden noga, bara en minut eller så.... Men jag hoppas att något av mina tips kan göra nytta.

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

Postat: 19 juni 2018, 12:37:23
av fosfor
Tack! Ok ska kika.
Misstänkte att Delayet var en stor bov i dramat...

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

Postat: 19 juni 2018, 12:57:32
av hawkan
Du har massor av kod i wakeup-ISR-en pinInterrupt.
Jag tror inte det är meningen. I exempelkoden heter den wakeUpNow och gör just inget.
Du har mååånga rader kod där.
Använd autoformat/indenteringsfunktionen - högerklicka i editor och välj.
Så ser du lättare vilke kod som hör till vilken funktion.

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

Postat: 9 maj 2019, 15:39:43
av fosfor
AVR/sleep.h

Den fungerar inte med Arduino Mega va? :-/

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

Postat: 9 maj 2019, 19:34:12
av ToPNoTCH
Kolla på Narcoleptic library.

Vill minnas att jag kört det med framgång.

https://github.com/brabl2/narcoleptic

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

Postat: 13 maj 2019, 16:53:46
av fosfor
ToPNoTCH: Ok tack! Fungerar den likadant med Arduino MEGA?

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

Postat: 13 maj 2019, 17:18:56
av fosfor
Namnger man interrupt 3 som 3 när man använder attachInterrupt?
Fastän att den sitter på pinne 18 på MEGA kortet?

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

Postat: 13 maj 2019, 18:32:26
av ToPNoTCH
Nää...18 är väl interrupt 5

Kolla här så klarnar det..

https://www.arduino.cc/reference/en/lan ... interrupt/

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

Postat: 13 maj 2019, 19:23:18
av snigelen
Hej,

Jag programmerar en hel del AVR men inte i Arduino-miljö. Men ett fungerande litet test fick jag ihop.

Kod: Markera allt

#include <avr/sleep.h>

const byte interrupt_pin = 2;

void setup()
{
  pinMode(interrupt_pin, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {
  byte i;
  goto_sleep();

  for (i = 0; i < 5; i++)
  {
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
  }

}

void interrupt(void)
{
  detachInterrupt(digitalPinToInterrupt(interrupt_pin));
}

void goto_sleep()
{
  attachInterrupt(digitalPinToInterrupt(interrupt_pin), interrupt, LOW);
  set_sleep_mode(SLEEP_MODE_STANDBY);
  sleep_enable();
  sleep_cpu();
  sleep_disable();
}
Observera att om man skall väcka den med externa interrupt är det bara interrupten på pinne D2 och D3 som kan användas för sleep-modes djupare än idle (och bara på LOW level int)..

Egentligen är det fler på en mega2560, men de andra pinnarna är inte kopplade.

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

Postat: 14 maj 2019, 08:59:51
av fosfor
Snigelen:

Attans...
På pinne D2 och D3, Ext interrupt 5 och 4, så sitter min rotary encoder...
På pinne D20 och D21, Ext interrupt 1 och 0, där sitter min display...

Då blir det till att flytta rotary encoderns intterupt till external int 3 och 2 för att få detta att gå ihop?
Och låta sleep moden ha kontakt med D2 och D3?