Forum: Compiler & IDEs GLCD Lib von Holger Klabunde, nur 1 Seite OK


von Holger Gerwenat (Gast)


Angehängte Dateien:

Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Holger Gerwenat (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von Holger Gerwenat (Gast)


Angehängte Dateien:

Lesenswert?

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

von Oliver (Gast)


Lesenswert?

>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

von Oliver (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von Holger G. (holli1195)


Lesenswert?

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

von Holger G. (holli1195)


Lesenswert?

Oh Holger, Danke!

Ist ja krass! Mein Code läuft bei Dir?! Jetzt guck ich mit Lupe meine 
Hardware an...

Ich werde berichten!

Gruß Holger

von Holger G. (holli1195)


Lesenswert?

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

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.