Liebe Forum-Gemeinde,
ich nutze die LCD Bibliothek von Pascal Stang um ein LCD Display mit
128x64 Pixeln und einem KS0108 Controller anzusprechen.
Wenn man nun über die Routine "lcd_SetDot" ein Pixel setzten möchte, so
klappt dies bei mir prima, so lange ich nicht in die letzten Spalten
eines der beiden Controller (Display ist ja aus zwei 64x64 Flächen
zusammengestellt) schreiben will.
Es scheint, als ob der Controller beim Lesen der Inhalte in diesen
Spalten über
1
temp=lcd_DataRead();
immer 0x00 zurückliefert und deshalb über
1
lcd_DataWrite(temp&~(1<<(y%8)));
immer nur ein Pixel in diesen beiden Spalten
gesetzt werden kann.
Kann jemand dieses Verhalten bestätigen? Bei den anderen Spalten geht es
wie gewüscht.
Gute Nacht
Phili
So nun habe ich die "lcd_SetDot" erweitert und nun läuft es:
1
voidlcd_SetDot(uint8_tx,uint8_ty)
2
{
3
uint8_ttemp;
4
5
lcd_SetAddress(x,y/8);
6
temp=lcd_DataRead();// dummy read
7
lcd_SetAddress(x,y/8);
8
temp=lcd_DataRead();// read back current value
9
lcd_SetAddress(x,y/8);
10
lcd_DataWrite(temp|(1<<(y%8)));
11
12
lcd_StartLine(0);
13
}
Der ursprüngliche Code lautete
1
voidlcd_SetDot(uint8_tx,uint8_ty)
2
{
3
uint8_ttemp;
4
5
lcd_SetAddress(x,y/8);
6
temp=lcd_DataRead();// dummy read
7
temp=lcd_DataRead();// read back current value
8
lcd_SetAddress(x,y/8);
9
lcd_DataWrite(temp|(1<<(y%8)));
10
11
lcd_StartLine(0);
12
}
Ich verstehe nur nicht, warum dasHinzufügen von
1
lcd_SetAddress(x,y/8);
das Problem löst und warum es nur beim Schreiben (bzw. Auslesen) der
letzten Spalten eines Conrollers auftritt.
Vielleicht noch nen Tipp dazu von jemandem?
Phili
Normalerweise kommen die meisten Probleme mit LCD's von falschem (zu
schnellem) Timing.
Wie du schon selber sagtest, es gibt eigentlich keinen Grund, warum die
Ursprungsvarinte nicht funktionieren sollte. Ich kenne jetzt die lib von
Pascal Stang nicht, und ob die das busy-flag abfragt, oder nicht, aber
irgendwo da drin wird es auch entsprechenden delays geben. Was passiert,
wenn du die mal verlängerst?
Oliver
Hallo Oliver
> Normalerweise kommen die meisten Probleme mit LCD's von falschem (zu> schnellem) Timing.> Wie du schon selber sagtest, es gibt eigentlich keinen Grund, warum die> Ursprungsvarinte nicht funktionieren sollte. Ich kenne jetzt die lib von> Pascal Stang nicht, und ob die das busy-flag abfragt,
Das Busy-Flag wird von den Bibliotheksroutinen abgefragt.
> oder nicht, aber irgendwo da drin wird es auch entsprechenden delays geben.
Habe das Display direkt in den extern I/O Memory gehängt und muß mich
somit nicht mehr um die direkte Beschaltung der Leitungen kümmern. Die
Waitstaites habe ich zwischenzeitlich auf die maximalen Werte gesetzt.
Das hat aber auch nichts geändert.
Phili
> und muß mich> somit nicht mehr um die direkte Beschaltung der Leitungen kümmern
aha... - Und das geht?
Nein, ich habe keinen Tip, da mir Pascal fremd ist.
...
Hallo Hannes, hallo Oliver,
> Direkten Asnchluß ans memory-i/O hab ich noch nie gemacht, aber auch da> muß das Timing eingehalten werden. Wie stellst du das denn sicher?
Direkte Delays gibt es da wirklich nicht. Es wird habt über die
Definition der Waitstates geregelt (z.B. Datenblatt Mega128 S. 31ff)
Ist sehr schick das spo zu machen, denn der Code für die harwarenahen
Funktionen reduziert sich praktisch auf eine Zeile und zu
programmierende Wackeln an den Steuerleitungen entfällt.
Für ein Command-Write sieht das dann ungefähr so aus
P.S. Habe gerade die Lib gewechselt. Nutze jetzt die von Maximilian
Thiele, weil dort die Textausgabe an beliebigen Pixeln direkt
implementiert ist. Die Umsetzung des direkten I/O Memoryzugriffs ist
noch ein wenig buggy. Mal sehen, was hier aus meinem ursprünglichen
Problem geworden ist.
Phili