Eigentlich ganz simpel.
Leider blinkt die LED deutlich sichtbar.
Nach meinen Überlegungen müsste die Blinkfrequenz aber unsichtbar sein!
Ich betreibe die LED (Low-Current-LED) über einen 1K-Widerstand direkt
am PortD.1.
Der ATmega funktioniert aber, denn wenn ich die LED mit waitms in der
do-loop-Schleife im Abstand von 1 ms toggle, dann bleibt sie dauerhaft
an und gedimmt?!
Fusebits habe ich richtig gesetzt, ich nutze den internen Oszillator auf
2 MHz. Die gesetzten Werte sind E2 für Low und D9 für High.
Erkennt vielleicht jemand den Fehler?
Vielen Dank!
Preload heißt doch, dass der Timer erst bei diesem Wert zu zählen
anfängt.
Bis zum Überlauf beim Timer1 dauert es also noch ca. 5000 Takte. Ein
Takt hat 0,5µs, also haben 5000 davon 2,5 ms.
Die LED schaltet also alle 5 ms, ergibt eine Taktrate von 200 Hz. Das
sehe ich nicht mehr als sichtbar an.
Deswegen wundert es mich, dass dem so ist.
nachtbastler schrieb:> Die LED schaltet also alle 5 ms, ergibt eine Taktrate von 200 Hz. Das> sehe ich nicht mehr als sichtbar an.> Deswegen wundert es mich, dass dem so ist.
Ja, dann ist es eben noch schlimmer:
2MHz = 500ns
500ns * 65536 = 32.768ms
32.768ms * 2 = 65.536ms
LOL.
Wie wäre es, wenn du in deiner ISR den Timer1 wieder mit 60000 lädst ?
Etwa so:
nachtbastler schrieb:> Timer1 = Timer1preload
Ja, einmal am Anfang.
Sobald dein Timer bis 0 abgezählt hat, springt der in die ISR und
fängt dort aber wieder von Null an.
Jetzt funktioniert es! Vielen Dank.
Ich dachte, dass ich mit den oben genannten Anweisungen dem Timer
bereits gesagt hätte, dass er jedes Mal bei Wert X starten soll. Aber
wenn das natürlich nur ein einziges Mal gilt kann das natürlich nichts
werden.
nachtbastler schrieb:> Ich dachte, dass ich mit den oben genannten Anweisungen dem Timer> bereits gesagt hätte, dass er jedes Mal bei Wert X starten soll.
Dem Timer ist völlig wurscht, ob Du eine Variable "Timer1preload"
nennst. Du kannst sie auch "Blub" nennen.
Er macht nur das, was im Code steht.
Wenn man mal ins Datenblatt schaut, sieht man aber, daß T1 einen
Clear-On-Compare Mode kann. Dann muß man das Clear nicht jedesmal im
Interrupt-Code machen.
Peter Dannegger schrieb:> Wenn man mal ins Datenblatt schaut, sieht man aber, daß T1 einen> Clear-On-Compare Mode kann. Dann muß man das Clear nicht jedesmal im> Interrupt-Code machen.
Wahrscheinlich kann man Timer1 auch so betreiben, vllt sogar direkt
PWM, etwa:
Config Timer1 = Timer, [Counter], [CTC (oder PWM ) ? ]
Welchen Vorteil hat es, das Clear aus dem Interrupt rauszuhalten?
Das wird ja nur ein Problem, wenn die Zeit zwischen zwei Interrupts
nicht ausreicht, um den Code im Interrupt auszuführen, oder?
In diesem Fall wäre das relativ unwahrscheinlich, da nur eine LED
getoggelt werden soll. Ansonsten gebe ich dir aber natürlich recht.
nachtbastler schrieb:> Welchen Vorteil hat es, das Clear aus dem Interrupt rauszuhalten?
Weil die Hardware dann das alles selbsttätig macht.
Und zwar auf den Taktzklus genau. Und zwar auch dann, wenn sich die
Abarbeitung der ISR verzögert, weil gerade eine andere ISR ihr Ding
macht.