KS0108 SetDot Problem

Gast #2163323
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...
Angehängte Dateien:
Gast #5468264
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
Gast #5468586
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..
Gast #5468605
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?
#5468614
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)
Gast #5468637
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.