Forum: Compiler & IDEs 16-Bit in 5-stellige BCD-Zahl


von Marchello (Gast)


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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von pumpkin (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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?

von pumpkin (Gast)


Lesenswert?

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

von Falk (Gast)


Lesenswert?

@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

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

In Assembler war das Thema hier mal erörtert:
Beitrag "variable auf lcd ausgeben (assembler)"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

itoa() ist auch in Assembler implementiert. ;-)

von Marchello (Gast)


Lesenswert?

@ pumpkin:

Vielen Dannk für dein Beispielcode, jetzt habe ich mein Problem gelöst! 
Funktioniert gut! Danke!

von pumpkin (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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).

von pumpkin (Gast)


Lesenswert?

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

pumpkin

von Peter D. (peda)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.