Sida 1 av 1

Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 8 augusti 2014, 16:32:26
av dubbear
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.


Kod: Markera allt

        if (time == 60000) {//60 seconds
            
            INTCONbits.PEIE = 1;     // Enable the Peripheral Interrupts
            INTCONbits.IOCIE = 1;   // Interrupt-on-Change Enable bit
            IOCANbits.IOCAN4 = 1;  // Negativ flank on RA4
            IOCAF = 0b00000000;   // Nollar Flaggor 
            time++;


            SLEEP();
            time++;
#asm ljmp 0x0000
#endasm



        }
Tanken är att detta ska väcka och starta om systemet.
Men inget händer när den somnat och man trycker på knappen.

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 8 augusti 2014, 16:49:50
av sodjan
Vad är det som ska "hända" (med den där koden)?
Eller är det inte all kod?

"asm ljmp 0x0000", varför gör du så och vad vill du ska hända?

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 8 augusti 2014, 19:54:40
av dubbear
När programmet kommer hit ska processorn läggas i sleep tills man trycker på knappen, vart den ska starta om

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 8 augusti 2014, 20:41:39
av exile
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)

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 9 augusti 2014, 11:04:14
av sodjan
> vart den ska starta om

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.

#asm reset

Sen så är det ju frågan om man alls ska göra så.

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 10 augusti 2014, 20:32:54
av dubbear
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

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 10 augusti 2014, 21:33:09
av sodjan
Varför ska du göra en reset?
Låt bara koden loopa runt istället.

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 10 augusti 2014, 22:45:08
av exile
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?

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 11 augusti 2014, 12:49:18
av dubbear
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.

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 11 augusti 2014, 12:51:43
av sodjan
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... :-)

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 11 augusti 2014, 12:54:09
av sodjan
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.

Re: Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Postat: 19 augusti 2014, 18:08:16
av dubbear
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 :)