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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Manuel (Gast)


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


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


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

von Huh (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich nehme alles zurück :-(

von Manuel (Gast)


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


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

von Wolfgang (Gast)


Bewertung
1 lesenswert
nicht 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)


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

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]
  • [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.