Forum: PC-Programmierung Bin2bcd, Bcd2bin dringend nötig (c code)


von Mauer (Gast)


Lesenswert?

Hallo,
brauche mal dringend hilfe.
Ich bin grad dabei eine RV3029 Uhr zu Programmieren (in C) und dabei 
habe ich festgestellt, dass die werte beim einlesen der uhr in bcd 
umgewandelt, werden müssen, da die Uhr nur bcd format lesen kann und 
dann aus der uhr auszulesen und weiter zu verarbeiten müssen die bcd 
werte in binär umgewandelt werden, da c programm mit binär werten 
arbeitet.

Hat da jemand einen code für bin2bcd und bcd2bin.

Danke für euere Hilfe.

: Verschoben durch Admin
von irgendwer (Gast)


Lesenswert?

Hatten wir das nicht erst neulich?

von Klaus W. (mfgkw)


Lesenswert?

Wann ist Abgabe?

von Mauer (Gast)


Lesenswert?

Hab zwar noch einbißchen Zeit, muss aber das ganze Programm auf Funktion 
testen, erst wenn ich dies eingebaut habe kann ich weiter machen,

Ich hab zwar einen code gefunden lediglich tut er nicht das was es 
machen soll
1
uint8_t bintobcd (uint8_t bin)
2
{
3
    uint8_t bcds=0;
4
5
    while(bin>=10000)
6
    {
7
        bin-=10000;
8
    }
9
    while(bin>=1000)
10
    {
11
        bcds+=0x1000;
12
        bin-=1000;
13
    }
14
    while(bin>=100)
15
    {
16
        bcds+=0x100;
17
        bin-=100;
18
    }
19
    while(bin>=10)
20
    {
21
        bcds+=0x10;
22
        bin-=10;
23
    }
24
    bcds+=bin;
25
    return bcds;
26
    UARTprintf("BCD: %d\n", bcds);
27
}

Ist hier vielleicht ein Fehler drin.Danke.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Mauer schrieb:
> bcds+=bin;
>     return bcds;
>     UARTprintf("BCD: %d\n", bcds);
> }
>
>
> Ist hier vielleicht ein Fehler drin.Danke.

LOOOOOOOOOOL :-)
Nee, ganz bestimmt nicht.

von Peter II (Gast)


Lesenswert?

Mauer schrieb:
> Ist hier vielleicht ein Fehler drin.Danke.

bestimmt, sonst würde es ja das tun was du willst.


der code nach einen return wird selten erreicht.

von guest (Gast)


Lesenswert?

Modulo ?

von Mauer (Gast)


Lesenswert?

Na gut, dann entferne ich die letzten 2 Zeilen, zum testen will ich 
trotzdem den BCD wert ausgeben, wo kommt dann der Aufruf der Funktion 
printf() dann hin.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Mauer schrieb:
> Na gut, dann entferne ich die letzten 2 Zeilen, zum testen will ich
> trotzdem den BCD wert ausgeben, wo kommt dann der Aufruf der Funktion
> printf() dann hin.

Wenn du das noch nicht mal weisst, solltest du woanders anfangen. Back 
to the basics, oder besser gleich zu BASIC.
http://www.google.de/search?q=c%2B%2B+f%C3%BCr+dummies&hl=de&prmd=imvnsb&source=univ&tbm=shop&tbo=u&sa=X&ei=DEhCT6DUD8Oy0QXms4SQDw&ved=0CFQQrQQ

Erinnert mich irgendwie an mein ETechnikstudium, wo einige im Labor aus 
zusammengestückelten Lösungen versuchten, irgendwas zum Laufen zu 
bringen. Sind dann bei der mündlichen Abnahme alle durchgefallen.

Meine (Zweier-)Gruppe hat der damals genau 3Minuten abgefragt, für ein C 
und ein ASM Projekt. Gruppen, die nur gestückelt und zusammengesucht 
haben, wurden ne Viertelstunde oder länger gequält, und durften das 
Labor wiederholen...

von Mauer (Gast)


Lesenswert?

Also ich habe den code aus diesem Beitrag übernommen, hatte doch dazu 
nur den printf hinzugefügt, in diesem beitrag hat keiner gesagt, dass 
durch return bedingt ein fehler entsteht. Wie sieht der code dann nun 
richtig aus.

