Forum: Mikrocontroller und Digitale Elektronik Hex Zahl nach Float umwandeln


von Stefan (Gast)


Lesenswert?

Hallo,

ich empfange über I2C Stromwerte von einem Atiny44A, die ich dann mit 
anderen float Werten (z.B. 5.5 oder 3.5) in Atmega8 vergleichen muss.
Ich empfange die Werte in HEX und muss Sie nun aufarbeiten wie z.B.
HEX 125 -> Decimal 293 -> den Stromwert von 29.3A
HEX 22 -> Decimal 34 -> den Stromwert von 3.4A

So nun die Frage darf ich den Wert so umwandeln?
1
unsigned char   hexCurrent; //current measurement
2
float   decCurrent; //current measurement 
3
4
decCurrent = hexCurrent * 0.1;  
5
6
if (decCurrent > 3.5)
7
{
8
    tue etwas
9
}

Gruß
Stefan

von Bastian W. (jackfrost)


Lesenswert?

Prüf doch gegen Festkomma, das ist doch einfacher.

Hex > 35 ist doch das gleiche wie Hex*0,1 > 3,5

Das erste,wird aber schneller abgearbeitet da der Atmega keine FPU hat.

Gruß JackFrost

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan schrieb:
> Ich empfange die Werte in HEX und muss Sie nun aufarbeiten wie z.B.
> HEX 125
Wieviele Bytes empfängst du (von woher) für HEX 125?
Drei Zeichen (eine '1', eine '2' und eine '5')?

Ich bin mir nicht ganz hunterprozentig sicher, ob du weißt, dass eine 
Hex-Zahl und eine Binärzahl und eine Dezimalzahl prinzipiell erst mal 
das selbe Bitmuster sind, nur eben auf andere Art interpretiert...

: Bearbeitet durch Moderator
von Jakob (Gast)


Lesenswert?

Wie er das empfängt? Schwer zu sagen...
Vielleicht über hoch-gepackte unsigned char Werte!

In meine µC-üblichen unsigned char passt nur maximal 255d.

von fop (Gast)


Lesenswert?

Stefan schrieb:
> mit
> anderen float Werten (z.B. 5.5 oder 3.5) in Atmega8 vergleichen

Float - Werte zu vergleichen ist immer wieder ein Spaß mit unerwarteten 
Wendungen. Denn meist kann die Zahl nicht haargenau so abgespeichert 
werden, wie Du sie hingetippt hast oder wie sie ausgegeben wird.
Der Tipp, Deine Fließkommakonstanten in Festkomma umzuwandeln und die 
dann zu vergleichen bringt also nicht nur Geschwindigkeitsgewinn.
Übrigens willst Du wohl eine Zeichenkette erstmal in eine Zahl wandeln.
> unsigned char   hexCurrent; //current measurement
wäre aber nur ein einziges Zeichen.
1
unsigned char   hexCurrent[42]; //current measurement
oder
1
unsigned char   *hexCurrent; //current measurement
Wäre eher eine Eingangsvariable für Deine Funktiom für den Fall, dass es 
eine Zeichenkette ist.

Es sei denn Du bekommst nur ein Byte mit dem Strom in dA (zehntel 
Ampere). Dann wäre ohne Offset ein Wert von 0 bis 25,5 A möglich.

Bei zwei Byte ohne Vorzeichen wären so bis zu 6553,5 A drinne.

Also erforsche nochmal genau, wie Dein Wert vorliegt.

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.