www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UI16 -> BCD Wandlung


Autor: Boxi Boxitec (boxi)
Datum:

Bewertung
0 lesenswert
nicht 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:
/**
 * \brief BCD-konvertierten Wert des Arguments zurückgeben
 *
 **/
UI16 ui16_bcd(UI16 arg)
{
  UI16 tausender, hunderter, zehner, einer;

  tausender = arg / 1000;
  arg -= tausender * 1000;
  hunderter = arg / 100;
  arg -= hunderter * 100;
  zehner = arg / 10;
  arg -= zehner * 10;
  einer = arg;
  
  return (tausender << 12) | (hunderter << 8) | (zehner << 4) | einer;
}

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Boxi Boxitec (boxi)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Festkommaarithmetik, itoa().

MFg
Falk

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.