Atmega von Timer0 überfordert?

Gast #3030020
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
Gast #3030042
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.
#3030049
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren