Forum: Mikrocontroller und Digitale Elektronik Atmega von Timer0 überfordert?


von Kim (Gast)


Lesenswert?

Hallo zusammen,

bei einem Testaufbau möchte ich unter anderem eine LED per PWM dimmen. 
Dazu verwende ich den Timer0 eines ATmega32 als "aufundab-Zähler" mit 
folgenden Einstellungen:

//     TCCR0 |= (1<<WGM00);
//     TCCR0 |= (1<<COM01) | (1<<COM00);
//     TCCR0 |= (1<<CS01) ;
//     TIMSK |= (1<<OCIE0);
//     OCR0 = 150;

Da die LED nach programmierung des AVR auch wirklich schwächer leuchtet, 
gehe ich davon aus, dass das PWM-Signal auch richtig erzeugt wird.
Nun möchte ich über einen Taster die LED "faden".
Dazu schreibe ich:

if(taster()){
  OCR0 = OCR0-10;
  }

Doch ab hier passiert nichts mehr! Es scheint, dass der AVR durch die 
Erzeugung des PWM Signals so überfordert ist, dass er nicht mehr die 
Funktion taster() abarbeiten kann.

Der Testaufbau beinhaltet noch weitere Elemente, wie unter anderem ein 
LCD display, welches immer wieder eine Variable anzeigt. Vor der 
Aktivierung des Timer0 funktionierte dieses, wie auch der Taster, 
einwandfrei. Nun zeigt auch das Display nur ein leichtes flackern. 
Abhilfe schafft ein höherer Prescaler. Dieser führt jedoch dazu, dass 
die LED nicht mehr gedimmt ist, sondern flackert bis blinkt!

Da ich mir nicht vorstellen kann, das ein Timer (noch dazu ohne 
Interrupt-Routine) den Atmega so beschäftigt, hoffe ich, dass jemand 
erkennen kann, welchen Fehler ich mache!

Vielen Dank
Kim

von Marius W. (mw1987)


Lesenswert?

Warum gibst du den Interrupt frei, wenn du keine ISR hast? Dir ist schon 
klar, dass der Prozessor dann ins Nirvana springt?

Also mach dieses verdammte
1
TIMSK |= (1<<OCIE0);
raus!

Gruß
Marius

von Kim (Gast)


Lesenswert?

Ok danke für die schnelle Antwort. Ich bin davon ausgegangen, dass der 
Controller denn Interrupt intern zur Erzeugung des Signals braucht. Dann 
hätte ich die folgende Frage:

Wenn ich dich richtig verstehe, lase ich einen Interrupt zu, ohne eine 
passende Routine dafür zu erstellen. Deshalb "springt der prozessor ins 
Nirvana". Kommt der Prozessor da wieder raus, nachdem er merkt, dass 
keine passende Routine da ist? Evtl. eine dumme Frage, würde mir aber 
zum verständniss sehr helfen.

von Thomas E. (thomase)


Lesenswert?

Kim schrieb:
> Kommt der Prozessor da wieder raus, nachdem er merkt, dass
> keine passende Routine da ist? Evtl. eine dumme Frage, würde mir aber
> zum verständniss sehr helfen.
Der merkt überhaupt nichts. Der springt auf den Interrupt-Vektor und 
führt aus, was da steht. Wenn keine ISR angelegt wurde, legt der 
Compiler da einen Sprung auf den Resetvektor hin.

mfg.

von Kim (Gast)


Lesenswert?

ok...und was bedeutet "Resetvektor" an dieser Stelle? Das das Programm 
wieder von vorne gestartet wird?

btw... nachdem ich die Zeile entfernt habe funktioniert alles wie 
geplant, nochmal vielen Dank!

von Thomas E. (thomase)


Lesenswert?

Kim schrieb:
> ok...und was bedeutet "Resetvektor" an dieser Stelle? Das das Programm
> wieder von vorne gestartet wird?
Genau.

mfg.

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.