Sleep mode på en PIC 16F628 - *Fungerar*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
omega
Inlägg: 43
Blev medlem: 6 november 2005, 14:01:19
Ort: Äholm

Sleep mode på en PIC 16F628 - *Fungerar*

Inlägg av omega »

Hallå gott folk!
Jag är ganska ny på programmering av mikroprocessorer.. kan en del grundläggande men har nu kommit till ett litet problem.

Bakgrund:
2 pic 16f628 som kommunicerar trådlöst med RF. Den ena ska sitta i bilen och sända vissa parametrar med några minuters mellanrum, säg varannan minut. Den andra sitter inomhus ca 50m bort.

Problem:
Pic'en+RF kortet drar för mycket ström!! :(
Eftersom pic'en ska vara batteridriven så vill jag att den drar så lite av batteriet som möjligt. Har sett att det finns en sleep funktion som verkar intressant. :humm:

Går det att få Pic'en att vakna av sig själv efter några minuter och starta RF kortet och sensorerna och sända informationen och sedan gå tillbaka till sleep mode?

Jag har Googlat för fullt men utan lycka.
Jag programmerar i asm..
Alla tips är välkomna.. bara de är batterisnåla :wink:
Senast redigerad av omega 2 februari 2006, 22:26:18, redigerad totalt 1 gång.
Användarvisningsbild
Zyxel615
EF Sponsor
Inlägg: 1839
Blev medlem: 9 november 2005, 21:20:43
Ort: Kiruna

Inlägg av Zyxel615 »

Kan man inte väcka den med en timertriggad interrupt? Jag vet inte så noga, kan just ingenting om PIC men det kan kanske vara en ide...

Och en till... en extern timer som slår på strömmen till PIC:en med jämna mellanrum kanske skulle gå men det känns yxigt minst sagt.
Senast redigerad av Zyxel615 29 januari 2006, 18:13:18, redigerad totalt 1 gång.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Det var nån (cyr kanske?) på forumet här har jag för mig som gjorde en variant med en rätt fet konding på en pinne som var satt för interrupt-on-change. Kondingen laddade ur sig på lagom lång tid och genererade då ett interrupt som väckte cpu'n ut sleepläge. När den vaknat så sattes pinnen temporärt som output för att ladda upp kondingen igen.

På så sätt slipper man ha massa timers och annat skit i gång i uC'n som drar extra ström under sleep.

Minns inte om det var Microchip eller Atmel i det fallet, men det borde vara applicerbart på båda.
Användarvisningsbild
Zyxel615
EF Sponsor
Inlägg: 1839
Blev medlem: 9 november 2005, 21:20:43
Ort: Kiruna

Inlägg av Zyxel615 »

Ja det verkar som en mycket smidigare lösning än mina konstiga...
Användarvisningsbild
omega
Inlägg: 43
Blev medlem: 6 november 2005, 14:01:19
Ort: Äholm

Inlägg av omega »

matseng skrev:Det var nån (cyr kanske?) på forumet här har jag för mig som gjorde en variant med en rätt fet konding på en pinne som var satt för interrupt-on-change. Kondingen laddade ur sig på lagom lång tid och genererade då ett interrupt som väckte cpu'n ut sleepläge. När den vaknat så sattes pinnen temporärt som output för att ladda upp kondingen igen.
Jag hade ju hoppats på att det skulla vara möjligt att lösa det med lite hederlig asm kod :) men en koding på int pin låter ju helt acceptabelt.
Bara det går att ladda upp den rimligt snabbt.
Om kondingen laddas upp/ur genom en resistor så tar det väl ungefär lika lång tid att ladda upp kondingen som att ladda ur den?

Något förslag på hur detta skulle kunna lösas smidigt??? :?:
Vill ju helst inte att Pic'en är vaken onödigt länge. Särskillt vintertid då batterinivån sjunker vid låga temperaturer.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Kondingen kan kopplas direkt till pinnen så att den laddar upp sig illa kvickt. Sedan har du en lagom stort ( 1 megg kanske?) motstånd mot jord.

Både Microchip och Atmel har AppNotar med tips om hur man får så strömsnåla applikationer som möjligt. Vissa av cpu'erna är bättre på det än andra, så se till att välj rätt modell och tillverkare.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Först, om du har möjlighet, använd något modernare än 628A (jag utgår
från att det inte är den gamla 628 du använder !?) t.ex F688 eller F88.
De har mycket bättre low-power möjligheter. Du kan välja på att köra
dom i "sleep", eller att bara köra dom väldigt långsamt under en tid.
Den interna oscillatorn kan "växlas" ned från 8 Mhz till som minst 32 Khz
helt programstyrt. SLEEP finns naturligtsvis även, om man vill använda det.

Enklast är en timer som väcker processorn regelbundet.
Det kanske inte går at få så lång tid som flera minuter, men du behöver
ju bara bara räkna ner en räknare och direkt (om räknaren inte
har kommit till 0) gå tillbaka till SLEEP.

