Timer0 - geht aber nicht ganz wie erwartet

Gast #2383153
Lesenswert?

Hallo Jungs,

ich stehe auf dem Schlauch und weis nicht was ich falsch mache. Der 
Interrupt Timer1 fuktioniert soweit.
Unten sieht Ihr meinen Code. Mein Atmega64C1 laeuft mit 12MHz. Ich will 
erreichen, dass mein Timer1 alle ca. 100ms ausgefuehrt wird. Momentan 
bin ich bei ca. 350ms. Wenn ich richtig verstanden habe, muss ich in 
diesem Fall einen Wert fuer TCNT1 berechnen, da sehe ich kein Problem. 
Jedoch wenn ich den Wert TCNT1 auf irgendwelche Zahl aendere, egal 
welche, wird der Interrupt immer noch alle ca. 350ms ausgefuehrt. 
Unabhangig ob der Wert hoch oder niedrig ist. Was mache ich falsch. Ich 
habe nichts anders gemacht, wie in vielen Beitraegen zu Timern 
beschrieben.
1
void main(void)
2
{
3
         TCCR1B |=  (1<<CS00) | (1<<CS01);    //prescaler 64
4
         TIMSK1 |= (1<<TOIE0);    
5
         TCNT1 = 65500;          
6
         sei();
7

8
  while (1){    
9
                ........
10
  }
11
}
12

13
ISR(TIMER1_OVF_vect){
14
     led_an();    
15
}

Gruss
Gast #2383160
Lesenswert?

student schrieb:
> Jedoch wenn ich den Wert TCNT1 auf irgendwelche Zahl aendere, egal
> welche, wird der Interrupt immer noch alle ca. 350ms ausgefuehrt.

Der Overflow ISR erfolgt, wenn der Zähler von 65535 auf 0 springt. Wenn 
du in TCNT1 eingreifst, wird nur dieser eine Timerdurchlauf beeinflußt. 
Alle weiteren Durchläufe haben dann wieder die Länge von 350 ms.

Für 100 ms kann man den Timer im CTC Mode laufen lassen, so dass der TOP 
Wert durch das OCR festgelegt wird.
#2383172
Lesenswert?

Wie immer vorher das Datenblatt lesen

- http://atmel.com/dyn/resources/prod_documents/doc7647.pdf

CS00,CS01, TOIE0 gehört zu Timer0
1
void init_timer1(void ) {
2
TCCR1A = 0
3
TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS11);    // ctc,prescaler 64
4

5
TCNT1 = 0;
6
OCR1A  = (uint16_t)(1.0*F_CPU /(64 * 10) -.5);
7

8
TIMSK1 = (1<<OCIE1A);
9
sei();
10
}

jetzt fehlt Dir nur der richtige ISR(TIMER1_COMPA_vect) , so dass es 
läuft.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren