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

Eine eigene Frage? Dieser Thread ist über 20 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.