Hallo,
aus dem Datenblatt werde ich nicht so richtig schlau.... Meine Frage:
Ich habe einen Atmega 644 mit 16Mhz am laufen, nu will ich einen
Timerinterrupt alle 1ms auslösen.
Ich muss den Timer 1 nehmen da Timer 0 schon belegt ist.
Meine Konfig sieht so aus:
Ich weiss garnicht wie ich den OCR1AH lade Im Datenblatt steht halt
OCR1AH / OCR1AL , high und low.
Aber wie muss ich das Handhaben, das ist bestimmt falsch.
Nach meiner Berechnung müsste ca. 1 ms rauskommen.
Prescaler 64 also:
16.000.000Hz/64/256 = 976 = 0,001s = 1ms ca.
Wenn ich aber einen counter in der ISR erhöhe und ich den counter bei
1000 in der main Abfrage sind das nie und nimmer 1 Sekunde. Diese 1000
werden viel heufiger erreicht. Bei ca. 100000 habe ich eine Sekunde.
Kann mir einer helfen ?
Hi
>Danke,>Wenn ich jetzt den Timer alle 0,1 ms auslösen will? Muss ich dann den>TNCT1 durch 10000 nehmen, oder ?
Lies dir das Kapitel 'Timer' im Datenblatt mal richtig durch. Das tut ja
schon weh.
Und das auch:
Beitrag "Re: Problem mit Interrupt Prescaler"
auch wenn es funktioniert.
MfG Spess
Hi
>Was tut denn daran weh?
Wozu dieses Vorgelade? Timer1 hat CTC. Außerdem hast du vergessen zu
sagen, das man das Vorladen bei jedem Interrupt machen muss. Nur in der
Init bringt nichts.
Und 'TCCR1B = 0x01;' ist alles andere als aussagekräftig.
MfG Spess
Ausserdem ist der Compiler bei den weitaus meisten 16-Bit Werten in
IO-Registern in der Lage, sie als solche zu behandeln. Daher besteht
keine Notwendigkeit, die Werte selbst in Bytes zu zerpflücken. Also
OCR1A = ...
statt
OCR1AL = ...
OCR1AH = ...
Hi
>Ausserdem ist der Compiler bei den weitaus meisten 16-Bit Werten in>IO-Registern in der Lage,....
Und außerdem sind diese Register nach einem Reset mit 0x00
initialisiert.
Z.B. 'TCCR1A = 0x00;' ist also unnötig.
MfG Spess
Wow, jetzt habt ihrs mir aber gegeben :-=
Aber:
"TCCR1B = (1<<CS10)" ist für mich jetzt auch nicht ausagekräftiger, weil
ich auch erstmal nachschauen muss, wass denn nun "CS10" ist.
Und ausserdem ist das Ganze eine Initialisierungsroutine, die den Timer
auf die Anfangswerte setzen soll. Egal, wie die Werte vorher gestanden
haben.
Schön, dass ihr das anders macht.
Daniel V. schrieb:> "TCCR1A = (1<<CS10)" ist für mich jetzt auch nicht ausagekräftiger, weil> ich auch erstmal nachschauen muss, wass denn nun "CS10" ist.
das da ei ClockSelect-Bit gesetzt wird ist aber sofort klar, dafür muss
man nicht nachschauen...im Gegensatz zu deiner Schreibweise, wo man
überhaupt nicht weiss, was gerade gesetzt werden soll
Ich weiß das pushen macht man eigentlich nicht, aber ich sitze immer
noch an dem Problem und ich will das heute noch verstehen ;-(
Wäre über jede Hilfe sehr dankbar !
Hi
>Warum wird alle 4 Sekunden nur eine 1 ausgegeben ?>Verstehe das nicht....
Habe ich doch schon hier
Beitrag "Re: Problem mit Interrupt Prescaler"
geschrieben. Daniel V. (danvet) hat vergessen, dazu zu sagen, das
TCNT1L = (0xFFFF - F_CPU/1000 +1) & 0x0FF;
TCNT1H = ((0xFFFF - F_CPU/1000 +1)>>8) & 0x0FF;
in jedem Interrupt ausgeführt werden muß.
Nimm einfach CTC.
MfG Spess