Timerproblem

OP #2848878
Lesenswert?

Hallo.

Ich sehe momentan den Wald vor lauter Bäumen nicht mehr.

Mein Timer soll im Sekundentakt hochzählen. Ich verwende dazu den 8-bit 
Timer0 des ATMEGA48 und einen Quarz mit 3.6864MHz.

Nun soll der Timer alle 10ms einen Interrupt auslösen und die Variablen 
ms, sek und min entsprechend erhöhen.

Nur zählt der Timer nicht im Sekundentakt sondern sek wird nur alle 4-5 
Sekunden erhöht.

Folgend habe ich TCNT0 berechnet:

3686400 / 1024 = 3600Hz --> 1/3600 = 2,78e-4 s/Takt
Demnach müssen 36 Takte vergehen bis 10ms vergehen (2,78e-4 * 36 = 0.01)
D.h. TCNT0 muss auch 219 (255-36) gesetzt werden.


Worin könnte hier das Problem liegen?
1
/*
2
 * test.c
3
 *
4
 * Created: 26.09.2012 17:34:15
5
 *  Author: Mathias
6
 */ 
7

8
#define F_CPU 3686400UL
9

10
#include <avr/io.h>
11
#include <avr/interrupt.h>
12

13
uint16_t ms;
14
uint16_t sek;
15
uint16_t min;
16

17

18
int main(void)
19
{
20
  ms = 0;
21
  sek = 1;
22
  min = 0;
23
  
24
  DDRB = 0xff;
25
  
26
  //Timer0 init
27
  TCNT0 = 219;
28

29
  TCCR0B |= ((1<<CS02) | (1<<CS00)); //prescaler 1024
30
  TIMSK0 |= (1<<TOIE0); //interrupt enable
31

32
  
33
  sei();
34
  
35
  while(1)
36
  {
37
    PORTB = sek;
38
    
39
  }
40
  return 1;
41
}
42

43
ISR(TIMER0_OVF_vect)
44
{
45
  TCNT0 = 219;
46
  ms ++;
47
  if(ms == 100){
48
    ms = 0;
49
    sek++;
50
    if(sek == 60){
51
      sek = 0;
52
      min++;
53
    }
54
  }
55
}

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