Im Debug-Modus hab ich den Prescaler auf 8 gelassen und bei ORC1A den
Wert 3, damit ich nicht so oft "steppen" muss. Wenn der Timerwert TCNT1
mit OCR1A übereinstimmt, wird in TIFR1 das OCF1A-Flag gesetzt, aber der
Interrupt wird nicht gestartet und OCR1A geht nicht automatisch auf
Null. So wie ich aber das GCC-Tutorial mit dem Timer verstanden habe,
brauche ich es nicht zu "nullen" und der Interrupt TIMER1_COMPA müsste
auch starten, tut er aber nicht :-(. Kann mir jmd. vielleicht nen Tipp
geben, woram esliegen koennte?
Hallo,
eine Antwort auf die Schnelle.
Könnte es sein, dass Du vergessen hast, den CTC Modus einzuschalten,
d.h. die entsprechenden WGM Bits zu setzen.
Gruß
Reiner
Hmm, nun hab ich in TCCR1B WGM12 gesetzt, jetzt nullt der Zähler bei
Iebereinstimmung, der Interrupt wird aber immer noch nicht aufgerufen
:-(
Das Datenblatt kennt zu diesen Typen folgende Einstellungen, für
Variante 04 habe ich mich entschieden, weis aber nicht, obs die richtige
ist.
No Wgm3 Wgm2 Wgm1 Wgm0
12 1 1 0 0 CTC ICR1 Immediate MAX
04 0 1 0 0 CTC OCR1A Immediate MAX
Wie gesagt, der Interrupt startet einfach nicht. Oder starten Interrupts
im Debugger generell nicht, wenn die aktiv sind und ausgelöst werden??
Hi
>AVRStudio 6
Schon mal nach 'Known Issues' gesucht. Ich benutze AVR Studio 4.19. Dort
gibt es auch einige PWM-Modi, die im Simulator nicht funktionieren. Aber
CTC läuft.
MfG Spess
Spess53 schrieb:> Schon mal nach 'Known Issues' gesucht
nee, weis nicht, wonach ich genau suchen soll :-(
Oder kann es sein, dass der Debugger das nicht simulieren kann, dass es
theoretisch zwar richtig ist, der es aber einfach nicht kann?
Pappnase schrieb:> AVRStudio 6
Und im Einzelschritt gesteppt, richtig?
Das sei() funktioniert im Einzelschritt nicht. Setze einen Breakpoint
und benutze dann Run. Und kontrolliere, ob das I-Flag in SREG auch
tatsächlich gesetzt ist.
@ Pappnase (Gast)
>Oder kann es sein, dass der Debugger das nicht simulieren kann, dass es>theoretisch zwar richtig ist, der es aber einfach nicht kann?
Solche Fehler gab es mal, im aktuellen AVR-Studio sind die aber AFAIK
nicht bekannt.
Stefan Ernst schrieb:> Und kontrolliere, ob das I-Flag in SREG auch> tatsächlich gesetzt ist.
Hmm, jetzt hab ich in der ISR den Break-Point gesetzt und dann nicht im
"Step"-Modus gedebugg und ich beobachte auch immer meine Zählvariable
"zaehler", jetzt funktioniert es :-)
Aber ich habe noch nicht kapiert, wo der Unterschied zwischen diesen
beiden Modi liegt:
No Wgm3 Wgm2 Wgm1 Wgm0
12 1 1 0 0 CTC ICR1 Immediate MAX
04 0 1 0 0 CTC OCR1A Immediate MAX
Ich hab jetzt den Modus 04 genommen, aber es gibt auch noch den Modus
12, wo auch CTC drinnen steht.
Hi
>Ich hab jetzt den Modus 04 genommen, aber es gibt auch noch den Modus>12, wo auch CTC drinnen steht.
Der Unterschied ist das Top-Register. Das bestimmt, wie weit der Timer
läuft bis er wieder von Null anfängt. Im Mode 4 ist das OCR1A und im
Mode 12 ICR1. Wenn du mit CTC ein Signal an einem Pin erzeugen willst,
dann geht das nur im Mode 4.
MfG Spess
Hallo,
> Der Unterschied ist das Top-Register. Das bestimmt, wie weit der Timer> läuft bis er wieder von Null anfängt. Im Mode 4 ist das OCR1A und im> Mode 12 ICR1. Wenn du mit CTC ein Signal an einem Pin erzeugen willst,> dann geht das nur im Mode 4.
Die Aussage im letzten Satz sehe ich anders. Genau so wie im Mode 4 kann
man auch im Mode 12 PWM Signale an einem Pin erzeugen. Im Mode 12 hat
man, im Gegensatz zu Mode 4, zwei Register um an zwei Pins PWM Signale
mit unterschiedlichem Tastverhältnis zu erzeugen. Mit ICR1 kann man dann
die Frequenz der PWM genau einstellen - über den Prescaler funktioniert
das nämlich nur grob. Mit OCR1A und OCR1B parametriert man dann die
Tastverhältnisse der PWMs.
Ein weiterer Unterschied zwischen Mode 4 und Mode 12 liegt im Timing
beim Ändern der Register OCR1A bzw. OCR1B.