Array und schiebeoperator problem.

OP #2030056
Lesenswert?

Hi,

habe folgenden Code... in den kommentaren steht, was der code macht, wie 
ich es glaube. bei google habe ich soweit auch nichts gefunden und mein 
c-buch ist noch auf dem weg.

1
void set(void) {
2
  muster[0][0] = 0b111111111;
3
  muster[0][1] = 0b111111111;
4
  muster[0][2] = 0b111111111;
5
  muster[1][0] = 0b011111111;
6
  muster[1][1] = 0b011111111;
7
  muster[1][2] = 0b011111111;
8
  muster[2][0] = 0b111111101;
9
  muster[2][1] = 0b111111101;
10
  muster[2][2] = 0b111111101;
11
  muster[3][0] = 0b111111110;
12
  muster[3][1] = 0b111111110;
13
  muster[3][2] = 0b111111110;
14
}
15

16

17
void multiplexSetColumns0(int ntesmuster) {
18
  set();
19
  PORTC = (muster[ntesmuster][0]>>1); //Dies funktioniert in der praxis
20
  uint16_t fuerporta = muster[ntesmuster][0]; // bei ntesmuster=3 gilt: fuerporta = 0b111111110
21
  fuerporta &= ~(0b111111110); // fuerporta = 0b000000001
22
  fuerporta = (fuerporta<<3); // fuerporta = 0b000001000
23
  PORTA = (fuerporta | PORTA); // wenn PORTA vorher 0b00000011 war, dann ist es nun PORTA = 0b00001011
24
}

Der pullup an PORTA am 4. pin sollte somit ausgeschaltet sein, dass 
heisst auf masse liegen. Dem ist jedoch nicht so... bevor ich die arrays 
eingeführt hatte, habe ich normale uint16_t variablen verwendet, und da 
hat es noch funktioniert... ich komme desshalb auch echt nicht auf eine 
lösung...
OP #2030146
Lesenswert?

Ja verdammt stimmt ja auch.
ich habe mich verschrieben sorry.

hier nochmal die korrigierte fassung:
1
void set(void) {
2
  muster[0][0] = 0b111111111;
3
  muster[0][1] = 0b111111111;
4
  muster[0][2] = 0b111111111;
5
  muster[1][0] = 0b011111111;
6
  muster[1][1] = 0b011111111;
7
  muster[1][2] = 0b011111111;
8
  muster[2][0] = 0b111111101;
9
  muster[2][1] = 0b111111101;
10
  muster[2][2] = 0b111111101;
11
  muster[3][0] = 0b111111110;
12
  muster[3][1] = 0b111111110;
13
  muster[3][2] = 0b111111110;
14
}
15

16

17
void multiplexSetColumns0(int ntesmuster) {
18
  set();
19
  PORTC = (muster[ntesmuster][0]>>1); //Dies funktioniert in der praxis
20
  uint16_t fuerporta = muster[ntesmuster][0]; // bei ntesmuster=3 gilt: fuerporta = 0b111111110
21
  fuerporta &= ~(0b111111110); // fuerporta = 0b000000000
22
  fuerporta = (fuerporta<<3); // fuerporta = 0b000000000
23
  PORTA = (fuerporta | PORTA); // wenn PORTA vorher 0b00000011 war, dann ist es nun PORTA = 0b00000011
24
}

der pin3 liegt am ende jedoch trotzdem auf 5V, was es nicht soll, da der 
niederwertigste bit vom muster array den pullup des pin3 konfigurieren 
soll.
#2030190
Lesenswert?

Paul Szymanski schrieb:
> PORTA = (fuerporta | PORTA); // wenn PORTA vorher 0b00000011 war, dann ist es 
nun PORTA = 0b00000011

Du verküpfst hier fuerporta nicht mit den Werten an den Pins sondern mit 
dem Portregister. Wenn du irgendwann mal eine 1 reingeschrieben hast, 
steht die da immer noch drin. Auch wenn du den Pin auf 0 gezogen hast.

PORTA = (fuerporta | PINA);

Damit verknüpfts du das, was du an den Pins hast mit fuerporta.

mfg.
OP #2030228
Lesenswert?

So!

hab des rätsels Lösung.
Ich habe immer versucht den zustand des pullups an dem pin3 zu nehmen um 
dann mit einer oder-verknüpfung mit der variable fuerporta diesen 3. pin 
zu ändern. dies läuft aber darauf hinaus, dass wenn ich einmal pin3 
einschalte, dieser immer eingeschaltet bleibt.
mit folgender änderung funktionierts:
1
void multiplexSetColumns0(int ntesmuster) {
2
  work();
3
  PORTC = (muster[ntesmuster][0]>>1);
4
  uint16_t fuerporta = muster[ntesmuster][0];
5
  fuerporta &= ~(0b1111111111111110);
6
  fuerporta = (fuerporta<<3);
7
  uint8_t fuerporta2 = (PORTA & ~(0b00001000));
8
  PORTA = (fuerporta | fuerporta2);
9
}

Danke für die Hilfe!!! :)

Grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren