Problem med :Wake from sleep INTERRUPT-ON-CHANGE

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Problem med :Wake from sleep INTERRUPT-ON-CHANGE

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg 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?
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

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

Inlägg av dubbear »

När programmet kommer hit ska processorn läggas i sleep tills man trycker på knappen, vart den ska starta om
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

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

Inlägg 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)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg 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å.
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

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

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Varför ska du göra en reset?
Låt bara koden loopa runt istället.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

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

Inlägg 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?
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

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

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg 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... :-)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg 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.
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

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

Inlägg 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 :)
Skriv svar