mikrocontroller.net

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


Autor: Sören D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sören D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: So erhöhe ich die Variable:

ISR(TIMER0_OVF_vect)
  {
    tov0Counter++;
  }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören D. schrieb:

> Jemand
> eine idee waoran das liegen kann ?

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

Autor: Sören D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm:
int tov0Counter = 0;

ISR(TIMER0_OVF_vect)
  {
    tov0Counter++;
  }

int main(void)
{

DDRB = (0<<DDB2) | (1<<DDB4) | (1<<DDB5); 
DDRC = (0<<DDC0) | (0<<DDC1) | (0<<DDC2) | (0<<DDC3); 
DDRD = (0<<DDD2) | (0<<DDD3) | (1<<DDD5) | (1<<DDD6) | (1<<DDD7);

PORTB = (0x00); 
PORTC = (0x00); 
PORTD = (0x00); 
                   
sei();                                 
 TIMSK0=(1<<TOIE0);                       
TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS10);                     
EICRA = (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11);     
EIMSK = (1<<INT0) | (1<<INT1);

while(1)
  {
  if(tov0Counter == 300)
  sbi(PORTD, 5);
  }
return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören D. schrieb:

> int tov0Counter = 0;
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.

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sören D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ! Funktioniert jetzt !

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.