Jag har skrivit ett program för en 16F870. Programmet tar emot ett meddelande på UARTen, kontrollerar meddelandet och räknar ut hur länge den ska ligga i sleep beroende på vad som står i meddelandet. tiden är upp till 2 timmar vilket jag realiserar genom att använda en 32kHz osc till TIMER1. Timeravbrotten väcker µP var 10:e sekund och räknar upp variabeln delay. Allt fungerar bra hit. MEN till problemet:
När delay räknats ned och programmet ska gå ur loopen så väntar den på att ett nytt meddelande tas emot på UARTen men när den gått ur sleep så hinner den bara sätta en utgång hög sen lägger den sig i sleep igen. Det borde enligt mej vara helt omöjligt, men icke! Klipper in Sleep-rutinen och relevanta delar av avbrottsrutinen:
Efter du gått ur avbrottsrutinen kanske du skulle stoppa timern och se till så att alla vilkor inom själva "main" loopen inte kan uppfyllas direkt IGEN efter att den just vaknat från sleep. Är dock inte 100% då jag icke kodar i annat än .ASM
Ja det är skrivet i det konstiga språket C.
Jag nollställer ju flaggorna men jag ska prova att stoppa timern innan jag drar igång den med 8MHz-oscillatorn (Fosc/4) igen..
Den sista gången som avbrottsrutinen körs så hoppar du ur med hjälp av en "return" och den sista raden "TMR1IF = 0;" körs då inte... kan det ha något med saken att göra?
sodjan skrev:Nä, det är ju kanske bra, men löste det problemet ??
Som jag sa: Det verkar fungera nu.
En hårdtest tar flera timmar ioma den ska ligga i sleep och vakna varje jämn timma. Men om jag "fuskar" och skriver t.ex "delay = 3;" innan den går in i while-loopen för sleep så fungerar det. Problemet är bara att det gjorde det IBLAND förut också, det betedde sig som sagt skumt. Men det slutgiltiga svaret kommer i morgon. patience my friend..
För att att göra din testprocedur cirka åtta gånger snabbare så kan du ju låta bli att sätta prescaler=8 för din 32kHz-kristall.
Eller så skalar du ner TIOSEKL/H med faktor x...
Men då behöver jag trimma mitt ur som skickar ut tiden också, för det är hela idén att den ska vakna på just urets jämna timmar, vilket jag sett att den inte gör som den ska. Och mätningen blev apa, logikanalysatorn avbröts efter en halvtimma. Har kanske missat att ställa in att den ska packa mätvärdena. Ska titta på det nu.. Men tackar så mkt för tipsen!