www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Array und schiebeoperator problem.


Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht 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.

void set(void) {
  muster[0][0] = 0b111111111;
  muster[0][1] = 0b111111111;
  muster[0][2] = 0b111111111;
  muster[1][0] = 0b011111111;
  muster[1][1] = 0b011111111;
  muster[1][2] = 0b011111111;
  muster[2][0] = 0b111111101;
  muster[2][1] = 0b111111101;
  muster[2][2] = 0b111111101;
  muster[3][0] = 0b111111110;
  muster[3][1] = 0b111111110;
  muster[3][2] = 0b111111110;
}


void multiplexSetColumns0(int ntesmuster) {
  set();
  PORTC = (muster[ntesmuster][0]>>1); //Dies funktioniert in der praxis
  uint16_t fuerporta = muster[ntesmuster][0]; // bei ntesmuster=3 gilt: fuerporta = 0b111111110
  fuerporta &= ~(0b111111110); // fuerporta = 0b000000001
  fuerporta = (fuerporta<<3); // fuerporta = 0b000001000
  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 
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...

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul Szymanski schrieb:
> PORTA am 4. pin

pin0
pin1
pin2
pin3
pni4

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

mfg.

Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pin3

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja verdammt stimmt ja auch.
ich habe mich verschrieben sorry.

hier nochmal die korrigierte fassung:
void set(void) {
  muster[0][0] = 0b111111111;
  muster[0][1] = 0b111111111;
  muster[0][2] = 0b111111111;
  muster[1][0] = 0b011111111;
  muster[1][1] = 0b011111111;
  muster[1][2] = 0b011111111;
  muster[2][0] = 0b111111101;
  muster[2][1] = 0b111111101;
  muster[2][2] = 0b111111101;
  muster[3][0] = 0b111111110;
  muster[3][1] = 0b111111110;
  muster[3][2] = 0b111111110;
}


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

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.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke :) dies funktioniert... jetzt hab ich aber ein anderes problem :(

Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt dann muss ich das ja per DDRA aul eingang setzten...

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht 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!?!

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

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

Richtig.

mfg.

Autor: Paul Szymanski (paulszymanski)
Datum:

Bewertung
0 lesenswert
nicht 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:
void multiplexSetColumns0(int ntesmuster) {
  work();
  PORTC = (muster[ntesmuster][0]>>1);
  uint16_t fuerporta = muster[ntesmuster][0];
  fuerporta &= ~(0b1111111111111110);
  fuerporta = (fuerporta<<3);
  uint8_t fuerporta2 = (PORTA & ~(0b00001000));
  PORTA = (fuerporta | fuerporta2);
}

Danke für die Hilfe!!! :)

Grüße

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.