Hallo Leute, also ich komm mir grad n bissi doof vor, vor grauer Urzeit hab ich mal den Timer0 in einem AVR genutzt, jetzt wollte ich das gleiche in grün bei meinem neusten Projekt mit einem ATmega128 machen, aber nix tut sich, der Interrupt des Timer0 wird nicht einmal angesprungen, aber warum??? ATmega128 mit 16Mhz Quarz Code: im Hauptprogramm TCCR0 = 0b00000101; // ck/1024 TIMSK = 0x02; cli(); ... in der ISR INTERRUPT (SIG_OVERFLOW0) // ISR Timer0 { iflag++; PORTE = PORTE | 0b00110000; } aber die LED am PortE bleibt auf ewig dunkel - HILFE ...
ja nee is klar ... bevor ein cli(); kommt hab ich auch ein sei(); ... daran liegts also nicht
den Teil wo PORTE zum Ausgang wird hab ich au irgendwie unterschlagen ... aber wenn ich die LED manuel im Hauptprogramm anmachen funktionierts prima. Irgendwas habe ich wohl übersehen ... vielleicht liegts an der Taktquelle des Timers aber da schieb ich ned durch. An den kleinen AVRs liegt automatisch der Systemtakt auch am Prescaler an und alles funktioniert.
> TIMSK = 0x02;
Jetzt nimmst Du Dir mal das Datenblatt zur Hand und schaust nach, was Du
da eigentlich freigegeben hast! (Kleiner Tip: Es ist nicht der
Interrupt, für den Du eine ISR geschrieben hast...)
Warum schreibst Du das nicht mit 1<<BITNAME? Dann passieren solche
Sachen nicht.
BTW: Schaff Dir mal ne aktuelle Version vom Compiler (bzw. der Lib) an.
Ein Interrupt Handler wird mittlerweile mit
1 | ISR(VEKTORNAME_vect) |
2 | {}
|
eingeleitet. In Deinem Fall also
1 | ISR(TIMER0_OVF_vect) |
2 | {}
|
INTERRUPT gabs glaub ich mal vor langer, langer Zeit für unterbrechbare ISRs, bin mir jetzt aber gar nicht mehr sicher...
wenn mir die Abkürzung geläufig gewesen wäre würd ich das doch glatt so machen. Aber mein Code hat bei einem ATtiny26 genau so prima funktioniert. Manchmal versteh ich die Welt wirklich nimmer. Also nochmal ins Datenblatt gucken. 1<<TOIE0, was meiner LED allerdings herzlich egal zu sein scheint ... das wär dann wohl 0x01 gewesen.
Johannes, Du verdienst nen großen Kaffee, mindestens ... weil s geht. Mein Compiler is recht neu und s kommt au schon sehr lange wenn ich es nutze eine Meldung daß interrupt.h obsulite ist, aber bisher hat das alles immer brav funktioniert.
"interrupt.h" ist nicht obsolete, "INTERRUPT" hingegen schon. Für "ISR" muss auch die avr/interrupt.h eingebunden werden, sonst gehts nicht.
Jens wrote: > wenn mir die Abkürzung geläufig gewesen wäre würd ich das doch glatt so > machen. Aber mein Code hat bei einem ATtiny26 genau so prima > funktioniert. Der AVR ist doch kein 8051, wo Externer Interrupt0,1, Timer0,1, UART, P0..P3 auf 1000 Jahre festgeschrieben sind, d.h. auf jedem 8051-Derivat exakt gleich funktionieren. Sobald man das AVR-Derivat wechselt, muß man immer prüfen, ob sich was in den IO-Registern geändert hat. Ich bin grad dabei vom ATtiny26 auf ATtiny261 zu wechseln, weil der ja abgekündigt ist. Ich gehe zu 99% davon aus, daß zumindest das Hex-File nicht mehr läuft. Peter
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.