16-Bit in 5-stellige BCD-Zahl

Gast #518046
Lesenswert?
• ▲
▼
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!
Moderator Persönliche Seite #518077
Lesenswert?
• ▲
▼
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.
Gast #518300
Lesenswert?
• ▲
▼
warum so 'kompliziert'? nimm doch einfach den integer-typ und brech' 
jede stelle runter. schematisch etwa so:
1
unsigned int counter;
2
unsigned char stellen[] = {0,0,0,0,0};  //array zum auffangen (DEBUG)
3

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

vllt ist das was für dich.

pumpkin
Gast #520794
Lesenswert?
• ▲
▼
@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
Moderator Persönliche Seite #520956
Lesenswert?
• ▲
▼
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).
#521172
Lesenswert?
• ▲
▼
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.