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!
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.
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
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?
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
@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
@ pumpkin: Vielen Dannk für dein Beispielcode, jetzt habe ich mein Problem gelöst! Funktioniert gut! Danke!
@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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.