Forum: Mikrocontroller und Digitale Elektronik "Merkwürdigkeit" beim Nutzen von PORTD auf ATmega328P


von Manuel (Gast)


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?

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo Marcel,

meine Glaskugel sagt 42!

Ich will damit sagen, ohne Schaltplan und Pinbelegung kann Dir niemand 
sagen, warum Du genau dieses BIT auf LOW ziehen musst.

Gruß
Frank

von Huh (Gast)


Lesenswert?

Mit dieser Zeile ziehst du das Bit 5 nicht auf Low.
Mach dich mal schlau zum Thema Bitmanipulation.

von Huh (Gast)


Lesenswert?

Sorry, ich nehme alles zurück :-(

von Manuel (Gast)


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.

von MaWin (Gast)


Lesenswert?

Timingprobleme? Muss es Bit 5 sein, oder tut ein beliebiges anderes Bit 
oder ein paar NOPs auch?

von Wolfgang (Gast)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Manuel schrieb:
> 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?

 Falsch verbunden ?

 Bei dir sind sowohl RD als auch WR auf 0, wie soll das funktionieren ?
 PD.5 und PB.5 verwechselt ?

Beitrag #4967870 wurde vom Autor gelöscht.
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.