Forum: Mikrocontroller und Digitale Elektronik Timer Probleme


von Lukas H. (Gast)


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

von noname (Gast)


Lesenswert?

µC?

von Lukas H. (Gast)


Lesenswert?

Ahso,
noch benutze ich einen attiny2313A. Dieser ist mir für anfänger 
vorgeschlagen worden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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?

von noname (Gast)


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

von Norbert S. (norberts)


Lesenswert?

Moin,

Was rechnest Du denn da?
Der Tiny läuft mit den Fuses mit 1MHz.
CKDIV8 ist gesetzt.
Also läuft der Timer mit 1MHz / 8 = 125000kHz.
OCR0A = 250 macht 500Hz, oder 0,002s bis zum Überlauf.
1000x macht 2 Sekunden.


Gruß,
Norbert

von Lukas H. (Gast)


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

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.