mikrocontroller.net

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


Autor: Marchello (Gast)
Datum:

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

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

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

Autor: pumpkin (Gast)
Datum:

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

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

Autor: pumpkin (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

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

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
itoa() ist auch in Assembler implementiert. ;-)

Autor: Marchello (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ pumpkin:

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

Autor: pumpkin (Gast)
Datum:

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

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

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

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wer weess dit schon so jenau, wa Jörg.

pumpkin

Autor: Peter Dannegger (peda)
Datum:

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

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.