Timer Probleme

Gast #4601579
Lesenswert?
• ▲
▼
Hallo,
ich habe einen Problem mit meinem Timer. Dieser dauer doppelt so lange 
wie der eigentlich sollte

1
...
2
// Timer 0
3
  TCCR0A = (1<<WGM01); // CTC Modus
4
  TCCR0B |= (1 << CS01); // prescaler 8
5
  OCR0A = 250-1;
6

7
  // Overflow Interrupt allow
8
  TIMSK |= (1 << OCIE0A);
9

10
  // Global Interrupts activate
11
  sei();
12

13
...
14

15
ISR (TIMER0_COMPA_vect){
16
  static unsigned int millisekunde = 0;
17
  static unsigned int sekunde = 0;
18
  
19
  millisekunde++;
20

21
  if(millisekunde == 1000){
22
    millisekunde = 0;
23
    sekunde++;
24
    PORTD ^= (1<<PD5);
25
    
26
    if(sekunde == 60){
27
      sekunde = 0;
28
    }
29
  }
30
}

Am Controller habe ich einen Quarz mit 8MHZ und die FUSES habe ich auf
L: 0x6C
H: 0x9F
E: 0xFF
gesetzt.

eigentlich sollte der Interrupt genau jede millisekunde ausgelöst 
werden, sodass PD5 im sekundentakt toggelt. Dieses dauert aber fast 2 
Sekunden (an PD5 ist eine LED angeschlossen).

8Mhz/4/prescaler = 250.000khz
-> 1 Takt = 0.004ms
OCR0A = 250 -> 250*0.004ms = 1ms
(Firma: matzetronics) #4601588
Lesenswert?
• ▲
▼
Hmm, wie kommst du bei 8Mhz Takt und einem 8er Prescaler auf eine 
Millisekunde ISR Rate?
1
// Timer 0
2
  TCCR0A = (1<<WGM01); // CTC Modus
3
  TCCR0B |= (1 << CS01); // prescaler 8
4
  OCR0A = 250-1;
Für mich kommt da eine Rate von
8.000.000 / 8 = 1.000.000 und dann durch 250
1.000.000 / 250 = 4000 Hz raus, das sind 0,25 ms.
Besser ist also ein Prescaler von 64 (Taktfrequenz des Timers sind dann 
125kHz) und ein OCR0A von 125-1.

Lukas H. schrieb:
> 8Mhz/4/prescaler = 250.000khz

Wo kommt die 4 her?
Gast #4601589
Lesenswert?
• ▲
▼
Lukas H. schrieb:
> 8Mhz/4/prescaler = 250.000khz
> -> 1 Takt = 0.004ms
> OCR0A = 250 -> 250*0.004ms = 1ms

8Mhz Quarz
CKDIV8 Fuse teilt durch 8 -> 1Mhz
Prescale = 8 -> 125000Hz
OCR0A: (1/125000) * 250 = 2ms !!!

Fehler: CKDIV8 teilt bei dir noch und der seltsame /4 Teiler in der 
Rechnung
Gast #4601591
Lesenswert?
• ▲
▼
mh, ich dachte, das stand so im Datenblatt. Es ist aber nur für eine 
external clock bei UART.
da ich dieses später benutzen möchte, hatte ich da schon einmal 
reingeguckt.
Aber dann passt ja doch alles.

Ich danke euch für eure Hilfe

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