Hallo
Ich benutze den glcd
(Beitrag "KS0108 GLCD Routinen") treiber für
mein 128x64 Grafiklcd... soweit funktioniert alles ganz gut... mit den
string funktionen usw. sieht alles ganz gut aus... nun wollte ich den
treiber bisschen erweitern und funktionen wie das Zeichnen von Linien
etc. einbauen...
Nun habe ich die SetDot Funktion benutzt, um einen Punkt des LCDs
einzuschalten...
nur testweise hab ich nun diese programm ausprobiert:
1
2
ks0108Init();
3
4
for(volatileintj=0;j<64;j++)
5
{
6
ks0108SetDot(j,j);
7
}
8
9
for(volatileintj=64;j<128;j++)
10
{
11
ks0108SetDot(j,j-64);
12
}
so wie ich das verstehe, sollten nun 2 geraden gezeichnet werden, welche
quer über den jeweiligen Sektor des LCDs verlaufen.
Jedoch ist das ergebnis etwas merkwürdig... ich habe andere
testprogramme ausprobiert, bei welchen das so ähnlich aussieht...
also einen fehler beim der pinbelegung des lcds kann ich mehr oder
weniger ausschließen (sodass z.b. immer ein bit der daten fehlen würde)
weiters funktionieren die string funktionien ja an beliebigen positionen
einwandfrei...
nun wollte ich fragen, ob vielleicht jemand eine idee hat was der fehler
oder das problem sein könnte...
Hallo,
Die Frage ist zwar schon etwas älter aber ich habe genau das gleiche
Problem und brauche unbedingt Hilfe.
Muss am Donnerstag unser Studienprojekt(Wetterstation) abgeben.
Mit freundlichen Grüßen
Wow danke für die schnellen Antworten!
Also wenn ich:
ks0108SetDot(0,0);
ks0108SetDot(1,1);
ausführe, dann bekomme ich einen Punkt bei (0,0) und der zweite wird bei
(1,2) erzeugt.
Es werden in Y-Richtung immer Pixel ausgelassen.
Wenn ich: for (uint8_t i=0;i<63;i++)
{
ks0108SetDot(0,i);
_delay_ms(80);}
ausführe,
bleibt es bei x=0 und fängt auch bei y=0 an.
Aber dann wird immer ein Y-Wert ausgelassen und wenn Y=8,16,.. erreicht
wird springt er ein paar pixel zurück in Y_Richtung und läuft dann
weiter bis 16 dann wieder ein stück zurück usw. Beim durchlaufen wie
gesagt immer 1 Pixel ausgelassen.
Desweiteren wird auch nur der aktuelle Pixel gezeigt, ich denke die
anderen werden überschrieben weil die ks0108ReadData() nicht richtig
funktioniert.
Hat jemand noch einen Tipp?
Ich weiß nicht mehr was ich noch machen soll, bin die Funktionen schon
mehrmals step by step durchgegangen..
Die SetDot funktion:
void ks0108SetDot(uint8_t x, uint8_t y) {
uint8_t data=0;
ks0108GotoXY(x, y); // read data from display memory
data = ks0108ReadData(NO_INCREMENT_X); // dummy read
data = ks0108ReadData(NO_INCREMENT_X); // "real" read
data |= 0x01 << (y % 8); /
ks0108WriteData(data); // write data back to display
}
Kann: data |= 0x01 << (y % 8); überhaupt das richtige ausgeben?
wenn y=0 ergibt das das gleiche wie wenn y=8 oder habe ich einen
Denkfehler?
Martin schrieb:> erreicht> wird springt er ein paar pixel zurück
Wie viele? Der Schlüssel zur Lösung ist nämlich genau zu analysieren wie
sich das Zeichnen der Punkte aktuell verhält.
Nach dem uralten Bild oben ist das eine sich deterministisch verhaltende
Funktion f(u, v) die dort am Werk ist. Die gilt es durch Analyse der
Ausgabe zu finden: (x, y) = f(u, v). Und wenn du die hast gilt es die
Umkehrfunktion zu bilden (u, v) = f^-1(x, y). Die implementierst du dann
und rufst sie beim Setzen eines Punktes auf. Das Ergebnis ist:
f(f^-1(x, y)) = ks0108SetDot(f^-1(x, y)) = (x, y)
D.h. die Pixel stehen da wo du sie haben möchtest.
Für den Schönheitspreis gehst du mit dem Wissen von f(u, v) und f^-1(x,
y) den Source-Code von ks0108SetDot() durch und versuchst zu finden wo
ks0108SetDot() versehentlich f(u, v) implementiert hat. Dann reparierst
du ks0108SetDot(). Aber zuerst musst du wissen wie es schief geht, d.h.
f(u, v)
Ich habe eine Änderung gemacht:
ks0108GotoXY(x, y-y%8);
nun funktioniert es!!!
Problem bleibt noch die read-Funktion,
data = ks0108ReadData(NO_INCREMENT_X); // dummy read
data = ks0108ReadData(NO_INCREMENT_X); // "real" read
data |= 0x01 << (y % 8); /
ks0108WriteData(data); // write data back to display
Die vorhanden Pixel werden nicht mit den neuen verodert sondern
überschrieben bzw glöscht.