ATmega168: Problem mit Zähler

Gast #1462667
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
Gast #1462703
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
}
#1462710
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.
#1462715
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

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