Hi @ all Ich habe einen Datenbus der 12 Bit breit ist. Diesen möchte ich in eine Variable schreiben und dann auf einen Display ausgeben. Von Port_C nehme ich die 8 Datenbits und von Port_D die anderen 4 Datenbits. Nun weiß ich nicht wie ich diese in eine integer Variable bekomme. Bei 8Bit habe ich es immer wie folgt gemacht: buffer = PINC; Dies geht aber leider nicht bei den 12 Bits. Was gibt es denn für möchlichkeiten? Grüsse Michael
unsigned int buffer; unsigned char higbyte, lowbyte; buffer = (((unsigned int) (highbyte & 0x0F)) << 8) | lowbyte;
Wo ist das Problem?
1 | uint16_t buffer; |
2 | |
3 | buffer = PINC | ((PIND & 0x0F) << 8); |
wenn die Bits so verteilt sind: 0..7 PortC.0-7, 8..11 PortD.0-3
Die Pins sind folgendermaßen verteilt: Pin 0 bis 7 sind vom Port C Pin 8 bis 11 sind die Pins 4 bis 7 von Port D
WORD wBuffer; wBuffer = ( ((PIND & 0xF0) << 4) | PINC ); mfg, Mathias
Michael wrote: > Die Pins sind folgendermaßen verteilt: > > Pin 0 bis 7 sind vom Port C > Pin 8 bis 11 sind die Pins 4 bis 7 von Port D Naja, dann holst du dir halt mal den Inhalt vom Port D unigned char tmp; tmp = PIND; maskierst alles weg, was nicht dazugehört tmp &= 0b11110000 und schiebst die 4 Bits um 4 Stellen nach links um Platz für die noch fehlenden 8 Bits vom Port C zu kriegen. Dazu muss jetzt der Datentyp natürlich nach unsigned int wechseln. unsigned int tmp2; tmp2 = tmp << 4; damit sind die 4 Bits vom Port D schon mal an der richtigen Stelle und jetzt müssen nur noch die 8 Bits vom Port C dazu kommen. tmp2 |= PINC; Das kann man dann auch alles in einen Ausdruck zusammenfassen: tmp2 = ( ( PIND & 0xF0 ) << 4 ) | PINC;
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.