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
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.
Mauer schrieb: > bcds+=bin; > return bcds; > UARTprintf("BCD: %d\n", bcds); > } > > > Ist hier vielleicht ein Fehler drin.Danke. LOOOOOOOOOOL :-) Nee, ganz bestimmt nicht.
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.
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.
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...
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
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!
Also kann mir irgendeiner helfen, dass der code funktioniert, oder vielleicht hat jemand ja ne bessere Lösung.
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; : : :
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 | }
|
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.
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)
Dankr probier ich aus und der obige code funktioniert, habs auf 8 bit erweitert, da ich ja ein byte grösse benötige.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.