Forum: Compiler & IDEs H und L Byte in ein Integer umwandeln


von Michael J. (Gast)


Lesenswert?

Hallo,

ich benutze einen ATMega8 und den GCC.
Jetzt möchte ich den 16 Bit Zählerstand ( H und L Byte) in ein Integer
Wert umwandeln.
Welche Möglichkeiten habe ich und welche ist die beste ?

Die Suchfunktion hat mir leider nicht weitergeholfen.

mit freundlichen Grüßen

Michael

von Eugen Dischke (Gast)


Lesenswert?

int v
char valh
char vall

v=0;
v = v | (valh<<8);
v = v | vall;
so in der art müsste es sein
MfG
eugen dischke

von Joerg Wunsch (Gast)


Lesenswert?

Oder einfach gar nicht erst den H- und L-Wert separat auslesen,
sondern stattdessen gleich das 16-bit Pseudoregister:

mycnt = TCNT1;

von Michael J. (Gast)


Lesenswert?

Danke,

ich wußte gar nicht, das es ein 16 bit Pseudoregister gibt.
Im Atmel Datenblatt steht unter der Registerzusammenfassung nichts.
Ist es ein echtes Register,das im AVR vorhanden ist, oder ist es
eine spezielle GCC Funktion ?

Die Lösung ist natürlich besser, denn wenn sich zwischen dem einlesen
der beiden Bytes durch einen Übertrag auf einem der beiden Bytes was
ändert, dann stimmt der gesamte Wert natürlich nicht mehr.
(Wenn der Timer weiterläuft).


Michael

von Joerg Wunsch (Gast)


Lesenswert?

Das ist eine avr-libc/avr-gcc Implementierung.  Daher auch
,,Pseudoregister'', physisch wird das natürlich in zwei 8-bit
Registerzugriffe umgesetzt, anders geht's ja gar nicht.

von Ronny Schulz (Gast)


Lesenswert?

und für die die gerne rechnen und nicht mit Bits schieben, das gleiche
wie oben:

v = valh * 256 + vall;

von Roger K. (roschee)


Lesenswert?

In welcher Library finde ich die Funktion mycnt


Gruss

Roger

von Stefan E. (sternst)


Lesenswert?

Roger Koller wrote:
> In welcher Library finde ich die Funktion mycnt

Soll das ein Aprilscherz sein?

von Franz (Gast)


Lesenswert?

Roger Koller wrote:
> In welcher Library finde ich die Funktion mycnt

Der war echt gut. schenkelklopf

von Roger K. (roschee)


Lesenswert?

Eigentlich nicht.

Ich wollte diesen Ausdruck mycnt = TCNT1; bei mir als Variable 
definieren,
aber leider kennt der Compiler diesen Ausdruck nicht.
Ich wollte auch nur den 16bit Timer Zustand einfach so wie oben 
beschrieben uebernehmen und Ihn nicht einzeln zusammenbauen wie
z.B. Timer_Gesamt=((TCNT1H*256)+TCNT1L);


Gruss

Roger

von hans (Gast)


Lesenswert?

geht nur auf dem myAVR (sagt ja der Name)!
Wenn du ein STK500 hast => Pech !

von Roger K. (roschee)


Lesenswert?

Auch gut, ich habe einen STK500.

Habe also am 1. April Pech gehabt,
aber ich kann ja die Funktion wie oben zusammensetzten.


Gruss

Roger

von hans (Gast)


Lesenswert?


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.