Forum: Compiler & IDEs 16bit Timerwert in Integer speichern


von TM (Gast)


Lesenswert?

Hallo,

Habe grade ein kleines Problem mit der Byteverarbeitung von 16bit 
timerwerte.

Und zwar kann ich ja beim 16bit Timer (Timer1) des Mega8 die Timerwerte 
direkt aus TCNT1L und TCNT1H lesen. Doch wie bekomm ich diese jetzt 
zusammengefasst in eine Integer variable ?

Dies wird denk ich nicht gehen oder?:

zeitwert  = TCNT1L;
zeitwert |= TCNT1H<<8;

da beim zweiten der Lowbyte mit nach links gesetzt wird oder ?
Muss ich wirklich noch eine weitere Variable zum zwischenspeichern 
einfügen?
Und laut dem Wiki hier soll unbedingt zuerst der Lowbyte und dann der 
Highbyte ausgelesen werden! (Warum eigentlich ?)
Irgendwie steh ich da grad voll auf dem Schlauch.

Danke schon mal im Voraus

Gruß Tobias

von Oliver (Gast)


Lesenswert?

zeitwert  = TCNT1;

Den Rest macht der Compiler für dich. Das gilt für alle 16-Bit-Register 
im AVR.

Oliver

von TM (Gast)


Lesenswert?

Hey,
Dankeschön ging ja super schnell!

von Rolf Magnus (Gast)


Lesenswert?

> Dies wird denk ich nicht gehen oder?:
> zeitwert  = TCNT1L;
> zeitwert |= TCNT1H<<8;
>
> da beim zweiten der Lowbyte mit nach links gesetzt wird oder ?

TCNT1H hat nur ein Low-Byte, trotz "H" im  Namen.  Durch das Verschieben 
wird daraus erst ein High-Byte.

> Und laut dem Wiki hier soll unbedingt zuerst der Lowbyte und dann der
> Highbyte ausgelesen werden! (Warum eigentlich ?)

Weil das Timer-Register "double buffered" ist und das Lesen des 
High-Byte dem Prozessor signalisiert, daß man mit dem Lesen fertig ist. 
Wenn man es anders rum macht, bekommt man unter Umständen Werte, die 
eigentich nicht zusammengehören, weil der Timer ja weiterläuft, während 
man ihn ausliest.

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.