Forum: Mikrocontroller und Digitale Elektronik ATmega128 timer0 geht nicht


von Jens (Gast)


Lesenswert?

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 ...

von Jens (Gast)


Lesenswert?

ja nee is klar ... bevor ein cli(); kommt hab ich auch ein sei(); ... 
daran liegts also nicht

von Spess53 (Gast)


Lesenswert?

Hi

Wo setzt du PortE als Ausgang?

MfG Spess

von Jens (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

> 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...

von Jens (Gast)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

"interrupt.h" ist nicht obsolete, "INTERRUPT" hingegen schon. Für "ISR" 
muss auch die avr/interrupt.h eingebunden werden, sonst gehts nicht.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.