mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Muxer/Demuxer adressieren - Problem mit Bitoperationen


Autor: Holger K. (zaldo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich beiße mir gerade an - wahrscheinlich - einem typischen 
Anfangerfehler die Zähne aus.

Ich habe an einem Mega32 Port zwei 16 in 1 Multiplexer/Demultiplexer 
angeschlossen, die ich adressieren möchte. Der "Receive" Muxer hängt 
dabei an PB0..PB3 und der "Send" an PB4..PB7

Ich habe nun folgende Funktionen geschrieben:
void Set_RCV (uint8_t bits) // Low Byte von PORTB
{
  uint8_t byte;

  byte = (PORTB &= 0x0f);
  byte |= bits;
  
  PORTB = byte;
}

void Set_SND (uint8_t bits) // High Byte von PORTB
{
  uint8_t byte;
  
  byte = (PORTB &= 0xf0);
  byte |= (bits <<4);
  
  PORTB = byte;
}

und benutze folgendes Testprogramm (der relevante Ausschnitt)
int x=1;
int y=1;

for (x=1;x<=16;x++)
{
  Set_SND(x);
  
  for (y=1;y<=16;y++)
  {
    lcd_string_xy(0,0,"SEND:     ");
    lcd_number_xy(11,0,x,2,32);

    lcd_string_xy(0,1,"RECEIVE:  ");
    lcd_number_xy(11,1,y,2,32);

    Set_RCV(y);

    btnpress(2);
  }
}

Die Displayausgabe dient hier nur der Visualisierung welche Werte 
gesetzt sind. btnpress(2) wartet einfach nur bis ein Taster gedrückt 
wird.

Wenn ich das Programm laufen lasse und mit dem Logiktester die Pins 
ablese beobachte ich folgendes: Auf PB0..PB3 werden die Bits zwar 
gesetzt aber nicht gelöscht. Ich schicke eine 1 und PB0 wird gesetzt. 
Ich schicke eine 2 und PB1 wird gesetzt, PB0 BLEIBT jedoch gesetzt. Bei 
einer 3 ändert sich weiter nichts, mit der 4 wird PB2 gesetzt (PB0 und 
PB1 bleiben ebenfalls gesetzt) und so weiter.

PB4..PB7 bleiben allesamt auf 0

Wo liegt meine dummer Fehler??

Danke im Voraus und beste Grüße
Holger

: Verschoben durch Moderator
Autor: Stefan K. (stefan64)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Du willst die relevanten Bits löschen, dazu musst Du die Maske 
invertieren:
void Set_RCV (uint8_t bits) // Low Byte von PORTB
{
  uint8_t byte;

  byte = (PORTB &= ~0x0f);
  byte |= bits;
  
  PORTB = byte;
}

void Set_SND (uint8_t bits) // High Byte von PORTB
{
  uint8_t byte;
  
  byte = (PORTB &= ~0xf0);
  byte |= (bits <<4);
  
  PORTB = byte;
}

Maske:            0x0f 00001111b
invertiert:      ~0x0f 11110000b

Bsp PortB = 0x15  0x15 00010101b
PORTB &= ~0x0f    0xf0 11110000b
--------------------------------
Ergebnis:         0x10 00010000b

Zweiter Fehler:
Deine Schleifen laufen von 1.. 16. Damit laufen die 4 Bits über.
Richtig ist eine Schleife von 0 .. 15.


Viele Grüße, Stefan

: Bearbeitet durch User
Autor: Holger K. (zaldo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, läuft. Danke Stefan.

Verdammt, das mit den Schleifen ist ja schon peinlich :-((((((

Gruß
Holger

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
>  byte = (PORTB &= ~0x0f);

Das sind zwei Zuweisungsoperatoren in einer Zeile.

Das willst Du nicht.

Lass den zweiten Zuweisungsoperator weg, denn sonst beschreibst Du 
PORTB.

Die Klammern sind übrigens auch überflüssig.

Also:

byte = PORTB & ~0x0f;

Autor: Holger K. (zaldo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt, hiesse ausgeschrieben byte = (PORTB = PORTB & ~0x0f) wenn ich 
richtig liege. Macht wenig Sinn. Danke. Ich lerne noch :-)

LG
Holger

Autor: Stefan K. (stefan64)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> byte = PORTB & ~0x0f;

Oh wie peinlich. Habe ich mit abgeschrieben. Asche auf mein Haupt.

Gruß, Stefan

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.