Forum: Mikrocontroller und Digitale Elektronik Output Compare Register beim AVR


von -------- ------------ (Gast)


Lesenswert?

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?

von -------- ------------ (Gast)


Lesenswert?

Ich habe noch ein Problem.
Dem Compiler AVR Studio 4 ist zwar OCR0 bekannt, aber ORC1 wird nicht
erkannt.

von -------- ------------ (Gast)


Lesenswert?

OK, das OCR- Problem habe ich gelöst, es gibt eine LOw und eine
HIghseite.

von Hannes L. (hannes)


Lesenswert?

Such mal im Datenblatt nach "ctc". Damit legst du fest, ob der Timer
gelöscht wird oder nicht.

...

von Freak5 (Gast)


Lesenswert?

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."

von Freak5 (Gast)


Lesenswert?

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.

von Olaf K. (Gast)


Lesenswert?

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

von Freak5 (Gast)


Lesenswert?

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.

von Andi K. (Gast)


Lesenswert?

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

von Andi K. (Gast)


Lesenswert?

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

von Freak5 (Gast)


Lesenswert?

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.

von Andi K. (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Hi,

ganz bestimmt das Globale I Flag vergessen zusetzen mit sei .

Gruß,

Dirk
(www.myevertool.de)

von Freak5 (Gast)


Lesenswert?

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

von Freak5 (Gast)


Lesenswert?

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.

von Andi K. (Gast)


Lesenswert?

"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

von Andi K. (Gast)


Lesenswert?

@Freak5: Hast mir dazwischen gefunkt :-)

MfG
Andi

von Freak5 (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.