Guten Morgen Alle zusammen,
ich habe mir bei Pollin eins von diesen Grafik LCD (128x64, KS0108
komp., weiße HG Beleuchtung für 19,95) bestellt und möchte es in meiner
Heizungssteuerung einsetzen. Ich hatte nur ein Testboard mit ATMega16
zur Hand. Zum Test sollte es gehen. Am Wochenende habe ich das LCD
angeschlossen und die LIB von Holger Klabunde angepasst (Portzuweisungen
geändert und ein bischen aufgeräumt). Die Lib hab ich ausgesucht, weil
sie umgewandelte *.bmp darstellen kann. Nun bin ich
'Gelegenheitsprogrammierer' - vielleicht hab ich zuviel gelöscht? Ich
konnte Text ausgeben, Rechtecke zeichnen und den beiliegenden "Paul"
anzeigen. Leider funktioniert nur der 1.Chip des LCD, d.h. nur die
linken 64 Pixel werden dargestellt. Wenn ich am LCD CS1 und CS2
hardwarem. vertausche gehen die rechten 64 Pixel. Ich hab gestern den
ganzen Tag auf den Code gestarrt und finde den Fehler nicht. Wenn Holger
Klabunde hier mitliest: wo wird denn eigentlich z.B. beim Zeichnen eines
Rechteckes der Chip umgeschaltet? Ich habe hier im Forum noch den
Hinweis auf JTAG und den PORTC gefunden - die anderen Pins gehen doch
aber oder sollte meine FUSE Programmierung nicht richtig funktionieren?
Schon mal Danke im Voraus.....
Gruß Holger
VIelleicht probierst du erst einmal eine "unaufgeräumte" Version der
lib. Die sollte funktionieren.
Die Chipauswahl findest du im Original in SetChipNumber, das über
SetPosition aus SetPixel aufgerufen wird. SetPixel wiederum wird von
allen Zeichenfunktionen benutzt.
Oliver
Danke Oliver,
das mit SetPixel schaue ich mir mal an....
"unaufgeräumt" scheitert an dem Prozessor - passt nicht auf mein
Testboard und ATMega16 hat keinen PORTF :-((( außerdem passt das
Original Testprogramm nicht in meinen Flash.
Gruß Holger
>das mit SetPixel schaue ich mir mal an....
Du solltest mal kontrollieren ob PB1
überhaupt am Display an CS2 angeschlossen ist. Oder
mal mit dem Osci nachsehen ob es auch mal auf High geht.
Vieleicht ist da ja auch ein Kurzschluss drauf.
Hallo nocheinmal,
ich habe gestern den ganzen Abend in meiner Bastelstube gesessen um dem
Problem näher zu kommen. Es gibt schon Ärger mit meiner Frau und das:
Ist schlimm ;-)))!
OK.
Als erstes habe ich über den Befehl "SetPixel(0,0,1);" in meiner main
das oberste linke Pixel auf dem Display angemacht. ->funktioniert
Dann habe ich mit "SetPixel(63,0,1);" 1. Zeile, 1.Chip, letztes Pixel
gesetzt (wir wissen 1.Chip kontrolliert horizontal und vertikal die
Pixel Nr. 0-63)->funktioniert auch.
"SetPixel(64,0,1);" (2.Chip, erstes Pixel links oben) -> geht nicht.
Im AVR Studio simuliert -> CS1 und CS2 schalten um :-O Ah ha!
In ks0108.c in Funktion "void SetChipNumber(unsigned char num)" im
"switch(num)" mal die beiden case miteinander vertauscht und wieder
"SetPixel(0,0,1);" aufgerufen ->erstaunlicherweise wird nun wirklich
Pixel 0,64 (also erste Zeile, 2.Chip, 1.Pixel links oben) aktiv !?
Die Umschaltung der Chips über CS1/2 funktioniert also.
Alles wieder auf Anfang zurück und Pixel 64,0 gesetzt -> im Studio
simuliert.
Scheint richtig zu funktionieren. Im richtigen Leben geht's immer noch
nicht.
Vielleicht braucht das Display nach der Chipauswahl ein kleine Pause?
Also nach dem Chipselect jede Menge NOP(); eingefügt ->Ohne Erfolg.
Ich bin bald der Meinung, daß irgendwie die Positionsberechnung bei
Pixel xpos>63 oder deren Übergabe nicht funktioniert.
Wenn ich es richtig verstanden habe, erfolgt das in ks0108.c in der
Funktion "unsigned char SetRow(unsigned char xpos)" .
In "WriteDisplay(0x40|offs);" wird's gesendet "0x40" müsste der
eigentliche Befehl sein, verodert mit der Spaltennummer.
Kann es sein, daß aus unerfindlichen Gründen mein Prozessor diese Modulo
Geschichte in der Zeile davor nicht beherrscht???
Oder gibt es abweichende Behlsreferenzen bei den Displays? Das
Datenblatt bei Pollin ist nicht sehr ergiebig, enthält leider nur die
Pinbelegung und ein paar elektrische Werte.
Danke, daß Ihr mal raufguckt!
Gruß Holger
>Kann es sein, daß aus unerfindlichen Gründen mein Prozessor diese Modulo>Geschichte in der Zeile davor nicht beherrscht???
Nö.
>Oder gibt es abweichende Behlsreferenzen bei den Displays?
Nochmal zur Erklärung: Ein ks0108 kann nur 64*64 Pixel ansteuern. Für
128*64 nimmt dann einfach zwei, verbindet alle Daten-und
Steuerleitungen, bis eben auf die, über die ausgewählt werden soll,
welcher ks0108 nun angesprochen werden soll. Da gibt es tatsächlich
mehrere Möglichkeiten.
http://www.lcd-module.de/deu/pdf/grafik/dip128-6.pdf
zeigt das ganz gut für ein LCD eines anderen Herstellers. Welche
Möglichkeiten davon dein Display bietet, und wie du es angeschlossen
hast, must du selber rausfinden.
Oliver
Nachtrag:
Ich hab mit das Pollin-Datenblatt mal angesehen. Wenn das TG12864B-03
dein Display ist, sind da nur CS1 und CS2 rausgeführt, das sollte also
mit der lib problemlos funktionieren.
Oliver
>Ich bin bald der Meinung, daß irgendwie die Positionsberechnung bei>Pixel xpos>63 oder deren Übergabe nicht funktioniert.
DEIN geänderter Code läuft mit meinem TG12864B-03.
Die Positionsberechnung ist völlig in Ordnung.
Die Anzahl NOP ist auf jeden Fall für 8MHz zu klein.
Hab dann wieder die für 11.0592MHz eingesetzt.
Keine Probleme.
Check lieber mal deine Hardware bevor du da weiter
am Code rumfummelst.
Danke Oliver!
Genau das ist das Display, zwar die Version TG12864B-13 (grau mit weißer
HG Beleuchtung) aber natürlich sind die Anschlüsse gleich. Die Auswahl
mit den 2 Controllern habe ich verstanden. Hardware muss in Ordnung
sein. Wenn ich wie oben geschrieben in "void SetChipNumber(unsigned char
num)" die beiden CS Leitungen einfach mal vertausche, kann ich
Controller2 ja ansprechen...
Ich werde jetzt nochmal versuchen die Werte CS und xpos nicht errechnen
zu lassen sondern festzulegen.
bis dahin...
Gruß Holger
Schönen Guten Morgen!
Problem gelöst!
Erst nocheinmal herzlichen Dank an Oliver und Holger.
@ Holger - bist Du eventuell sogar der Urheber des Codes?
Die Aussagen von Euch waren ja klar
-"der Code sollte gehen" und
-"Dein Code geht bei mir, fummel nicht am Code rum"
(Du musst das ja wirklich zusammengelötet haben Holger. Danke dafür!)
Also hab ich erst mal einen Oszi an die CS Leitungen gehalten. Die haben
geschaltet. Dann kam irgenwie die Eingebung und ich habe meinen Kollegen
gebeten: "Wenn Du da oben bei ***** vorbeikommst, bring mir bitte den
größten AVR mit noch 40 Pins im DIP Gehäuse mit." Hat er auch getan, war
ein Mega32.
Gestern Abend auf mein Testboard gesteckt - Makefile angepaßt - und?:
Geht !!! *kopfschüttel, schulterzuck und Nix versteh!*
warum weiß ich nicht, der Mega16 ist bestimmt nicht kaputt.
In unserem System auf Arbeit würde jetzt stehen:
"Problem gelöst - kein Eintrag in die Datenbank"....
Dann werd ich jetzt mal mein eigentliches Projekt beginnen.
Gruß Holger