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

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