Ett annat sätt är att låta WDT väcka processorn. På de senare
modellerna (t.ex F88) kan du sätta en WDT period på upp till ca
270 sekunder, vilket verkar passa din applikation. WDT räknaren
i dessa nyare processorer drar även mindre ström än i (t.ex) F628A.
WDT är nog enklare än en timer, förresten...

F88 har även "two-speed start-up" vilket snabbar upp "väckningen" från
SLEEP om du kör med kristall. Processorn startar på den interna RC
oscillatorn tills huvudoscillatorn har stabiliserats, då den automatiskt
switchar över. Så man kan göra en del som inte är tidskristiskt och
sedan vänta på huvudoscillatorn. Eller så kanske man går tillbaka
till SLEEP innan dess, man har ca 250 instruktioner (1024 Tcyc) på sig...


Men om det sitter i bilen, varför skall det vara batteridrivet ?
Jag utgår från att du menar något annat batteri än det vanliga
bilbatteriet !

Att slå av och på strömmen till hela processorn fungerar också, men det
blir lite extra processerande eftersom du varje gång kör igenom hela
din "init" kod, hur mycket det nu är. När den väcks från SLEEP, är ju allt
redan klart, bara att skicka data.

> Jag har Googlat för fullt men utan lycka.

Onödigt, databladet har alla detaljer... :-)

> en extern timer som slår på strömmen till PIC:en med jämna mellanrum...

Och hur mycket ström drar den ?

> På så sätt slipper man ha massa timers och annat skit

"Skit" ???
Och räcker det inte med *en* timer ?

> Jag hade ju hoppats på att det skulla vara möjligt att lösa det med lite hederlig asm kod

Det är klart att det gör. I alla fall innan du har specat batterityp, driftstid m.m m.m. :-)

> Om kondingen laddas upp/ur genom en resistor så tar det väl ungefär lika lång tid att ladda upp kondingen som att ladda ur den?

Du använder två olika motstånd, ett mindre (från pinnen) för uppladdningen,
ett större (till GND) för urladdningen. Men visst, du måste fortfarande vänta på
uppladdningen innan du lägger den i SLEEP igen. Sen tar ju uppladdningen
också batterikapacitet, vilket måste in i kalkylen.

> Kondingen kan kopplas direkt till pinnen så att den laddar upp sig illa kvickt.

Inte snabbare än vad 25 mA (max strömmen på en pinne) tillåter !
Koppla inte en "fet" konding *direkt* till en I/O pinne.

Se även :
http://ww1.microchip.com/downloads/en/D ... 41200B.pdf
http://ww1.microchip.com/downloads/en/D ... 30620a.pdf
Användarvisningsbild
omega
Inlägg: 43
Blev medlem: 6 november 2005, 14:01:19
Ort: Äholm

Inlägg av omega »

Tack för det utförliga svaret :)
Det är möjligt att jag övergår till F688 eller F88 i nästa projekt jag ger min in på men för tillfället så vill jag fortsätta att utveckla det jag har påbörjat.

En timer som väcker processorn regelbundet.. det låter som en bra idé.. kan tänka mig det eller att det får bli en extern konding som gör jobbet. Som jag sa tidigare så vill jag ju helst kunna göra allt i asm kod.

Går det att väcka 628'an regelbundet ur sleep med en timer?
Kan du (sodjan) eller någon annan hjälpa mig lite på traven med ett programexempel.. kan vara psuedo kod också.
Jag har haft en del problem att förstå timern.. :(

Jag kommer inte att använda bilbatteriet .. det blir några små 1.5v AA batterier så att jag kan ha en portabel enhet.

Driftstiden är ju en viktig faktor.. men jag vill ju att den klarar att köra några dygn.. eller helst några veckor.

Givetvis kommer det dra mer ström ju fler givare jag ansluter utöver RF kortet men det får bli ett senare problem. De kommer iaf stängas ner så snart mätningen är gjord.
Till en början kommer temperatur att övervakas.. sedan skall den bevaka dörrar som ett slags larm.. osv..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Rent allmänt är det bättre att du frågar om sådant som är oklart
i databladet, istället för att bara fråga "rakt ut". Det är svårt att veta
vad du har läst och vad du har förstått/inte förstått...

> Går det att väcka 628'an regelbundet ur sleep med en timer?

Inte mer tmr0.
Med tmr1 under vissa omständigheter (extern klocka).
WDT är nog enklast.
Kapitel 14.8.1, sid 111.
Och kap 14.7 sid 109.

> Jag har haft en del problem att förstå timern..

Det finns tre st. Vad var oklart ?

> kan vara psuedo kod också.

Antag WDT wake-up (ca var 2-3 sek)

- Förbered WDT (config, prescaler m.m. se datablad).
- sleep
- vid wake-up, dags att kolla givare ? Om inte, somna om.

Tja...

> men jag vill ju att den klarar att köra några dygn.. eller helst några veckor.

Du får anpassa storleken på batterierna...
Användarvisningsbild
omega
Inlägg: 43
Blev medlem: 6 november 2005, 14:01:19
Ort: Äholm

Inlägg av omega »

Helt otroligt! Det fungerar ju!!! :D :D

Jag knåpade ihop ett enkelt test program som ställde
option registret så att prescalern låg på en faktor 1:128
vilket tydligen motsvarar ca 2,3 sek (i rumstemperatur?).

Sen lade jag in sleep på lämpligt ställe och testade att
toggla en led på utgången.. och det fungerade på första försöket!! :shock:

Nu är det ju faktiskt ganska enkelt att ha en räknare som räknar antalet intervall den ska gå i sleep.
I mitt fall vill jag att den vilar 2 minuter.. vilket borde bli 52 ggr den går i sleep läge innan den utför "sina sysslor". :humm:

Vilken lättnad att slippa köra med en massa externa komponenter!
Nu återstår att se hur långt batteriet orkar köra.. skulle ju kunna lägga in en batterivakt som varna vid låg batterinivå.. det här kan bli lovande! :wink:

Tack för hjälpen!!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Helt otroligt! Det fungerar ju!!!

Som förväntat... :-)

