AVR-Controller: Byte in 2 Nibble aufteilen und nacheinander an Port senden
-
Hallo allerseits !
Ich möchte ein LCD-Display an einem AVR-Controller im 4-Bit-Modus betreiben.
Nun meine Frage:
wie kann ich die 8 bits in 2 Nibbles aufteilen und diese nacheinander an die vier zugehörigen Ausgänge senden ?
im 8-bit Modus funzt das so:outp(00101000,PORTB);
Mein Problem ist, daß ich keine Ahnung habe, wie ich das Byte aufteile in die 2 Nibbles UND wie ich die 2 Nibbles an die 4 gewollten Ausgänge (Pins am Controller) sende, ohne die anderen(4 belegten) Pins zu überschreiben.
es gibt noch eine Funktion um einen bestimmten Pin auf high oder low zu setzen,z.B.: sbi(PORTD,PD0);, aber das hilft mir im Moment auch nicht weiter...
vorerst mal Vielen Dank
Krishna
-
#include <stdio.h> // info 1: // zerlegung des bytes in zwei 4 bit werte // dies nutzt dir aber nur, wenn du dann auch diese direkt schreiben kannst void test1(void) { unsigned char data8; unsigned char data4; data8 = 0x61; // 0110 0001 data4 = data8 & 0x0f; // 0110 0001 & 0000 1111 -> 0000 0001 printf("untere vier bits = %d\n", data4); data4 = data8 >> 4; // 0110 0001 -> 0000 0110 printf("obere vier bits = %d\n", data4); } // info 2: // ausmaskieren der nicht benutzten 4 bits // einlesen des derzeitigen wertes und kombinieren mit dem neuen wert void test2(void) { unsigned char data8; unsigned char data4; unsigned char in8; unsigned char out8; // lese den aktuellen wert von der hardware (pseudo) // es gibt bestimmt eine funktion wie die outp funktion für die eingabe // falls nicht, musst du einfach selber den wert in einer variable immer // mitprotokolieren wenn du etwas an die hardware schreibst und dann // diesen wert als input zur kombination mit dem neuen wert verwenden in8 = 0x84; // 1000 0100 data8 = 0x61; // 0110 0001 // maskieren der oberen vier bits, beibehalten der unteren vier bits data4 = data8 | 0xf0; // 0110 0001 | 1111 0000 -> 1111 0001 // maskieren der unteren vier bits, beibehalten der oberen vier bits out8 = in8 | 0x0f; // 1000 0100 | 0000 1111 -> 1000 1111 // kombinieren beider werte out8 = out8 & data4; // 1000 1111 & 1111 0001 -> 1000 0001 // schreiben des kombinierten wertes an hardware (pseudo) printf("out wert = %d\n", out8); // maskieren der unteren vier bits, beibehalten der oberen vier bits data4 = data8 | 0x0f; // 0110 0001 | 0000 1111 -> 0110 1111 // maskieren der oberen vier bits, beibehalten der unteren vier bits out8 = in8 | 0xf0; // 1000 0100 | 1111 0000 -> 1111 0100 // kombinieren beider werte out8 = out8 & data4; // 1111 0100 & 0110 1111 -> 0110 0100 // schreiben des kombinierten wertes an hardware (pseudo) printf("out wert = %d\n", out8); } void main(void) { test1(); test2(); }
-
Hallo bozo,
Es hat zwar etwas gedauert, bis ich da durchgeblickt hatte, weil ich mich bisher mit Bits nicht so beschäftigt hatte, aber Dank Deiner excellenten Kommentare habe ich das dann doch verstanden.Dankeschön!
MfG
Krishna