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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.