Schau Dir die Zeile mit TCCR0 mal genau an...
...v.a. die Stelle mit CS01...
Na, siehste das auch? Dein Timer läuft genau 8 mal so schnell, wie er
sollte.
Ich verstehe nichts von C, denke aber, daß Du so knapp 5ms erzeugst.
16Mhz/1024=15625Hz
und dann: 15625Hz / 77 = ca. 203Hz
das wären 4,9ms
Meines Achtens müßte statt 77 99 da stehen.
MfG Paul
Paul Baumann wrote:
> Ich verstehe nichts von C, denke aber, daß Du so knapp 5ms erzeugst.>> 16Mhz/1024=15625Hz> und dann: 15625Hz / 77 = ca. 203Hz
Richtig, er hat noch nen Faktor 2 drin. Wenn er einen Pin toggeln will
mit einer Periodendauer von 10 ms (also 100 Hz), dann wären die
Einstellungen richtig...
> Meines Achtens müßte statt 77 99 da stehen.
Wieso 99? Wohl eher 155...
15625 Hz / 156 = ca. 100 Hz
bzw.
64 µs * 156 = 9,98 ms
EDIT:
Sorry, hatte nicht gesehen, worauf Du genau mit der 77 hinauswolltest...
Aber ich denke, wenn man es so rechnet wie oben, dann leuchtet es ein.
Ja, so habe ich das gemeint: Er lädt oben in seinem Programm den Timer
mit
178. Dann läuft der Timer von da ab bis 255. Wenn man ihn mit 99 lädt,
dann macht er noch 156 Schritte bis "oben hin".
MfG Paul
Paul Baumann wrote:
> Ja, so habe ich das gemeint: Er lädt oben in seinem Programm den Timer> mit> 178. Dann läuft der Timer von da ab bis 255. Wenn man ihn mit 99 lädt,> dann macht er noch 156 Schritte bis "oben hin".
Das stimmt ja nicht. Er benutzt ja die Compare-Einheit (CTC-Betrieb),
und da läuft der Timer von 0 bis 178+1. Er hat nur die Werte irgendwie
durcheinandergebracht (und eben auch noch den Faktor 2 drin, den man nur
braucht, wenn man einen Pin toggeln will, weil man dann pro Periode
zweimal toggeln muss).
Er hat ja schon den Compare-Wert richtig ausgerechnet, dann aber:
=> 255 - 77 = 178
...und schreibt den Wert ins OCR, was natürlich falsch ist. Die 77 hätte
in dem Fall ins OCR gehört und nicht die Differenz. Bis auf die Zeile
und die 2 stimmt es aber...
@ µC-noob (Gast)
>Aber das ist alles nur keine richtige Zeit.>Was ist noch falsch, wo liegt mein denkfehler.
Ein VOLLSTÄNDIGER Quelltext wäre hilfreich. Bitte als Anhang.
MFG
Falk
Hallo,
ich denke Karl hat Recht ;-). Also, da ist der Faktor falsch: da fehlt
das (1<<CS01).
Schreib doch einfach:
1
TCCR0=0x0F;//1024er-Scaler, CTC-Mode
Das mit dem OCRA ist 'ne gute Sache. Jedoch meine ich, dass Du den OCRA
auf 77 setzen mußt, nicht auf 178, da in diesem Modus der TCNT bei
CompareMatch mit OCRA auf Null gesetzt wird und den Interrupt auslöst
(kein Overflow mehr, sondern ein CompareMatch).
Grüße
Kai
Danke euch allen für eure Hilfe, es läuft jetzt....
Nur hab ich noch nicht exakt 10ms, da muss ich noch hirnen,...
Grund:
Über Timer0 läuft ein Tasksystem und eine zentrale Uhr die in 10ms
schritten läuft.
Von dieser Zentralen Uhr leite ich dann alles andere ab (sec, min std,
tag....
Ich weiß, besser wär ss::mm:hh, aber die Vorgabe ist eine Zentrale Zeit
in ms.
Hab folgendes gefunden:
Beitrag "Die genaue Sekunde / RTC"
Mal schauen ob ichs versteh....
chiao
Jo
Das Hauptproblem, warum es nicht genau 10 ms sind, liegt in der Wahl des
Vorteilers. Wenn Du mit 16 MHz taktest und diesen Takt durch 1024
teilst, dann kommt eben was raus, was nicht mehr ganzzahlig in 10 ms
reingeht. Wenn es auch 1 oder 2 ms sein können: die lassen sich bei der
Taktfrequenz problemlos präzise erzeugen. Bei einem Prescaler von 128
und einem Compare-Wert von 249 gibts z.B. 1 ms, bei einem Prescaler von
256 und ebenfalls einem Compare-Wert von 249 dann 2 ms. Mehr ist mit dem
8-Bit-Timer bei 16 MHz nicht drin.