Mega16 Timer0-Problem

Gast #265904
Lesenswert?
• ▲
▼
Moin,

ich habe eine dummes Problem mit dem Timer0 (?), dessen Ursache ich
einfach nicht erkenne.

Gegeben ist eine Steuerung (4 MHz), die in Abhängigkeit von einigen
Schaltern, Tastern und analogen Sensoren 3 Verbraucher schaltet. An die
Steuerung ist ein 4x20-Display angeschlossen.
Die Hauptschleife benötigt derzeit ca. 400msec für einen Durchlauf.

Timer2 ist als einfacher Timer mit Überlauf-Interrupt (40msec)
konfiguriert, umfasst das Hochzählen einer Variablen und eine Handvoll
einfacher Vergleiche; Codelänge knapp 20 Instruktionen, kein
Funktionsaufruf.

Timer1 ist ebenfalls ein einfacher Timer mit Überlauf-Interrupt. Er
liefert einen 1sec-Takt für diverse Zeitsteuerungen; Codelänge ca. 100
Instruktionen, kein Funktionsaufruf.
Die Zeitsteuerung funktioniert einwandfrei bis auf die folgende
Ausnahme:

Timer0 zählt Flanken am Eingang T0 und soll als 'rudimentärer'
Frequenzzähler (max. ca. 1kHz) dienen. Die Flanken werden, gesteuert
von Timer1 1 Sekunde lang gezählt.

Initialisierung von Timer0:
   {
   TCCR0 = 0x00;
   TCNT0 = 0x00;
   OCR0  = 0x00;
   TCCR0 = 0x07;
   }

Interrupt-Routine Timer0:
   {
   TCNT0 = 0x00;
   iFrequenz += 256;
   }

'Messung' in Timer1:

   {
   ...
   iFrequenz += TCNT0;
   iSpeed = iFrequenz; //Übergabe an main()
   iFrequenz = 0;
   TCNT0 = 0x00;
   ...

iFrequenz und iSpeed sind globale Variablen; unsigned int, 2 Byte, 0 -
65xxx.

Das Problem:
Ab und an wird der korrekte Wert angezeigt. Aber obwohl das Signal
ständig anliegt (Messung per Oszi), eben nicht ständig.
Teilweise wird die korrekte Frequenz im Wechsel mit 0 angezeigt,
teilweise im Wechsel mit irgeneiner Zahl. Dabei schliesse ich einen
int-Überlauf aus.

Warum funktioniert das nicht?
Wass habe ich übersehen?


Vielen Dank im Voraus,

Udo

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