Forum: Mikrocontroller und Digitale Elektronik C-Code für Konvertierung von Binär nach einzelnen Dezimalstellen


von Dennis (Gast)


Lesenswert?

Hallo leute,

also erst einmal ich bin neu hier und habe auch schon etliche stunden 
das i-net durchsucht.

Controller: ATmega 8
7Segment Anzeige: a bis h an PortD (0-7) / Anzeige 1-3 an PortC (0-2)

Zu meinem Problem,
Ich möchte einen Temperaturwert von 0 - 125 °C an einer 3 stelliegen 7 
Segment Anzeige anzeigen lassen. Ich habe aber nun das Problem das ich 
nicht genau weiß wie ich die Binärzahl in einzelne Dezimalstellen in der 
"Hochsprache C" umwandeln kann. Die richtige Pinausgabe an den Ports mit 
hilfe eines Datenarrays umzuwandeln bekomme ich hin.
Es wäre super wenn mir mal einer den Quelltext für ein C-Code exmaple 
posten würde (habe nur assembler codes gefunden), damit ich mich dort 
reinarbeiten kann.

MfG Dennis

von Christopher G. (cbg)


Lesenswert?

1
uint8_t num, i;
2
char buf[3];
3
4
for(i = 0; num >= 100; i++, num -= 100);
5
buf[0] = '0'+i;
6
for(i = 0; num >= 10; i++, num -= 10);
7
buf[1] = '0'+i;
8
buf[2] = '0'+num;

von Dennis (Gast)


Lesenswert?

Wow das ging schnell Christopher,
ersteinmal danke für deine Antwort.

Hab noch ein paar kurze fragen dazu.

num ist meine binärzahl die ich habe, oder?

Und aus buf kann ich dann später die einzelne dezimal stelle 
herausziehen, oder?
Mit      Dezimalstelle0 = buff[0];
Danach steht dann in Dezimalstelle0 meine einer werte.

Wäre echt nochmal dankbar für ne Antwort..

von Christopher G. (cbg)


Lesenswert?

Ja, num ist eine Zahl von 0 bis 255. In buf[0] ist die 100er Stelle, in 
buf[1] die 10er Stelle und in buf[2] die 1er Stelle. Alles als ASCII 
character.

Ist jetzt nicht bös gemeint, aber kauf dir ein Buch über C oder lies ein 
paar Tutorials durch. Das ist Grundwissen.

von Andreas B. (Gast)


Lesenswert?

Für die 7 Segment Anzeigen braucht man wohl kaum ASCII sondern direkt 
die Werte, lass da einfach die Addition auf '0' weg (also "buf[0] = i;" 
usw.).

von Dennis (Gast)


Lesenswert?

Super danke für deine Antwort. Ja werd mir mal noch nen paar tutorials 
durchlesen müssen.

Hast mir aber sehr geholfen, danke

Gruß Dennis

von Dennis (Gast)


Lesenswert?

@ Andreas,
Macht das einen Unterschied ob ich '0'+i mache?
Dachte das is nur vom Datentyp abhängig.

MfG Dennis

von Andreas B. (Gast)


Lesenswert?

Vorsicht: '0' ist nicht die Zahl 0, sondern das (ASCII-)Zeichen 0, also 
in Wirklichkeit die Zahl 48. Weil in ASCII alle Dezimalziffern 
hintereinander aufsteigend liegen, kann man eben durch Addition mit 48 
(also '0') das passende ASCII-Zeichen einer Dezimalziffer erhalten.

von Dennis (Gast)


Lesenswert?

Achso,

also für mein 7 segment display einfach die '0' weglassen.

wollte das so machen:

uint8_t num, i;
char buf[3];

for(i = 0; num >= 100; i++, num -= 100);
buf[0] = 0+i;
for(i = 0; num >= 10; i++, num -= 10);
buf[1] = 0+i;
buf[2] = 0+num;

unsigned char display_value[] =
{
   0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};

PORTD = display_value[buf[0]] ;   //für 100er

funktioniert das so?

von Andreas B. (Gast)


Lesenswert?

Ja, aber natürlich kann man die Additionen auf 0 komplett weglassen, 
also wie gesagt
1
for(i = 0; num >= 100; i++, num -= 100);
2
buf[0] = i;
3
for(i = 0; num >= 10; i++, num -= 10);
4
buf[1] = i;
5
buf[2] = num;

von Dennis (Gast)


Lesenswert?

Super,

vielen dank nochmal an euch,das hat mir echt weitergeholfen :).

Wäre echt super wenn alle Leute so hilfsbereit wären...

MfG Dennis

von Julian B. (julinho)


Lesenswert?

Hallo Christopher,

netter kurzer Code.

Ich habe das Problem bisher auf ähnliche Art, anstatt der Schleife habe 
ich jedoch Modulo (%) verwendet.

Ich habe beide Varianten compiliert und die Variante mit Modulo war 
einige Bytes kleiner. Ich hätte eher erwartet, das die Schleifenvariante 
weniger Code benötigt, da nicht dividiert werden muß.

Hast jemand eine Erklärung dafür?

Mfg

von Peter D. (peda)


Lesenswert?

Julian Baugatz schrieb:
> Ich hätte eher erwartet, das die Schleifenvariante
> weniger Code benötigt, da nicht dividiert werden muß.

Ist sie auch.
Aber Dein Programm enthält schon eine Division an anderer Stelle und 
daher wurde der Code für Division/Modulo bereits eingebunden.


Peter

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.