Forum: Mikrocontroller und Digitale Elektronik KS0108 SetDot Problem


von Kurt (Gast)


Angehängte Dateien:

Lesenswert?

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(volatile int j = 0;j<64;j++)
5
  {
6
    ks0108SetDot(j, j);
7
  }    
8
  
9
  for(volatile int j = 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...

von martin7986@web.de (Gast)


Lesenswert?

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

von pegel (Gast)


Lesenswert?

Mach es doch erst einmal ganz einfach:

ks0108SetDot(0,0);
ks0108SetDot(1,1);

Wo landen die Punkte?

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

das Display besteht aus zwei Hälften. So kann es sein, daß einer der 
beiden Parameter immer nur 0 oder 1 sein darf.

MfG

von pegel (Gast)


Lesenswert?

Ich tippe eher auf den Datentyp int.
Wie ist die Funktion definiert? Vielleicht x und y als uint8_t?

von Sven K. (quotschmacher)


Lesenswert?

also strg+f im oben verlinkten beitrag ergibt
> void ks0108SetDot(uint8_t, uint8_t);

von Martin (Gast)


Lesenswert?

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..

von Martin (Gast)


Lesenswert?

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?

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

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)

von Martin (Gast)


Lesenswert?

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.

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.