UI16 -> BCD Wandlung

OP #712844
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
Gast #712852
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren