Kann mir jemand helfen und erklären, wieso ein 2313 keinen Interrupt auslöst wenn ich den folgenden Code ausführe? Der Tiny soll im sleep-Modus bleiben bis er vom Timer0 ca. alle 10ms geweckt wird, etwas ausgeben, einlesen, berechnen (für den nächsten Durchgang) und dann wieder schlafen. Im gepunkteten Teil wird an Timer- und Interrupt-Registern nichts geändert, nur PIN/PORT[ABD]. Ähnlichen Code habe ich auf einem mega8 laufen, mit dem Unterschied, dass dort Timer2 verwendet wird. .include "tn2313def.inc" .cseg .org 0x0000 rjmp Init .org OC0Aaddr ; wecken rjmp TIMER0_COMP_vect Init: ldi temp1, low(RAMEND) ; Set stackptr to ram end out SPL, temp1 ldi temp1, (1<<OCIE0A) out TIMSK, temp1 ldi temp1, (1<<WGM01) ; CTC-Mode out TCCR0A, temp1 ldi temp1, (1<<CS02) | (1<<CS00) ; /1024 (CS02|CS00) out TCCR0B, temp1 ldi temp1, 0x4e ; toggle alle 10ms @ 8MHz =~ 80000 / 1024 (Prescaler) out OCR0A, temp1 ldi temp1, (1<<SE) ; Sleep-Mode out MCUCR, temp1 sei Loop: sleep ... ... ... ... rjmp Loop TIMER0_COMP_vect: reti
Woran erkennt du denn, dass es nicht funktioniert? Clock-Fuses (ab Werk 1MHz)?
Der Timer kann den Controller nicht aufwecken, das geht nur per Hardware (INT0, INT1 etc). Das geht nur mit einem Echtzeit-Controller, ATtiny88 und ähnlichen. Grüße, Peter
Peter Roth wrote:
> Der Timer kann den Controller nicht aufwecken
Im idle mode kann er, nur in power down oder standby nicht.
Und hier ist soweit erkennbar der idle mode aktiv.
Hi Datenblatt: 'Only an External Reset, a Watchdog Reset, a Brown-out Reset, USI start condition interrupt, an external level interrupt on INT0, or a pin change interrupt can wake up the MCU. MfG Spess
Andreas Kaiser wrote: > > Im idle mode kann er, nur in power down oder standby nicht. > Und hier ist soweit erkennbar der idle mode aktiv. Stimmt: der I/O - Clock bleibt im Idle-Mode aktiv. Dann steckt der Fehler wahrscheinlich in den ausgeblendeten Programmteilen, denn die Initialisierung scheint zu stimmen. Grüße, Peter
Danke für die Hilfe. Tja, es war wohl tatsächlich der versteckte Code. Aber da der eigentlich ziemlich einfach war und mit dem Timern/Interrupts nichts zu hatte, habe ich dort nicht genau genug geschaut und wohl etwas übersehen. Ich habe zuerst ohne "sleep" weitergemacht (wonach komischerweise alles funktioniert hat). Jetzt habe ich es wieder eingefügt, und es funktioniert trotzdem noch. Mein Denkfehler war, dass der erste Befehl nach dem Interrupt der Befehl nach sleep ist, weil von den Takten her immer genug Zeit gewesen wäre um dort zu landen, bevor der nächste Interrupt kommt. Deswegen waren auch meine Debug-Signale dort. Bringt aber natürlich alles nichts, wenn er irgendwo mitten im Code in einer Schleife hängen bleibt und gar nicht mehr zum "sleep" kommt. Aber gut, dass auch andere was gelernt haben ;-) "Idle mode enables the MCU to wake up from external triggered interrupts as well as internal ones like the Timer Overflow."
Um rauszukriegen ob ein Interrupt da war, packt man ein bischen Debug-Code (LED toggle oder so) in den Interrupt selber.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.