> vilket tydligen motsvarar ca 2,3 sek (i rumstemperatur?)

WDT timeout-tiden har faktiskt använts som en "termometer"... :-)

> Nu är det ju faktiskt ganska enkelt att ha en räknare som räknar antalet intervall den ska gå i sleep.

Japp, det borde bara bli 10-15 instruktioner innan du kan gå i SLEEP igen.

Trevligt är det i alla fall !!!
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Vill du spara ström så ha inte watchdoggen påslagen. Tittar man på 628'ans basförbrukning med allt avslagent så drar den mer än 400 ggr mer ström när man slår på watchdoggen.

Det är små strömmar det rör sig om, och om du kär med vanliga AA eller AAA-batterier så kanske det är skit samma. Men om du kör från knappceller som har betydligt lägre kapacitet så kanske det kan vara värt att spara in den strömförbrukningen.

Här är från en strömsparnings-faq för 16/17-serien.


1. Run the clock as slow as you can.

2. Disable the watchdog timer

3. Put the part to sleep whenever possible.

4. Use MCLR to wake part from sleep instead of the WDT if possible.

5. Do not let any inputs float.

6. Do not drive any unnecessary loads. Minimize capacitive or inductive
loads on switching I/O pins, or resistive loads on other driven pins. If
a pin is not to be used you can leave it disconnected and drive it low
or high, or put a pull up or down resistor on it as an input.

7. Turn off all timers when not in use. For instance, TMR0 can be incremented from the instruction clock or an external pin. When not in
use, assign it to the pin (if it is toggling at a lower rate than the
instruction clock). Do not use prescalers when unnecessary. In other
words, minimize the amount of logic changing states.

8. Turn off any other peripherals when not in use.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Vill du spara ström så ha inte watchdoggen påslagen.

Jo, men du missar poängen. Allt det du skriver är ju välkänt.

Jag är inte övertygad om att t.ex konding-lösningen blir strömsnålare,
det behöver testas lite. Sen finns det andra kriterier här som t.ex att
"omega" ville ha en enkel lösning med få extra komponenter.

Mitt tips är att välja en modernare och strömsnålare processor, men
det är redan sagt...
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Välkänt av dom "coola och erfarna" som mig och dig ja och andra. Men kanske inte av Omega.... Och det är en djäkla skillnad det. Du får tänka på det Jan, alla är inte på samma erfaranhetsnivå.

Och självklart för oss som känner till tekniken ska man inte bara välja första "bästa" processor, man anpassar det efter applikationen. I det här fallet kanske en "Nanowatt"-enabled processor passar bra mycket bättre.

Men å tredje sidan kanske det är fullständigt skit samma om cpu'n drar i snitt 20 uA eller 1 uA när enheten iallfall ska dra igång en sändare i ett antal sekunder en gång i halvminuten om sändaren drar 50 mA under sändningen. Cpu-förbrukningen är då bara en fis i rymden totalt sett.

(Tilläggas bör (för att undvika klagomål) är att siffrorna här ovan är bara exempelsiffror huggna rakt ur luften utan som som helst verklighetsanknyting och ska ses som ett exemplifierande exempel på vad det skulle kunna vara om det förhöll sig som så i verkligheten. :-)

Edit: Speling Erorz
Användarvisningsbild
omega
Inlägg: 43
Blev medlem: 6 november 2005, 14:01:19
Ort: Äholm

Inlägg av omega »

hmm.. fan va värdelöst. :(
Jag trodde ju att jag hade lyckats knåpa ihop en hyffsat strömsnål funktion med WDT o sleep. :? Synd att jag inte är lika cool som matseng då.. :lol:
Nu vet jag ju inte vad ni räknar som hög strömkonsumption men om jag kikar i databladet för 628A så ligger WDT på ca 1uA förbrukning @2V.
Operating current 120uA @ 2V.. och standby current 100nA!!
Känns som det kvittar om WDT är på i detta läget. :roll:
(Nu kommer jag köra på ca 4,5V så det är ju aningen missvisande).
RF delen kommer att sluka en hel del ström ja.. men då det är extremt korta tidsrutor vi pratar om så känns det som det kvittar även om den skulle dra 100mA i typ 10-15ms.
Eller :?: :?: :?:
Skriv svar