Forum: Mikrocontroller und Digitale Elektronik ATmega168: Problem mit Zähler


von Sören D. (Gast)


Lesenswert?

Hallo !

Habe folgendes Problem: Mein ATmega168 läuft mit internen 8Mhz und ich 
versuche mit Hilfe des Timer/Counter 0 bei jedem Überlauf eine Variable 
hoch zu zählen. Das funktioniert auch, nur leider etwa 100 mal schneller 
als zuvor berechnet. Der Prescaler ist auf 1024 eingestellt, so sollte 
sich eine Frequenz von ungefähr 7800Hz einstellen. Die Zählervariable 
sollte also pro sec. ca. 30 mal erhöht werden. Wenn ich sie jedoch nach 
einer sekunde auslese steht die variable zwischen 3000 und 4000 ! Jemand 
eine idee waoran das liegen kann ?

Gruß S.Dierking

von Sören D. (Gast)


Lesenswert?

PS: So erhöhe ich die Variable:

ISR(TIMER0_OVF_vect)
  {
    tov0Counter++;
  }

von Karl H. (kbuchegg)


Lesenswert?

Sören D. schrieb:

> Jemand
> eine idee waoran das liegen kann ?

zb. an einem Fehler im Programm, welches wir leider nicht kennen.

von Sören D. (Gast)


Lesenswert?

Das Programm:
1
int tov0Counter = 0;
2
3
ISR(TIMER0_OVF_vect)
4
  {
5
    tov0Counter++;
6
  }
7
8
int main(void)
9
{
10
11
DDRB = (0<<DDB2) | (1<<DDB4) | (1<<DDB5); 
12
DDRC = (0<<DDC0) | (0<<DDC1) | (0<<DDC2) | (0<<DDC3); 
13
DDRD = (0<<DDD2) | (0<<DDD3) | (1<<DDD5) | (1<<DDD6) | (1<<DDD7);
14
15
PORTB = (0x00); 
16
PORTC = (0x00); 
17
PORTD = (0x00); 
18
                   
19
sei();                                 
20
 TIMSK0=(1<<TOIE0);                       
21
TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS10);                     
22
EICRA = (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11);     
23
EIMSK = (1<<INT0) | (1<<INT1);
24
25
while(1)
26
  {
27
  if(tov0Counter == 300)
28
  sbi(PORTD, 5);
29
  }
30
return 0;
31
}

von Karl H. (kbuchegg)


Lesenswert?

Sören D. schrieb:

> int tov0Counter = 0;
1
volatile int tov0Counter = 0;


> sei();

Den sei macht man zum Schluss der Initialisierung, wenn alles 
eingerichtet ist. Du bringst ja auch zuerst die Pappkartons in Stellung, 
ehe du aus dem 2. Stock in die Kartons springst und nicht umgekehrt.

>  TIMSK0=(1<<TOIE0);
> TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS10);

CS10 hat bei der Konfiguration des Timers 0 nichts zu suchen.
Die erste Ziffer ist der Timer, die zweite die Nummer des 
Konfigurationsbits

  TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS02);

> EICRA = (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11);
> EIMSK = (1<<INT0) | (1<<INT1);

Lass die restlichen Interrupts um Himmels willen abgeschaltet, wenn du 
keinen Interrupt Handler dafür hast! Tritt ein Interrupt auf, und du 
hast keine ISR, dann greift der Default: Der Prozessor wird resettet.

von Michael W. (retikulum)


Lesenswert?

1. deine Variable muss volatile sein.
2. deine Timereinstellungen stimmen nicht, z. B. CS10 hat Timer 0 nicht. 
Das ist für den Timer 1. Timer 0 hat CS 00 01 und 02.

Das Datenblatt vom 168 habe ich nicht zur Hand, aber ich denke, dass 
Atmel die Timer, respektive die Bitnamen, bei den Megas überall gleich 
benennt.

Michael

von Sören D. (Gast)


Lesenswert?

Danke ! Funktioniert jetzt !

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.