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