Muxer/Demuxer adressieren - Problem mit Bitoperationen

OP #5027448
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:
1
void Set_RCV (uint8_t bits) // Low Byte von PORTB
2
{
3
  uint8_t byte;
4

5
  byte = (PORTB &= 0x0f);
6
  byte |= bits;
7
  
8
  PORTB = byte;
9
}
10

11
void Set_SND (uint8_t bits) // High Byte von PORTB
12
{
13
  uint8_t byte;
14
  
15
  byte = (PORTB &= 0xf0);
16
  byte |= (bits <<4);
17
  
18
  PORTB = byte;
19
}

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

4
for (x=1;x<=16;x++)
5
{
6
  Set_SND(x);
7
  
8
  for (y=1;y<=16;y++)
9
  {
10
    lcd_string_xy(0,0,"SEND:     ");
11
    lcd_number_xy(11,0,x,2,32);
12

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

16
    Set_RCV(y);
17

18
    btnpress(2);
19
  }
20
}

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
#5027463
Du willst die relevanten Bits löschen, dazu musst Du die Maske 
invertieren:
1
void Set_RCV (uint8_t bits) // Low Byte von PORTB
2
{
3
  uint8_t byte;
4

5
  byte = (PORTB &= ~0x0f);
6
  byte |= bits;
7
  
8
  PORTB = byte;
9
}
10

11
void Set_SND (uint8_t bits) // High Byte von PORTB
12
{
13
  uint8_t byte;
14
  
15
  byte = (PORTB &= ~0xf0);
16
  byte |= (bits <<4);
17
  
18
  PORTB = byte;
19
}

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.