ATmega168: Problem mit Zähler

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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.