Arduino: "digitalWrite" geht. "PORTD/PORB" ist un zuverlässig?
Apr 02, 2017 49 Replies
G
Gerrit Heitsch
Erinnert mich an ein Problem welches ich vor Jahren mit einem solchen graphischen Display hatte. Da kamen die Daten auch nicht da an wo sie laut Datenblatt ankommen sollten. Also habe ich einfach ausprobiert welchen Offset ich brauche damit es passt und den genommen. Ab da lief alles.
Gerrit
Didn't find your answer? Ask the community — no account required.
H
Hans-Peter Diettrich
Suche im Forum nach "Pin Mapping", oder gleich unter Tutorials|Hacking.
Beim Uno liegt Port D auf Pin 0-7, und Port B (untere Bits) auf 8-13.
DoDi
G
Gerald Oppen
Display-Controller bis zur Datenfreigabe lassen muss. Ein Oszi ist da
etwas eigenwillige Vorstellung davon wie er den Code optimiert.
Gerald
G
Gerald Oppen
Am 02.04.2017 um 17:32 schrieb Marte Schwarz:
Gerald
E
Eric Bruecklmeier
E
Edzard Egberts
Zumindest werden die in der Funktion digitalWrite gespeichert und nach dem Schreiben wieder hergestellt:
Ist das Resultat davon nicht ein Boolean? Habe ich aber nun probiert. Dann kommt garnichts mehr am LCD an.
Ich habe weiter getestet. Man kann auch folgendes als "Fix" verwenden:
PORTD &= B11011111;
"LOW" gezogen.
digitalWrite(5, LOW);
Geht auch damit noch.
muss dieses eine Bit im Voraus low ziehen?
Eigentlich sollte es dem LCD (T6963C) ja egal sein wie ich die Bits setze. Ich ziehe CE, WR und CD ja erst "High" wenn die Bits anliegen. Ich hatte auch schon ein Delay zwischen "Bits setzen" und "Statusleitungen hochziehen" eingebaut. Auch das hilft nicht. Dann wird
Manuel
C
Christian Zietz
Manuel Reimer schrieb:
Mir ist nicht ganz klar, wie Du auf diese Bitfolge gekommen bist. Warum ausgerechnet B10000011? Abgesehen davon ist sowas immer ein Grund, sich
reicht. Damit wird nur ein einziges Bit "low" gezogen. Auch damit
wirklich.
da rankomme... Was muss ich tun um diese Funktion in Assembler zu wandeln?
Manuel
C
Christian Zietz
Manuel Reimer schrieb:
Du kannst auch ein mit Debugginginformationen ("gcc -g") compiliertes Objekt-File (.o) mit "objdump -S" wieder ausgeben lassen:
Allerdings liest sich das nach Deinem Posting von 11:01 Uhr doch eher nach einem Problem mit der Ansteuerung des LCD-Controllers als mit dem generierten Code.
void SendData(unsigned char aData) { digitalWrite(PIN_CD, LOW); // CD down (data) __asm__ __volatile__ ("nop\n\t"); 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); __asm__ __volatile__ ("nop\n\t"); digitalWrite(PIN_CD, HIGH); // CD up again }
Klar ist da wirklich nichts, daher vermute ich irgendwelche Seiteneffekte mit den alternativen Portfunktionen. Dein Programm
von Port D.
(und/oder PIND) nach jedem Schritt in ein Array zu schreiben, und das
Code vorgegeben, dann spuckt irgendwas (Interrupt-Handler, PWM...) dazwischen.
Und die Masken sollten als "const" deklariert werden.
DoDi
M
Manuel Reimer
Wie geht das?
Manuel
M
Manuel Reimer
Wahrscheinlich.
besonders stark wo "nur Nullen" auf das Display sollen. Also keine Pixel gesetzt werden.
In dem Fall scheinen Null-Bits verschluckt zu werden, was das
Manuel
G
Gerald Oppen
Du solltest Dir mal die Signale mit einem OSZI anschauen, eventuell sind die Signalflanken zu flach. Das hatte ich gerade bei der Senderichtungsumschaltung an einer RS485.
Schutzbeschaltung?
Gerald
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.