"Merkwürdigkeit" beim Nutzen von PORTD auf ATmega328P

Gast #4967791
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.