Forum: Mikrocontroller und Digitale Elektronik Timerproblem


von Mathias S. (merzi1993)


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
}

von Karl H. (kbuchegg)


Lesenswert?

> 3.6864MHz.

> sek wird nur alle 4-5

Ich wette, wenn man nachmisst, ist der Faktor ziemlich genau 3.6

-> Dein µC arbeitet nicht mit dem Quarz sondern ist noch auf default 
1Mhz, so wie er im Auslieferungszustand war.

von Mathias S. (merzi1993)


Lesenswert?

und wie stellt ich ihn auf den Quarz ein? Muss ich da die Fuses 
irgendwie setzen?

von Karl H. (kbuchegg)


Lesenswert?

Mathias S. schrieb:
> und wie stellt ich ihn auf den Quarz ein? Muss ich da die Fuses
> irgendwie setzen?

Ja, das musst du
Einfach einen Quarz anschliessen reicht nicht.

AVR Fuses

von Stefan E. (sternst)


Lesenswert?

Und wenn du die Umstellung auf den externen Quarz geschafft hast, dann 
informiere dich mal über den CTC-Modus.

von Mathias S. (merzi1993)


Lesenswert?

Stefan Ernst schrieb:
> dann
> informiere dich mal über den CTC-Modus.

Über diesen Modus weis ich bescheid, nur wollte ich mal bei 0 
anfangen...

von Ingo L. (Gast)


Lesenswert?

1
ISR(TIMER0_OVF_vect)

Können verwirrend sein, wenn du deine ms nur bis Hundert zählst. Nenn 
den Vektor doch einfach "TIMEBASE_10MS". Somit hast du auch immer das 
Aufruinterval vor Augen.


Ingo

von Mathias S. (merzi1993)


Lesenswert?

Ingo L. schrieb:
> ISR(TIMER0_OVF_vect)
>
> Können verwirrend sein, wenn du deine ms nur bis Hundert zählst. Nenn
> den Vektor doch einfach "TIMEBASE_10MS". Somit hast du auch immer das
> Aufruinterval vor Augen.
>
>
> Ingo

Muss mit einem #define erledigt werden, oder?

von Karl H. (kbuchegg)


Lesenswert?

Ingo L. schrieb:
>
1
> ISR(TIMER0_OVF_vect)
2
>
>
> Können verwirrend sein, wenn du deine ms nur bis Hundert zählst. Nenn
> den Vektor doch einfach "TIMEBASE_10MS". Somit hast du auch immer das
> Aufruinterval vor Augen.

Der Name ist nicht verhandelbar.

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.