Sitter med en pic16lf1708 och xc8 och försöker få picen att vakna från sömn men får det inte att funka.
Det sitter en tryckknapp på RA4 dras till jord när man trycker ner den, och den funkar i övriga funktioner den används.
Tror att du gör en tanke miss, man brukar använda en evighets loop och inte "mjukvara reseta" uC även om det kan fungera, problemet är att variablerna brukar noll ställas (om det är en vettig C kompilator) så time++ efter sleep() är onödig efter som du "resetar" uC.
En annan fel källa kan vara att interupt on pin change kräver någon form av klocka och att råkar stänga av den (jag kan inte PIC speciellt bra så jag kan ha fel), har du vanliga extern "interupt" så kan det vara läge och använda den istället då de ofta inte behöver någon klocka (kan ha fel)
Om du nu faktiskt vill att den ska starta om, så räcker det kanske
inte bara att starta programmet från början. Den processor du har
ska ha en RESET instruktion, den är bättre. Den ger en omstart
med initiering av vissa register o.s.v. som efter en power on.
Varför skulle man inte göra en reset?
Applikationen är bara en lampa som ska lysa i en minut varje gång man trycker på knappen. Och sedan sova tills nästa tryck
Visst kan man använda en "reset" men det är ungefär lika snyggt som att använda goto i c.
Ta inte illa upp, tanken är väl riktig men kan skapa problem som man inte har tänkt på.
En tanke som slog mig, om du kör "sleep" från ett interrupt (exempel timer) så är väl den globala interrupt avstängd tills interrupt rutinen är färdig (delvis instruktionen RETFIE har körts) eller att man sätter flagan manuellt?
Jag tar inte illa upp.
Ja tänkte snarare att man undviker massa problem genom att göra reset. typ räknare man glömt nolla o.s.v .
Global interupt behöver inte vara aktiv för att vakna från sleep via interupt.
Ja, man får ju så klart tänka till och göra rätt saker på rätt plats.
Sådant som enbart görs vid power on före loopen och sådan
som ska göras vid varje "wake" i början av (i) loopen. Ingen
raketforskning direkt...
En annan sak...
Om du kör sleep för att spara energi, så kan det vara snabbare
(och dra mindre ström) att ha en loop. Processorn i sig gör lite
extra saker vid en reset. OK, nu så gjorde du ju inte en riktig
reset (bara ett hopp till adress 0000), så i just detta fall
så kanske det inte gör så stor skillnad. Men du kommer i
alla fall att köra igenom uppsättning av portar o.s.v varje
varv så det blir inte helt optimalt.
Har gjort om lite.
Gör nu inte reset längre utan kör bara om vissa rutiner.
Problemet med sleep var inte att den inte vaknade upp utan att jag hade missat att nolla interuptflaggan så den fastnade i en loop.
Så kan de vara