Forum: Mikrocontroller und Digitale Elektronik Timer0 - geht aber nicht ganz wie erwartet


von student (Gast)


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
von Michael (Gast)


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.
von student (Gast)


Lesenswert?

Hm,

macht Sinn. Verdammt!

Danke fuer den Tipp. Ich probiere es morgen aus, ersteinaml gehe ich 
schalfen.

Gruss
von Uwe (de0508)


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.
von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

CTC muss aber nicht sein, du könntest einfach in der ISR möglichst als 
1. Statement TCNT1=65500 eingeben
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.