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 habe noch ein Problem. Dem Compiler AVR Studio 4 ist zwar OCR0 bekannt, aber ORC1 wird nicht erkannt.
OK, das OCR- Problem habe ich gelöst, es gibt eine LOw und eine HIghseite.
Such mal im Datenblatt nach "ctc". Damit legst du fest, ob der Timer gelöscht wird oder nicht. ...
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
Hi, ganz bestimmt das Globale I Flag vergessen zusetzen mit sei . Gruß, Dirk (www.myevertool.de)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.