mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation vereinfachen


Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
    setportd = eeprom_read_word(&setportde);
    setporte = eeprom_read_word(&setportee);
    PORTD = setportd;
    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.
PORTD &= ~(1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3);
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

Autor: Frank W. (frankw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Frank W. (frankw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.