www.mikrocontroller.net

Forum: GCC 16-Bit in 5-stellige BCD-Zahl


Autor: Marchello (Gast)
Datum:

Hallo!

Ich habe ein Problem, bei einem Rechteckgenerator muss ich mit einem
Counter während einer Sekunde die Impulse zählen und diese 16-Bit
Binärzahl danach auf fünf 7-Segment-Anzeigen in Form einer 5-stelligen
BCD-Zahl ausgeben(für jede Stelle eine 4-Bit Zahl)! Kann mir jemand
helfen? Danke!
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Für die Integerformatierung hat die Bibliothek Funktionen wie itoa()
und sprintf().  Die würden allerdings ASCII erzeugen, davon musst du
noch eine '0' abziehen.

Du kannst dir natürlich die entsprechend äquivalenten Funktionen dann
auch gleich selbst zimmern.  Das geht mit einer fortlaufenden Division,
die man am besten mit div() macht, weil Division und Modulus dann in
einer einzigen Operation erzeugt werden.

Warum BCD ausgeben?  Mach doch die BCD-zu-7-Segment-Wandlung auch
gleich noch in der Software und steuere die Anzeigen dann multiplex
an.
Autor: pumpkin (Gast)
Datum:

warum so 'kompliziert'? nimm doch einfach den integer-typ und brech'
jede stelle runter. schematisch etwa so:
unsigned int counter;
unsigned char stellen[] = {0,0,0,0,0};  //array zum auffangen (DEBUG)

for(i = 0; i <= 4; i++)        //int fünfstellig
{
   stellen[i] = counter % 10;  //liefert die unterste stelle
   counter /= 10;              //eins nach rechts
}

vllt ist das was für dich.

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

Das ist doch nichts anderes als das, was ich beschrieben habe, nur
dass du zwei Divisionen pro Runde brauchst (eine für die Division
selbst und eine zweite für den Modulus).  Genau das vermeidet man
mit der Benutzung von div().

Hast du dir eigentlich die Mühe gemacht, meine Beschreibung überhaupt
zu verstehen?
Autor: pumpkin (Gast)
Datum:

nö. weil ich itoa gelesen hab isses mir gleich eiskalt den rücken runter
und ich hab nich weitergelesen. du hast recht. ich nicht.

pumpkin
Autor: Falk (Gast)
Datum:

@pumpkin

>nö. weil ich itoa gelesen hab isses mir gleich eiskalt den rücken runter
>und ich hab nich weitergelesen.

Was ist an itoa so schlimm?

MFG
Falk
Autor: Christoph Kessler (db1uq) (Gast)
Datum:

In Assembler war das Thema hier mal erörtert:
Beitrag "variable auf lcd ausgeben (assembler)"
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

itoa() ist auch in Assembler implementiert. ;-)
Autor: Marchello (Gast)
Datum:

@ pumpkin:

Vielen Dannk für dein Beispielcode, jetzt habe ich mein Problem gelöst!
Funktioniert gut! Danke!
Autor: pumpkin (Gast)
Datum:

@Falk:
abgesehen davon, dass es eine unnütze und langsame funktion auf einem µC
ist eigentlich nix. darüber kann man meinetwegen auch gerne anders
denken.

@Marchello:
kein ding. ein wenig beispielcode ist imho meist besser als ...


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

pumpkin wrote:

(über itoa())

> abgesehen davon, dass es eine unnütze und langsame funktion auf
> einem µC ist eigentlich nix.

Ach, und du hast sie gegen deine Version auch verglichen, ja?

Selbst wenn du die doppelte Division bei dir rausnimmst, würde ich
fast noch meine (nicht vorhandene :) Perücke verwetten, dass deine
Version langsamer ist als das itoa() aus der Bibliothek...

Mir dünkt, du hast das mit sprintf() verwechselt (was ja einen ganz
anderen Fokus hat).
Autor: pumpkin (Gast)
Datum:

wer weess dit schon so jenau, wa Jörg.

pumpkin
Autor: Peter Dannegger (peda)
Datum:

Egal wie mans nimmt, auf ner CPU ohne Divisionsbefehl ist die Division
immer schnarchlahm.

Wirklich schnell ist die wechselseitige Subtraktion/Addition:

http://www.mikrocontroller.net/attachment/292/BCD32b.asm

Und hier noch die etwas langsamere C-Version:

Beitrag "Zahlenausgabe"


Man sollte aber dran denken, daß der Flaschenhals nicht die
Zahlenwandlung, sondern der langsame Mensch ist.

Mehr als etwa 5 Werte pro Sekunde kann er nicht erfassen.

Deshalb geben auch Multimeter nur etwa 3..5 Werte aus und nicht, weil
sie es nicht schneller könnten.

Daher ists also ziemlich sinnfrei um einige ms zu feilschen.


Peter

P.S.:
In spätestens 14 Tagen fragt wieder einer genau das gleiche, statt mal
in die Codesammlung oder ins C-Buch zu gucken.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net