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
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
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.
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.