Forum: Mikrocontroller und Digitale Elektronik UI16 -> BCD Wandlung


von Boxi B. (boxi)


Lesenswert?

Moin,

habe mir eine Funktion geschrieben, die eine unsigned 16bit Variable für 
einen Wertebereich 0..9999 BCD-codiert. Größere Werte resultieren in 
Hexadezimalen Zeichen für die Tausender-Stelle. Das wird aber an anderer 
Stelle abgefangen:
1
/**
2
 * \brief BCD-konvertierten Wert des Arguments zurückgeben
3
 *
4
 **/
5
UI16 ui16_bcd(UI16 arg)
6
{
7
  UI16 tausender, hunderter, zehner, einer;
8
9
  tausender = arg / 1000;
10
  arg -= tausender * 1000;
11
  hunderter = arg / 100;
12
  arg -= hunderter * 100;
13
  zehner = arg / 10;
14
  arg -= zehner * 10;
15
  einer = arg;
16
  
17
  return (tausender << 12) | (hunderter << 8) | (zehner << 4) | einer;
18
}

Allerdings braucht die durch die vielen Multiplikationen und Divisionen 
jede Menge Platz im Flash und damit auch Laufzeit. Die Funktion wird mit 
avr-gcc für einen ATtiny85 kompiliert.

Da hat doch bestimmt jemand ne Ahnung, wie man das geschickter wandeln 
kann...

Danke für eure Beiträge
Boxi

von crazy horse (Gast)


Lesenswert?

viel Platz brauchen viele Multiplikationen/Divisionen nicht, da jedesmal 
diesselbe Funktion aufgerufen wird. Es beschränkt sich also auf 
Parameterübergabe und Funktionsaufruf.
Geht es um Geschwindigkeit, soll wohl die Subtraktionsmethode was 
schneller sein.
Eine weitere Hilfe wäre für dich der %-Operator. Der liefert den Rest 
einer Division.

von Boxi B. (boxi)


Lesenswert?

% (modulo) is gefährlich, weil der auch in übelste Divisionen übersetzt 
wird. Außer zur Kompilierung steht schon fest, dass mit 2er-Potenzen 
operiert wird.

Mir kommt es hauptsächlich auf Codegröße an.

von Falk B. (falk)


Lesenswert?

Siehe Festkommaarithmetik, itoa().

MFg
Falk

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.