Forum: Mikrocontroller und Digitale Elektronik Mega8-Timer1 (16bit) scheint nur bis 256 zu zählen


von Nino K. (nino)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin soeben dabei, ein Kapazitätsmeßgerät zu programmieren, um den 
Umgang mit dem Timer und dem LCD zu erlernen. Dank des super Tutorials 
(großes Lob an den/die Ersteller!) funktioniert das meiste recht gut, 
allerdings habe ich nun doch ein kleines Timer-Problem. Vielleicht kann 
mir von Euch dazu jemand einen Tip geben...?

Das Prinzip der Messung ist einfach, hab's mir von hier abgeschaut: 
http://www.elexs.de/radio4.htm
Also habe ich eine 1-Sekunden-Warteschleife gemacht und lasse den Zähler 
1 des Mega8 die Flanken des anliegenden Signals zählen - eigentlich 
nicht schwer.

Allerdings: Es scheint, als ob der Zähler1 nur bis 256 zählen würde 
(obwohl es ein 16 Bit Timer ist). Das High-Byte bleibt immer null. (Habe 
ich zumindest mit einer Testausgabe auf das LCD unmittelbar nach dem 
Einlesen der Werte gecheckt). Für Frequenzen höher als 256 Hz liefert 
das Programm bisher nur Müll. Habe ich etwa den Timer falsch 
konfiguriert?

Pogrammcode ist angehängt. Die restlichen Programmteile bitte nicht 
kommentieren - wie gesagt: ist noch nicht fertig ;-)

Danke!
lg, Nino.

von 1.8T-Passat (Gast)


Lesenswert?

Probiere mal, erst das Low-Byte (TCNT1L) und dann das High-Byte (TCNT1H) 
auszulesen. Dies ist bei manchen 16-Bit Werten sehr wichtig. Und im 
Datenblatt ist die Reihenfolge auch als Beispiel aufgeführt.

von Nino K. (nino)


Lesenswert?

Hallo  1.8T-Passat,

danke für die rasche Antwort. Du hast recht - das war das Problem und 
jetzt funktioniert es!

Ich habe zwar im Datenblatt nachgesehen, aber die wichtige Info ist mir 
entgangen...

Nochmal danke!
lg, Nino.

von Florian P. (db1pf)


Lesenswert?

Hallo,

also beim schnellen durchschauen ist mir aufgefallen, dass du erst das 
HIGH- und dann das LOW-Register vom Timer ausließt.
Das Funktioniert so nicht, denn du ließt nicht direkt das HIGH-Register 
sondern statt dessen ein Temporärers Register. Wenn du das LOW-Byte 
ließt, wird automatisch das HIGH-Byte in das Temp-Register transferiert 
und wenn du anschließend das HIGH-Register auslesen willst kommt der 
Wert vom Temp-Register. Beim schreiben ists genau anderst rum. Also erst 
HIGH- und dann LOW-Register beschreiben.
Das mag zwar jetzt etwas komisch erscheinen, aber im Datenblatt ists so 
beschrieben. Es macht auch Sinn, denn wenn du brauchst ja immer zwei 
Zugriffe, um das komplette Register auszulesen. Wenn jetzt aber zwischen 
den beiden Zugriffen der Timer um eins erhöht wird (und im LOW-Byte 
einen Überlauf produziert) passen die beiden Werte nicht mehr zusammen. 
So ist sichergestellt dass ein (beim lesen des LOW-Registers) 
tatsächlicher Inhalt gelesen werden kann.

Hoffe ich konnte helfen,
Grüße,
Florian

von Nino K. (nino)


Lesenswert?

Hallo Florian,

danke für die ausführliche Antwort. Mit dieser Beschreibung kann ich mir 
gleich viel mehr darunter vorstellen und wenn ich eine Vorstellung habe, 
dann kann ich mir diese Sachen auch leichter merken!

Großes Lob für die klare, leicht verständliche Formulierung!
lg, Nino.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.