mikrocontroller.net

Forum: Compiler & IDEs aus zwei ascii ein uint8_t machen


Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: pittbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
x = (ziff1 - '0') * 10 + (ziff2 - '0');

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm... ich meinte so klein wie möglich

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit oder ohne Optimierungen?

Autor: pittbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es nicht einfacher sich die Daten zu merken bevor sie in ASCII
umgewandelt und in den LCD Buffer geschrieben werden?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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';

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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';

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

vielen Dank an dieser Stelle. Es gab ein paar ganz gute Vorschläge, die
ich mal ausprobieren werde.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.