Forum: Compiler & IDEs 200ms, Timer1 Problem, Prescaler 256


von Heyho (Gast)


Lesenswert?

Hallo, ich schreib gerade mein erstes Programm für meinen ATmega1284p. 
Ich wollte mit einem Timer ein Zeitsignal von 200ms erzeugen. Ich hab 
mir ausgerechnet, dass beim CTC Modus des Timers 1, dieser Wert auf 
15624 gestellt werden müsste, mit einem Tool bin ich dann auf den Wert 
0x3D08 gekommen, was ja doch relativ nahe dran liegt :-)

Leider stimmt die Zeit aber kein bisschen, daher hab ich wohl irgendwas 
falsch gemacht. Hier sind meine bescheidenen Anfänge :-(

1
TCCR1A = (1<<WGM01); // CTC Modus
2
TCCR1B |= (1<<CS12); // Prescaler 256
3
TCCR1B &= ~ (1<<CS10) | (1<<CS10);
4
OCR1A = 0x3D08;
5
6
TIMSK1 |= (1<<OCIE1A);


1
ISR (TIMER1_COMPA_vect)            //5)Führe diese ISR aus wenn TCNT2==OCR2
2
{
3
    wdt_reset();
4
    sekunde++;
5
    uart_puti(sekunde);
6
}


Grüße Toni

von Martin (Gast)


Lesenswert?

> Leider stimmt die Zeit aber kein bisschen, daher hab ich wohl irgendwas
> falsch gemacht. Hier sind meine bescheidenen Anfänge :-(

Was bekommst du denn für eine Zeit heraus? Wie groß ist denn die 
Abweichung vom gewünschten?

von noname (Gast)


Lesenswert?

2,5ms villeicht, ich muss das ganze 80mal hochzählen für pi mal daumen 5 
werte pro sekunde

von Stefan E. (sternst)


Lesenswert?

Weil du den Timer auf "PWM, Phase Correct, 9-bit" einstellst, und nicht 
CTC.

von egal (Gast)


Lesenswert?

Hinweis:

> TCCR1B &= ~ (1<<CS10) | (1<<CS10);

von folienano (Gast)


Lesenswert?

ich steh jetzt vor nem ähnlichen Problem.
1
TCCR1B |=  (1<<CS12) | (1<<WGM12) ;
2
TCCR1B &= ~  (1<<CS11  ) | (1<<CS10);
3
OCR1A = 15624-1;
4
5
TIMSK1 |= (1<<OCIE1A);


Ich brauch einen 200ms Takt, laut Datenblatt meines mega644p befindet 
sich WGM12 im TCCR1B register.

CS12 muss gesetzt sein, CS11 und CS10 sind auf 0 zu setzen


Ich bekomme einen Takt von etwa 800ms, anstatt 200ms.


Habt ihr eine Idee was falsch ist?

von Karl H. (kbuchegg)


Lesenswert?

Bei welcher Taktfrequenz des µC?

von Krapao (Gast)


Lesenswert?

> TCCR1B |=  (1<<CS12) | (1<<WGM12) ;
> OCR1A = 15624-1;
> 200ms erwartet

Mode 4, CTC + Prescaler 256 + 15625 steps

=> Ist deine F_CPU und deine externe Taktquelle 20 MHz?
=> Stehen die Fuses auf Ext. Taktquelle?
=> Ist CKDIV8 unprogrammiert (entgegen Werkseinstellung)

von Stefan E. (sternst)


Lesenswert?

folienano schrieb:
> CS12 muss gesetzt sein, CS11 und CS10 sind auf 0 zu setzen

Deine &=-Zeile setzt aber nur CS11 auf 0 (Klammer fehlt). Und ein 
gesetztes CS10 ergibt dann tatsächlich Faktor 4 langsamer. Das kann aber 
nur dann die Ursache deines Problems sein, wenn du vorher schon mal 
irgendwo CS10 gesetzt hattest.

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.