Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation vereinfachen


von Ingo Uhlemann (Gast)


Lesenswert?

Hallo,

ich habe jetzt an meinem At-Mega128 ein Grafiklcd dran und habe da 
(andere Thread) auch ein Menü gestaltet was auch funktioniert.


Jetzt habe ich z.b. an PortD mehere Ausgäng verschieden beschaltet die 
auch über das Menü gesetzt werden.

Bit0-3 Steuersignale für einen eprom (Bankswitching , nur zur 
ansteuerung für 16k Bänke)
Bit4-6 Ansteuerung eines GAL´s zur Steuerung einer Speicherkonfiguration
Bit7 Für eine einzelne Steuerleitungen.

Der gesamte Port wird auch im Eeprom in einer Variable abgelegt um die 
Zustände nach dem Einschalten wieder zu setzen

NAch dem einschalten setze ich die Ports so
1
    setportd = eeprom_read_word(&setportde);
2
    setporte = eeprom_read_word(&setportee);
3
    PORTD = setportd;
4
    PORTE = setporte;

Was auch Funktioniert, die zustände werden auch richtig an den Pins 
gesetzt.

Jetzt möchte ich z.b Für die Eprom Funktion Bit0-3 setzen was ich ja so 
machen kann.
1
PORTD &= ~(1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3);
2
PORTD |= (1<<PD0);

Jetzt macht das setzen der zustände per Hand (binär) doch sehr viel 
Arbeit. Einfach wäre natürlich das ganze Hexadezimal zu setzen

0x0 - 0xF .
Wenn ich jetzt 0xF0 z.b. setzen würde dann würde ich ja die Bits 4-7 
verliereb.
Doch wie könnte ich das Realsieren ohne die Bits 4-7 zu verlieren?

Nach dem setzen soll dann der neue zustand der Ports in den EEprom 
gespeichert werden, was auch schon funktioniert.

Das bitmanipulations Tut habe ich mir auch schon angesehen und so 
funktioniert es ja schon.

Wenn man jetzt den hexwert binär wandeln könnte und dann bitweise 
setzen, dann würde das auch funktionieren.

Hat jemand für mich nen Tipp der mich hier weiter bringen würde`?

TSchau ingo

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Hi,

so ganz habe ich Dein Problem nicht verstanden.

Wenn Du die Hex Zahl direkt angibst, dann geht es genauso.
Wenn Du nur Bit 0..3 verändern willst, dann darf der Hexwert halt nur im 
Bereich 0x0 bis 0xf sein.

Bsp.:
PORTD &= ~(0x0F);  // Bit 0,1,2,3 zurücksetzen
PORTD |= (0x01);   // Bit 0 setzen

Oder hab ich Dich falsch verstanden ?

Gruss
Frank

von Ingo Uhlemann (Gast)


Lesenswert?

Hallo ja ich denke du hast mich richtig verstanden.

Ich kann also mit

PORTD &= ~(0x0F);  // Bit 0,1,2,3 zurücksetzen
PORTD |= (0x01); // Bit 1 setzen

und geht das auch so

PORTD &= ~(0xF0);
PORTD |= (0x10); ?

also die Bits 4,5,6,7 setzen?

Tschau ingo

von Matze (Gast)


Lesenswert?

>PORTD &= ~(0xF0);
>PORTD |= (0x10); ?
>
>also die Bits 4,5,6,7 setzen?

da werden aber die Bits 4,5,6,7 gelöscht und anschließend Bit 4 wieder 
gesetzt.

Wenn du nur die Bits 4,5,6,7 setzen willst dann
PORTD |= 0xF0;

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

@  Ingo Uhlemann

Mal zum Verständniss. Was passiert hier eigentlich.
Deine Fragen lassen die Vermutung zu, dass Du die   &=   |=   nicht so 
gannz verstanden hast.

Schauen wir es uns mal genauer an.

PORTD &= ~(0xF0);

 0xF0 = 11110000
~0xF0 = 00001111

Jetzt wird Port D mit sich selbst und 00001111 UND-idert.
Also werden alle Bit's mit 0 zurückgesetzt, die Bits mit 1 werden "in 
Ruhe gelassen".  Die UND Verknüpfung bewirkt, dass die oberen 4 Bit 
gelöscht werden, egal ob davon schon das ein oder andere Bit gelöscht 
war.

Zu beachten ist :
Dort steht  &=  nicht einfach nur  =
PORTD &= 0xF0  ist das gleiche wie   PORTD = PORTD & 0xF0

Bei |= ist es das gleiche Spiel.
PORTD |= 0xF0  ist das gleiche wie   PORTD = PORTD | 0xF0

Also werden die unteren 4 Bit "in Ruhe gelassen" und die oberen 4 Bits 
gesetzt.  Die ODER Verknüpfung bewirkt, dass die oberen 4 Bit gesetzt 
werden, egal ob davon schon das ein oder andere Bit gesetzt war.

Klar ?

Gruss
Frank

von Ingo Uhlemann (Gast)


Lesenswert?

Vielen Vielen dank, jetzt hat es bei mir klick gemacht. Ja so ein 
momentan muß erstmal kommen.

Ich werde das heute Nachmittag gleich testen.

TSchau Ingo

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.