Hallo Ich habe folgendes Problem ! Ich verwende eine PIC 18f4550 und programmiere in MPlab(C). Also ich habe folgende werte : x[0]; x[1]; x[2]; x[3]; usw bis x[15]; Nun will ich diese werte in eine binär Zahl umwandeln und diese über die serielle Schnittstelle verschicken um damit weiterarbeiten zu können . Also hat jmd eine Idee wie ich bei der umwandlung vorgehen kann ??? für hilfe wäre ich sehr dankbar !! mfg Alex
Meinst du sowas?
1 | void usart_put_bin16(uint16_t c) |
2 | {
|
3 | int8_t i; |
4 | char tmp[17]; |
5 | |
6 | for(i = 15; i >= 0; --i) { |
7 | tmp[15-i] = c&(1<<i) ? '1' : '0'; |
8 | }
|
9 | tmp[16] = '\0'; |
10 | |
11 | usart_puts(tmp); |
12 | }
|
> Also ich habe folgende werte : Und da drin steht (quasi als String) z.B. die Zahlenfolge "0101110010101001"? Was ist das MSB, was das LSB? > Nun will ich diese werte in eine binär Zahl umwandeln Diese Zahl ist (wenn MSB links und LSB rechts) binär 0101110010101001 und das ist dezimal 23721. Und du willst dann also 2, 3, 7, 2, 1 über die SIO verschicken?
also im prinzip sieht das so aus ... x[0]=1; ... wobei hier 0 die laufvariable darstellen soll x[1]=1; x[2]=0; x[3]=1; usw dann soll die zusammengefügte zahl 1101.... sein ! mfg alex
Senden:
1 | int8_t i; |
2 | for(i = 0; i < 16; i++) { |
3 | meine_sende_funktion_für_ein_zeichen(x[i] ? '1' : '0'); |
4 | }
|
Zusammenführen:
1 | int8_t i; |
2 | int16_t zahl; |
3 | for(i = 0; i < 16; i++) { |
4 | zahl |= x[i]; |
5 | zahl <<= 1; |
6 | }
|
Hab ich dich jetzt richtig verstanden?
jop genau so sollte das funktionieren !! Jedoch das senden wollte ich mit printf() realisiren ... aber das sollte nicht das problem darstellen ... Aber vielen dank für die unterstützung! mfg alex
tobi schrieb: > Senden: >
1 | > int8_t i; |
2 | > for(i = 0; i < 16; i++) { |
3 | > meine_sende_funktion_für_ein_zeichen(x[i] ? '1' : '0'); |
4 | > } |
5 | >
|
> Zusammenführen: >
1 | > int8_t i; |
2 | > int16_t zahl; |
3 | > for(i = 0; i < 16; i++) { |
4 | > zahl |= x[i]; |
5 | > zahl <<= 1; |
6 | > } |
7 | >
|
So wird aber nach dem letzten Bit nochmal geshiftet! In dieser Variante wird dagegen zu Anfang einmal überflüssigerweise geschoben, dafür das letzte Bit nicht mehr:
1 | int8_t i; |
2 | int16_t zahl = 0; |
3 | for(i = 0; i < 16; i++) { |
4 | zahl <<= 1; |
5 | zahl |= x[i]; |
6 | }
|
> ...
Noch ne frage ... kann ich die selbe methode verwenden um auch größere zahlen zusammenzufügen ...zb 32 bit ?? klarerweiße muss i < 32 festgelegt werden ... aber würde das prizipiell funktionieren ??
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.