Wenn dieser Compare Interrupt ausgelöst wird. Wird dabei der Couter
automatisch auf 0 zurückgesetzt, oder läuft der einfach weiter.
Zum Beispiel
Output compare:75
Läuft der Counter bei 76 weiter oder fängt er wieder bei 0 an?
Ich bin auf diesen Abschnitt gestoßen, ich weiß aber nicht, was er
bedeutet, irgendwo stand, dass der Timer 0 in der ctc Hinsicht durch
diesen Flag gestuert wird, aber ich kann keinen Zusammenhang
herstellen. Muss man eigentlich noch irgendetwas spezielles machen,
damit der Timer überhaubt losläuft?
Ich habe diesen Code durch den Simulator geschickt, aber irgendwie will
der Timer nicht starten.
"ldi r16, 0b00000100
out TCCR1A, r16 ; Prescaler auf 256
ldi r16, 0b00000011
out OCR1AH, r16
ldi r16, 0b11111111
out OCR1AL, r16; Output Compare Register auf 1023 für den langsamen
Takt
ldi r16, 0b00010000
out TIMSK, r16 ; Couter1 Compare aktivieren
sei"
" Bit 1 OCF0: Output Compare Flag 0
The OCF0 bit is set (one) when a compare match occurs between the
Timer/Counter0
and the data in OCR0 Output Compare Register0. OCF0 is cleared by
hardware when
executing the corresponding interrupt handling vector. Alternatively,
OCF0 is cleared by
writing a logic one to the flag. When the I-bit in SREG, OCIE0
(Timer/Counter0 Compare
Match Interrupt Enable), and OCF0 are set (one), the Timer/Counter0
Compare
Match Interrupt is executed."
Kann es eigentlich sein, dass das AVR - STudio Probleme mit der
Simulation des taktes hat? Ich habe die Forensuche benutzt und da hatte
schon jemand das Problem.
Beim CTC mit Prescaler gibt es unterschiedliches Verhalten bei
verschiedenen AVRs, und wenn ich mich recht entsinne hält sich das
AVRStudio manchmal nicht ganz ans Original.
Beispiel AT90S2313: Angenommen, der Prescaler ist 8 und der Comparewert
ist 3, dann zählt der folgendermaßen:
0000000011111111222222223000000011111111 usw...
Das Compare-Flag wird beim Übergang von der 3 zur Null gesetzt, also
einen Clocktick zu spät. Da die Null nur siebenmal auftaucht, bleibt
der Timer aber im Prescaler-Raster.
Der ATtiny2313 zählt dagegen so:
00000000111111112222222233333333000000
Das Compare-Flag wird beim Übergang zur Null gesetzt. Damit erfolgt der
Interrupt Prescalersynchron, aber einen Countertick (minus ein
Clocktick) später als beim 90s2313.
Ohne Prescaler zählen beide gleich, Compare-Wert 3:
01230123....
das Flag erscheint wieder beim Übergang zur Null.
Zum Unterschied der beiden Prozessoren gibt es eine Appnote:
http://www.atmel.com/dyn/resources/prod_documents/doc4298.pdf
MfG Olaf
Wie du das so aufgeschrieben hast, wird mit Prescaler der
Compareinterrupt dann auch 8mal wiederholt?
Mein Problem war, dass der Timer gar nicht erst anfängt zu laufen.
Z. B. beim Mega16 gibt es noch ein weiteres Controll-Register (TCCR1B)
wo man den Prescaler einstellt, CS2:1:0.
Beläßt Du diese 3 Bits auf 0 rührt der Timer sich nicht.
In TCCR1B sind unter anderem noch 2 Bits für den Operating-Mode wie
CTC, in TCCR1A sind ebenfals 2 Bits. Die nennen sich übrigens
WGM13:12:11:10.
MfG
Andi
Ach ja, das Bit "OCIE1A" in "TIMSK" ist nur für die
Interruptauslösung bei Output Compare Match A zuständig und startet den
Timer nicht.
Ein entsprechender Eintrag in die Interrupt Vektor Tabelle und eine ISR
sollte vorhande sein.
MfG
Andi
TCCR1B
Warte mal, ich mus das auch benutzen, wenn ich alles in TCCR1A auch
eingestellt habe und obwohl ich den Prescaler 1B gar nicht brauche?
Darauf wäre ich nie gekommen. Ich probiere es gleich mal aus...
"Ein entsprechender Eintrag in die Interrupt Vektor Tabelle und eine
ISR
sollte vorhande sein."
"
.org 0000
jmp Start
.org $00C
jmp Taktausgabe
.org $029
Start: "
Dann erweitere ich die mal lieber. Ich schau mal, was es bringt.
Das Register "TCCR1B" hat nix mit dem OCR1BH:L zu tun.
In TCCR1A sind die einen Einstellungen und in TCCR1B andere, mitunter
eben der Prescaler für den Timer 1 mit den Bits CS2:1:0. Läßt man diese
auf 000 läuft eben der Timer 1 überhaupt nicht.
MfG
Andi
Ich glaube ich habe da etwas verwechselt. Ich habe gedacht, wenn man bei
1B den Prescaler für den Compare1B einträgt, dann könnte man das beim
anderen für den Compare 1A machen. Dabei hätte ich im Simulator
nachschauen können. Ich habe nicht bemerkt, dass die Bits andere
Bezeichnungen haben. Danke. Ich hoffe, das fällt mir beim nächsten Mal
auf.
MFD
Freak5
Nö. Andi hat geholfen. An sei habe ich gedacht. Ich habe mir den ganzen
Befehlssatz auf einem Zettel ausgedruckt und an meinen Bildschirm
geheftet. Das mache ich mit den Spezialregistern vielleicht auch mal.
"ldi r16, 0b00000100
out TCCR1A, r16 ; Prescaler auf 256"
Jetzt habe ich es erst geschnallt!
So wie es aus sieht, hast Du dich zum setzen des Prescalers mit dem
Register vertan.
Die Prescaler-Bits sind in TCCR1B, nicht A.
Ansonsten vergiss nicht, in beiden Registern die richtigen Bits für den
CTC-Mode zu setzen.
MfG
Andi
Ich habe mir das Datenblatt nicht gewissenhaft durchgelesen. Ich wollte
schnell damit fertig werden und als ich alles für 1B zusammen hatte und
1A nutzen wollte habe ich das schnell umgearbeitet ohne darauf zu
kommen, dass ein gemeinsamer Prescaler genutzt wird.(Ich wusste nur,
dass Couter 0 und Couter 1 den selben generator nutzen, den man aber
mit verschiedenen Werten laufen lassen kann.)
Zum CTC Mode muss ich wohl das richtige gesetzt haben. Ansonsten ist es
aber egal, da ich den Interrupt dazu nutzen werde die Werte zu updaten,
da sie durch die Software veränderbar sein werden. Ich benutze den AVR
nämlich als Taktgenerator für die Zündspuele.
Cu