Forum: Mikrocontroller und Digitale Elektronik Array und schiebeoperator problem.


von Paul S. (paulszymanski)


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...

von Thomas E. (thomase)


Lesenswert?

Paul Szymanski schrieb:
> PORTA am 4. pin

pin0
pin1
pin2
pin3
pni4

welches ist denn nun der 4.pin? pin3 oder pin4?

mfg.

von Paul S. (paulszymanski)


Lesenswert?

pin3

von Thomas E. (thomase)


Lesenswert?

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

> Der pullup an PORTA am 4. pin sollte somit ausgeschaltet sein, dass

Warum soll Pin3 ausgeschaltet sein? Du hast ihn gerade eingeschaltet.
Pin0, Pin1, Pin3 sind ein, der Rest auf 0.

mfg.

von Paul S. (paulszymanski)


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.

von Thomas E. (thomase)


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.

von Paul S. (paulszymanski)


Lesenswert?

Danke :) dies funktioniert... jetzt hab ich aber ein anderes problem :(

von Paul S. (paulszymanski)


Lesenswert?

Stimmt dann muss ich das ja per DDRA aul eingang setzten...

von Thomas E. (thomase)


Lesenswert?

Paul Szymanski schrieb:
> Stimmt dann muss ich das ja per DDRA aul eingang setzten...

Sonst wird Ausgang kurzgeschlossen. Da machst du ihn langsam aber sicher 
kaputt.

mfg.

von Paul S. (paulszymanski)


Lesenswert?

hab jetzt nochmal überlegt. ich muss den zustand des pullups wissen, 
und nicht des eingangssignals. und dies wird doch so gemacht, wie ich es 
oben gemacht hab!?!

von Thomas E. (thomase)


Lesenswert?

Paul Szymanski schrieb:
> und dies wird doch so gemacht, wie ich es
>
> oben gemacht hab!?!

Richtig.

mfg.

von Paul S. (paulszymanski)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.