Sleep/wake up PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
magnuscj
Inlägg: 11
Blev medlem: 14 december 2010, 17:08:48

Sleep/wake up PIC

Inlägg av magnuscj »

Jag vill att min P16F690 skall sova ett antal sekunder för att sedan vakna av sig själv. Jag skriver i C (mikroC) men kan grunderna i ASM. Jag har sökt i forumet och läst databladet och snarlika inlägg finns. Jag har naturligtvis en del kvar att läsa och förstå, men tänkte se om forumets erfarenheter kan snabba upp processen.

Jag är ute efter en kodsnutt i C som:

- sätter rätt register/bitar
- sparar undan data (om det är nödvändigt)
- försätter PIC:en i sömn
- väcks av sig själv (Watchdog)

Mitt projektet skall räkna de pulser som en elmätare ger ifrån sig via sin diod. Pulserna kommer inte så ofta utan att PIC:en kan få sova lite för att spara på batteriet. Vid jämna mellanrum skickas antalet pulser till datorn via Xbee moduler. Allt fungerar men drar på tok för mycket effekt. Batteriet får även ganska mycket stryk vid -20 C.

Tack på förhand
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Sleep/wake up PIC

Inlägg av Icecap »

Jag vill påstå att det knappast är PIC'en som behöver sättas i väntläge, det är resten! Koppla till ett 32kHz kristall som main-klocka och den är redan där mycket låg i strömförbrukning fastän den kör "full patte".

Stäng av Xbee helt, DÄR sparar du mycket.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sleep/wake up PIC

Inlägg av sodjan »

Vad mer exakt är problemet ?
Du har beskrivit vad du vill göra och jag ser inte
att det är något problem med det.
Vad är det som inte fungerar ?
Har du testat någonting alls först ?

> - sätter rätt register/bitar

För att göra vadå ?
När det gäller WDT och sleep så bör/ska det framgå av databladet.
Gäller det något annat ?

> - sparar undan data (om det är nödvändigt)

Oklart vad du menar. Så vitt jag vet så behålls "hållspänning"
på RAM minne o.s.v, så inget data ska tappas under sleep.

> - försätter PIC:en i sömn

Något speciellt utöver vad databladet säger ?
D.v.s att köra en SLEEP instruktion ?

> - väcks av sig själv (Watchdog)

Samma sak här. Är det något speciellt du funderar på ?
Utöver det som databladet säger ? Eller är det något
oklart i databladet ? Med max prescaler på WDT så bör du få
någonstans kring ca 2 sek intervall.

Så, så länge du inte är konkret om vad det är du har problem
med, så går det bara att hänvisa till databladet. Det ska vara
tillräckligt för att få igång det.
magnuscj
Inlägg: 11
Blev medlem: 14 december 2010, 17:08:48

Re: Sleep/wake up PIC

Inlägg av magnuscj »

> - Vad mer exakt är problemet ?
Problemet är exakt att kunskap fattas om hur man försätter PICen i sleep och sedan väcker den igen utan att data går förlorad. Jag frågade i forumet parallelt för att jag hoppades få ledning.

> - När det gäller WDT och sleep så bör/ska det framgå av databladet. Gäller det något annat ?
Rätt, det gäller just det. Jag är övertygad om att det framgår av databladet. Dessvärre är dessa inte alltid skrivna för någon med ringa erfarenhet av datablad.

> - Oklart vad du menar. Så vitt jag vet så behålls "hållspänning" på RAM minne o.s.v, så inget data ska tappas under sleep.
Bra det var det jag undrade.

> - försätter PIC:en i sömn
Något speciellt utöver vad databladet säger ? D.v.s att köra en SLEEP instruktion ?

Nej, jag tog med det i pseudokoden för att det skulle bli komplett. Jag beskrev inte vad jag provat och inte provat. Sleep har jag provat. PIC:en somnar så fint men vaknar naturligtvis inte igen.

> - väcks av sig själv (Watchdog)
Samma sak här. Är det något speciellt du funderar på ?
Utöver det som databladet säger ? Eller är det något
oklart i databladet ? Med max prescaler på WDT så bör du få
någonstans kring ca 2 sek intervall.

Jag har inte koll på prescale eller hur man får WDT att väcka PIC:en igen. Jag har stött på WDT, prescale, interuptvektorer osv men ännu inte lyckatd foga ihop det. Det är inte ovanligt att kodsnuttar hälper mer än tusen ord. Det är inte ovanligt i andra sammanhang. Möjligen förvirrade dock min kravbild mer än beskrev det önskade beteendet.

Tack för att ni tar er tid. Uppskattas.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Sleep/wake up PIC

Inlägg av Icecap »

Jag skulle tipsa om att du ställer upp kravspec. först.

Att börja prata om att sätta PIC'en i SLEEP och sedan hålla fat i XBee är två ganska motsägelsesfulla saker. Vill du ha maximalt med batteritid bör du gå en annan väg: logga i PIC'en i kanske 10 minuter och under tiden ha stängt av XBee'n helt! Sedan låter du XBee'n gå på, skickar data och kör om igen.

Men SLEEP kan väl ställas till att vakna på lite olika sätt om jag inte minns fel (har aldrig använd SLEEP). En interrupt eller WDT som går ut.

Enkelt är det iaf: Starta allting och sätt allt i korrekt läge. När det sedan är dags att låta den sova ska WDT aktiveras varefter SLEEP utförs.

När WDT sedan går på time-out resettas kretsen och allting startar om igen, då kan det vara en bra idé att låta programmet avkänna om det är en WDT-reset eller inte.
ie
EF Sponsor
Inlägg: 1375
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Sleep/wake up PIC

Inlägg av ie »

Pulsen från elmätaren borde kunna generera en interupt som väcker CPU'n. CPU'n vaknar och loggar händelsen och med lämpliga intervall väcker Zigbee'n och sänder datat. Snålare än så blir det knappt.

Kan inte PIC men på AVR kan externa signaler på valfri pinne generera interupt och jag skulle vara förvånad om inte det gäller PIC också.
magnuscj
Inlägg: 11
Blev medlem: 14 december 2010, 17:08:48

Re: Sleep/wake up PIC

Inlägg av magnuscj »

Ie
Det var inte en dum ide. Tål att undersökas!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sleep/wake up PIC

Inlägg av sodjan »

Icecap> När WDT sedan går på time-out resettas kretsen och allting startar om igen...

Nja, databladet är inte helt tydligt på just denna punkt. När det gäller
"wake by WDT" så står det "...are considered a continuation of program execution."

Jag tolkar det som att koden fortsätter efter SLEEP instruktionen även då den
väcks av WDT. Om processorn *inte* är i SLEEP så sker dock en WDT-reset.
Väckning genom WDT timeout jämställs med väckning via interrupt.

Som sagt, lite oklart är det i alla fall.

Sen så är det ju helt korrekt att man måste titta på *hela* lösningen
inklusive radio-interfacet om det är batteritid man jagar.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Sleep/wake up PIC

Inlägg av Icecap »

OK, jag har aldrig kollat detta så noga.

Men jag kan bara hålla med: HELA kretsloppet ska kollas, boven i dramat kan mycket väl vara t.ex. spänningsregulatorn (om det t.ex. är en 7805 som ju drar en del egenström).

Jag tror att vinsten med att sätta PIC'en i SLEEP är den minste för "mest besvär", XBee är nog stora boven i detta men som sodjan skriver: det är HELA kretsloppet som ska optimeras.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46965
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Sleep/wake up PIC

Inlägg av TomasL »

Jag har uppfattat det så att vid en WDT-Timeout, så blir det i närmaste en total reset, och koden startas om från början, med stor risk för att RAM är korrupt.
Att kunna detektera en WDT-reset, är väl närmast av betydelse för att få reda på varför programmet startat om, ungefär.
Personligen skulle jag inte använda WDT för att skapa ett wake-up event.
Såsom, var det IE, som skrev ett externt interrupt är den bästa vägen att gå.
Det finns en hel del portar mm att välja på för just detta.

Vill minnas att man även kan få nån av räknarna att fungera som trigger, dvs mata räknaren från elmätaren, när man sedan får ett overflow, genereras ett interrupt, vilket om jag minns rätt kan skapa ett wake-up event.

Dock får du studera databladet för processorn ifråga betydligt närmare.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sleep/wake up PIC

Inlägg av sodjan »

> och koden startas om från början, med stor risk för att RAM är korrupt.

Nej nej nej !
Bara för att programräknaren startar om från "noll" igen betyder inte alls
att någonting blir "korrupt" ! Tvärtom är det så att det *garanteras* att inget
är korrupt så länge som matningsspänningen inte har gått under min-gränsen.

Det är ingen större skillnad mot att exekvera en RESET instruktion (inte på
en 16F690, men t.ex på de nya 16F1xxx modellerna som har den). Eller
att köra en GOTO h'0000'...

> Personligen skulle jag inte använda WDT för att skapa ett wake-up event.

Det är helt OK och ska fungera "as dokumented". Vad som var lite oklart var
om processorn faktiskt "börjar från början" eller bara fortsätter efter SLEEP
instruktionen, det var inte helt tydligt på den punkten. Sen så kanske inte
WDT i alla fall "känns" som rätt metod.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46965
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Sleep/wake up PIC

Inlägg av TomasL »

Kan så vara, men en inget helt ovanlig sak är att, många utvecklingssystem genererar start-up kod vilka raderar internt RAM, och då är det liksom kört.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sleep/wake up PIC

Inlägg av sodjan »

Kanske det, men det är en lite annan sak.
Jag tror inte att det fanns sådana verktyg med i bilden.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46965
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Sleep/wake up PIC

Inlägg av TomasL »

Visst är det kanske en annan sak, typ.
Men WDT är ju främst avsedd att få processorn att återkomma efter ett programfel, och personligen tycker jag inte man skall använda den till nått annat än just återhämtning efter programfel (eller andra liknande fel som kan få processorn att hänga sig)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Sleep/wake up PIC

Inlägg av sodjan »

Håller med, därför "känns" det inte som rätt metod i detta fall.
Skriv svar