Hallo, ich würde gern wissen ob jemand schon mal zwei ascii-Zeichen (z.B. aus einem LCD-Buffer) in ein unsigned char gewandelt hat? Gibt es irgendwo eine fertige Funktion oder muss ich mir die Zahl mittels Multiplikation selbst stricken? Gruß Slowflyer
normalerweise passen in ein uint8_t keine zwei zeichen. wenn du allerdings nur ziffern hast (z.b. bcd-kodiert) dann könnte das gehen. uint8_t packed = (bcd_left << 4) | (bcd_right & 0x0f);
Das zwei da nicht reinpassen ist mir klar. Scheinbar hab ich mein Problem nicht deutlich genug dargestellt. Ich versuch das Problem mal an einem Beispiel klarer zu umreißen: '2' und '3' als ASCII in 23 (dezimal) oder 0x17(hex) umwandeln.
Du suchst atoi() (für beliebig lange Strings). Für nur zwei Ziffern, bei denen auch garantiert ist, dass es Ziffern sind, geht natürlich auch
1 | x = (ziff1 - '0') * 10 + (ziff2 - '0'); |
Exakt das habe ich mir auch gerade überlegt, dachte nur es gäbe vielleicht einen schlanken,schnellen Code (ich brauch diese Fkt ziemlich oft. Versuche es erstmal so, Danke!
Wenn ich mir das im Disassembler anschaue, beinhaltet die Fkt: int8_t a2toi (int8_t zahl1, int8_t zahl2) { return ((zahl1-0x30)*10+(zahl2-0x30)); } ca. 50 Assembleranweisungen. Da ich den µC stromsparend betreibe und die Taktfrequenz niedrig halten möchte, bekomme ich durch die Codelänge ein Timing-Problem. Habe gehofft, das es irgendwie schneller geht und ich die Taktfrequenz nicht erhöhen muss.
du kannst die multiplikation rausschmeissen, vielleicht wird es dadurch besser. bei mikrocontrollern soll sowas ja manchmal wunder wirken: --> x * 10 == (x<<3) + (x<<1); d.h. aus return (zahl1-0x30)*10+(zahl2-0x30); könnteste sowas machen: x = zahl1-0x30; return (x<<3) + x + x + zahl2-0x30;
Ist es nicht einfacher sich die Daten zu merken bevor sie in ASCII umgewandelt und in den LCD Buffer geschrieben werden?
> d.h. aus > return (zahl1-0x30)*10+(zahl2-0x30); > könnteste sowas machen: > x = zahl1-0x30; > return (x<<3) + x + x + zahl2-0x30; Ich biete ein: x = (zahl1 - '0') << 1; return (x<<2) + x + zahl2 - '0';
Von mir auch einer, für Leute mit genug Speicher: static unsigned char a[] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}; ... return a[zahl1 - '0'] + zahl2 - '0';
Hallo Leute, vielen Dank an dieser Stelle. Es gab ein paar ganz gute Vorschläge, die ich mal ausprobieren werde.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.