PS: Ja schön, solche Aussagen bringen nunmal keinen weiter, entweder man 
hilft jemanden oder lässt es einfach

von Lars (Gast)


Lesenswert?

Mauer schrieb:
> PS: Ja schön, solche Aussagen bringen nunmal keinen weiter, entweder man
> hilft jemanden oder lässt es einfach

Ich bin für lassen, denn das "Problem" solltest du selbst lösen können!

von Mauer (Gast)


Lesenswert?

Also kann mir irgendeiner helfen, dass der code funktioniert, oder 
vielleicht hat jemand ja ne bessere Lösung.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Beim Z80 Prozessor gibt es einen Assembler-Befehl der das macht, ich 
weiß nur nicht mehr wie der hieß. (Doku lesen)

Ansonsten:
EinerStelle = Zahl % 10;
Zahl /= 10;
ZehnerStelle = Zahl % 10;
Zahl /= 10;
: : :

von Mauer (Gast)


Lesenswert?

ja da hab ich sowas gefunden gehabt, aber dies ist doch für dezimal 
zahlen geeignet, jedoch will ich doch eine binärzahl in bcd umwandeln, 
oder sollte ich erst eine binär in dezimal umwandeln und dann in bcd und 
umgekehrt.

1
void Convert_Int_Bcd ( unsigned long int Zahl)           //7-stellig
2
        {
3
    unsigned long BCD_Numb[7];
4
        BCD_Numb[1] = Zahl % 10;
5
        Zahl = Zahl/10;
6
        BCD_Numb[2] = Zahl % 10;
7
        Zahl = Zahl/10;
8
        BCD_Numb[3] = Zahl % 10;
9
        Zahl = Zahl/10;
10
        BCD_Numb[4] = Zahl % 10;
11
        Zahl = Zahl/10;
12
        BCD_Numb[5] = Zahl % 10;
13
        Zahl = Zahl/10;
14
        BCD_Numb[6] = Zahl % 10;
15
        Zahl = Zahl/10;
16
        BCD_Numb[7] = Zahl % 10;
17
18
        }

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

char *p, buf[11];

sprintf( buf, "%010d", zahl);
for ( p=buf; *p; p+=2)
  printf( "%.2s ", p);

Zu einfach ... ;)

Trennt das schon mal auf. Dann jeweils die Nibble schieben.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

1
unsigned long Convert_Int_Bcd ( unsigned long int Zahl)           //7-stellig
2
        {
3
    unsigned long BCD_Numb;
4
        BCD_Numb = Zahl % 10;
5
        Zahl = Zahl/10;
6
        BCD_Numb |= ((Zahl % 10) << 4);
7
        Zahl = Zahl/10;
8
        BCD_Numb |= ((Zahl % 10) << 8);
9
        Zahl = Zahl/10;
10
        BCD_Numb |= ((Zahl % 10) << 12);
11
        Zahl = Zahl/10;
12
        BCD_Numb |= ((Zahl % 10) << 16);
13
: :
14
        return BCD_Numb;
15
        }

Geschicktes Anwenden der Operatoren führen zu gewünschten Ergebnissen. 
Kapitel 1 in jedem C Buch mal durchlesen (oder google mal nach 
Operatoren für C)

von Mauer (Gast)


Lesenswert?

Dankr probier ich aus und der obige code funktioniert, habs auf 8 bit 
erweitert, da ich ja ein byte grösse benötige.

von Karl H. (kbuchegg)


Lesenswert?

Irgendwie hab ich das Gefühl, dir ist überhaupt nicht bewusst, was BCD 
eigentlich ist.
Denn für ein einzelnes Byte ist das wirklich Pipifax. Da muss man noch 
nicht einmal dividieren. 1 mal maskieren, 1 Vergleich und 1 Addition, 
und die Chose ist gegessen.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Markus Müller schrieb:
> Beim Z80 Prozessor gibt es einen Assembler-Befehl der das macht, ich
> weiß nur nicht mehr wie der hieß. (Doku lesen)

Der x86 hat ja auch so Altlasten :)

http://en.wikipedia.org/wiki/Intel_BCD_opcode

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.