"Merkwürdigkeit" beim Nutzen von PORTD auf ATmega328P

Gast #4967791
Lesenswert?

Hallo,

ich habe ein Problem mit dem im Betreff genannten Atmel bei dem ich 
selber nicht zur Lösung komme.

Ich möchte ein grafisches LCD, basierend auf dem T6963C-Controller, 
möglichst schnell ansteuern. Aktuell mache ich dies mit "digitalWrite", 
was mir aber zu langsam geht.

Beispiel für mein "SendData":

void SendData(unsigned char aData, bool aAutoWrite = false) {
  digitalWrite(PIN_CD, LOW);  // CD down (data)
  digitalWrite(PIN_WR, LOW);  // CD & WR down
  digitalWrite(PIN_CE, LOW);
  ParportWriteData(aData);
  digitalWrite(PIN_CE, HIGH); // CE & WR up again
  digitalWrite(PIN_WR, HIGH);
  digitalWrite(PIN_CD, HIGH); // CD up again
}

Hier noch mit "DigitalWrite".

Mein "ParportWriteData" sieht so aus:

void ParportWriteData(unsigned char aData) {
  unsigned char maskD = B11111100;
  unsigned char bitsD = aData << 2;
  PORTD &= B11011111; // <<<================
  PORTD = (PORTD & ~maskD) | bitsD;
  unsigned char maskB = B00000011;
  unsigned char bitsB = aData >> 6;
  PORTB = (PORTB & ~maskB) | bitsB;
}

Das komische dabei ist, dass ich die Zeile, die ich mit "Pfeil" markiert 
habe, unbedingt brauche. Das ist, nach vielen Versuchen, die minimale 
Änderung, die nötig ist, dass ich alle Bits sauber rausbekomme. Ich muss 
"Bit 5" auf "PORTD" immer im Voraus "LOW" ziehen. Erst danach kann ich 
meine Werte tatsächlich auf den Port schreiben. Ohne diese Zeile habe 
ich Zufallspixel auf dem LCD.

Mir erschließt sich aber nicht, warum das nötig ist. Hat hier vielleicht 
jemand schon ähnliche Effekte gehabt und kann mir sagen was ich falsch 
mache?
Gast #4967826
Lesenswert?

Ist ein Arduino. Die Digital-Pins vom LCD hängen Arduino-Pin 2 aufwärts 
(also D0 vom LCD ist Pin 2 vom Arduino. Hoch bis Pin 9 am Arduino).

Gesamtes "Pinout":

#define PIN_D0 2
#define PIN_D1 3
#define PIN_D2 4
#define PIN_D3 5
#define PIN_D4 6
#define PIN_D5 7
#define PIN_D6 8
#define PIN_D7 9

#define PIN_RD 13
#define PIN_WR 11
#define PIN_CE 10
#define PIN_CD 12

Das LCD hängt da einfach "dran". Keine weiteren Besonderheiten. 
Kontrastspannung und Beleuchtung ist direkt am LCD verdrahtet und landet 
nicht am Arduino.
Gast #4967855
Lesenswert?

Manuel schrieb:
> #define PIN_RD 13
> #define PIN_WR 11
> #define PIN_CE 10
> #define PIN_CD 12

Und zu welchem Port gehören die bei deinem Arduino-Board?

Zeige einfach einen Schaltplan(-ausschnitt), der zeigt, an welchem 
Port-Bit welche Leitung von deinem Dispay hängt. Wen interessieren die 
Arduino Pin-Nummern, wenn du direkte Zugriffe machen möchtest.
Beitrag #4967870 wurde von einem Moderator gelöscht.

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