Forum: Mikrocontroller und Digitale Elektronik GLCD 128x64 lässt sich nicht programmiern


von Pitt29hh (Gast)


Lesenswert?

Vielleicht kann mir hier jemand helfen mein GLCD im gang zu kriegen.
Versucher seit Tage vergeblich diesen zu programmieren.


Hardware:

Habe das Board von mikroelektronika EsayAVR6 und mir ein GLCD dazu 
bestellt.
GLCD 128x64   WDG0151-TMI-V#N00   Hersteller Winstar Display Co., LTD

(mit integrierten LCD Controllern 2 mal NT7108, soll angeblich 
kompatible zu KS0108 and HD61202 sein)




Sofware:

AVR Studio 4 (WIn avr usw.)


Problem:

GLCD lässt sich nur mit einer mitgelieferten Beispiel-Hexdatei 
bespielen, so daß ein Beispielgrafik angezeit wird. (Hardware also nicht 
defekt)

Habe seit tagen laut der Datasheet und einigen testprogrammen anderer 
user versucht mit dem AVR studio 4 eine eigene Hexdatei zu erstellen, 
aber auf dem GLCD wird nix angezeigt.
Vom AVR Studio keine fehlermeldung, Hex-Datei wird ordnungsgemäß 
erstellt.

Habe die Pin Ports richtig definiert, dispaly initialiesiert, usw. aber 
ohne erfolg.

Kann mir vielleicht jemand helfen was ich falsch machen könnte oder ob 
der GLCD von Winstar doch nicht kompatibel ist??

Fusebits wurde geprüft und wie bei der fuktionierenden Test-Hexdatei 
nicht verändert. (Jtag ist off usw.).


Vielen Dank im Vorraus!






mein letzter versuch als mini test programm, aber wie gesagt ohne 
erfolg.:
1
#define XTAL 8e6    // 8 Mhz
2
#define F_CPU XTAL 
3
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
#include "image_load.c"
9
#include "mylcd.c"
10
#include "mylcd.h"
11
#include "small_font.h"
12
#include "mega.h"
13
#include "image_load.h"
14
15
16
int main (void)
17
{
18
  
19
//init lcd
20
  lcd_init();
21
  lcd_clear();  
22
  
23
24
while(1)
25
{
26
27
lcd_write_data(128,1);  //128 beliebiger wert, 1 steht für CS1
28
_delay_ms(50);
29
30
lcd_write(128,1);
31
_delay_ms(20);
32
33
34
35
lcd_write_data(144,1);   // 144 belibieger wert, 1 steht für CS1
36
_delay_ms(50);
37
38
lcd_write(144,1);
39
_delay_ms(20);
40
41
42
43
44
}

(Mod: "nicht" in Topic und Codeformatierung ergänzt)

von Pitt29hh (Gast)


Lesenswert?

SOrry, überschrift soll : GLCD 128x64 lässt sich NICHT programmiern
heißen.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

Ist das Display nach dem Init leer?

was macht lcd_write? - eine Instuction ans Display ausgeben?
wenn ja - 128 und 144 sind keine gültigen Instuctions für den KS0108.

>mehr Programm ...

Sascha

von g457 (Gast)


Lesenswert?

> mein letzter versuch als mini test programm,

..bei mir compiliert obiger Code nicht mal ansatzweise, der gcc wirft 
mir da nur haufenweise errors um die Ohren. Da wird zielgerichtete 
Fehlersuche schwierig.

von Pitt29hh (Gast)


Lesenswert?

Nee, also das du fehler beim compieleiren hast ist klar, dazu feheln 
wahrscheilich die include dateien.

lcd_write_data soll den Writemodus einschalten also einstellung das 
Daten für Displayregister gesendet werden sollen.

und lcd_write soll die daten ans Display übertragen. Den wert 128 oder 
144 wahr belibig gewählt und solte belibige pixel am display 
einschalten.



Hier ein kurzer inhalt aus der mylcd.c include datei:
(




// ---------------------------------
// Set Data mode, and write data
// ---------------------------------
void lcd_write_data(uint8_t data ,uint8_t chip)
{
  if (invert!=0)  data = ~data;
  lcd_chip_select(chip);      // Cs1 oder 2

  LCD_CMD_PORT |= (1<<CD);    //port D CD auf 1 (RS ein)
  LCD_CMD_PORT &= ~(1<<RW);    // we're in data mode  RW pin löschen, 
Writemode

}



// ------------------------
// Write Data
// ------------------------
void lcd_write(uint8_t val,uint8_t chip)
{
  LCD_DATA_DDR = 0xff;    // Port C als AUsgang
  LCD_DATA_PORT = val;    //Daten ans port c einstellen (CMd code oder 
Datenbit)

  LCD_CMD_PORT |= (1<<EN);  //Enable pin an positive Flanke
  _delay_us(2);          // >500ns
  LCD_CMD_PORT &= ~(1<<EN);  //Enablepin aus Negative flanke
        _delay_ms(51);

/*
  if (chip== (CHIP1|CHIP2))  // CS1 oder 2 oder beide warten auf nicht 
mehr besetzt, also daten sicher übertragen
  {
    lcd_chip_select(CHIP1);
    wait_while_chip_is_busy();  // this could be exchanged by a little 
delay (this is the safe way)

    lcd_chip_select(CHIP2);
    wait_while_chip_is_busy();

    lcd_chip_select(CHIP1|CHIP2);
  }
  else
  {
    wait_while_chip_is_busy();  // this could be exchanged by a little 
delay (this is the safe way)
  }


*/
  LCD_DATA_PORT=0x00;    // Daten Portc wieder löschen
}

von Pitt29hh (Gast)


Angehängte Dateien:

Lesenswert?

Habe die gesamten Include dateien als beispiel bekommen aber wie gesagt 
hat nicht fuktioniert. Habe daher hier nochmal den test-Zip-Ordner mit 
den Dateien eingefügt.

Hast Du das gleiche GLCD? oder einen anderen Typ?

Danke!

von Sascha W. (sascha-w)


Lesenswert?

so ... hab mal kurz drüber geschaut - sollte eigentlich gehen.

Ist das Display nach dem Clear leer? Wenn ja dann schreib in der 
Löschroutine mal nicht 0x00 sondern z.B. 0x55 ins Display.

Sascha

von Pitt29hh (Gast)


Lesenswert?

Danke Sascha erstmal, habe das  mit dem Clear und 0x55 versucht, aber da 
tut sich immer noch nix. Das Display ist immer leer, also Nur die 
hintergrundbeleuchtung geht, sonst alle Pixel durchgehend aus.

Habe jetzt auch mal LED`s die am geleichem Port C und D im Bord 
angeschloßen sind mal mitlaufen lassen um die signale an den Displaypins 
zu verfolgen. Habe dazu auch die Delay-zeiten vergrößert damit das ganze 
langsam abläuft. die Signale am Port C und d werden wie programmiert 
abgelaufen.

Weiß immer noch nicht weiter, habe die CS1 und Cs2 rumprobiert die zu 
tauschen, mal beide mal ein abwechselnd anzusprechen aber auch kein 
mucks.

Gibts da noch was , was zu beachten wäre? Also pins an C und D habe ich 
alle so wie die Schaltung es vorsieht.

von holger (Gast)


Lesenswert?

>Gibts da noch was , was zu beachten wäre? Also pins an C und D habe ich
>alle so wie die Schaltung es vorsieht.

Ja, Schaltung kontrollieren. Dein gepostetes Programm funktioniert
auf einem ATMega128 bei mir ohne Probleme.

Es werden aber nicht PortC und PortD benutzt sondern
PortA und PortC. PortD ist in deinem Code nirgendwo
zu sehen.

von Pitt29hh (Gast)


Lesenswert?

Ja, die Zip-Datei mit dem kompletten Beispiel die ich gepostet habe ist 
ja auch die Rohversion. Bei mir habe ich natürlich auch die Ports an 
meine angepasst (in der Datei "mylcd.h"), also Port A und C geändert zu 
Port D und C usw.

Wie gesagt funktioniert aber nicht. Interessant wäre auch welchen GLCD 
ihr benutzt, ist das der gleiche Typ wie meiner mit den 2 GLCD 
Controllern NT7108. Vielleicht liegt da der Wurm. Habe keine NT7108 
testprogramme finden können, nur den Verweis dass er zu zu KS0108 and 
HD61202 Kompatibel sei.

Ich benutze wie erwähnt das Board von mikroelektronika EsayAVR6, da ist 
Hardwaretechnisch alles festgelegt und verlötet und nicht zu bemängeln. 
Die Anschlüße des µC habe ich laut Schaltplan mehrmals überprüft, da 
schein der Fehelr auch nicht zu liegen.

von Sascha W. (sascha-w)


Lesenswert?

@Pitt29hh

was wir noch vergessen haben - was macht die Kontrastspannung?
Nach dem Einschalten und einem Init, aber ohne Clear, sollte auf den 
Display irgendwelcher Müll zu sehen sein. Mit der Kontrastspannung 
sollten es möglich sein alle Pixel schwarz bzw. nicht sichtbar zu 
machen.

Sascha

von holger (Gast)


Lesenswert?

Dein WDG0151-TMI-V hat lowaktive CS1 und CS2. Mein Display
hat highaktive CS1 und CS2. Das ist dein Problem. Also Inverter
dran oder Software ändern.

von Pitt29hh (Gast)


Lesenswert?

ES HAT GEKLAPPT !!!

Es war das mit dem Inverten CS1 und CS2, also bei mir brauchen die ein 
Low Signal.

Bin da auch schon vor Tagen draufgestoßen (weil die ein negierungsstrich 
über den CS1 und 2 haben) und hatte es auch im verdacht, habe aber wie 
ich eben erst gemerkt habe, so dumm wie ich war, anstatt die CS1 und 2 
in der Chipselect initialiesierung gegenseitig zu tauschen, nur die 
CHIP1 und CHIP2 zuweisungs nummern getauscht.

ALos , verstehe nicht warum dann der KS108 dann kompatibel zu meinem 
NT7108 gestellt wird, wenns doch nicht ganz zutrifft. Naja, Hauptsache 
es geht jetzt!



ALSO, MEGA MEGA GROßEN DANK AN EUCH FÜR EURE HILFESTELLUNG !!!

von n00b (Gast)


Lesenswert?

Hallo!

Ich habe das selbe GLCD und das BIGAVR Board. Also ziemlich die gleiche 
Hardware, jetzt habe ich denn code geflasht aber es tut nicht. Wie im 
letzten Post geschrieben habe ich die Chip-Select Routine etwas 
umgeschrieben:
1
void lcd_chip_select(uint8_t chip)
2
{
3
  if (chip == (CHIP1|CHIP2))
4
  {
5
    LCD_CMD_PORT &=  ~((1<<CS1) | (1<<CS2));
6
    return;
7
  }
8
9
  if (chip == CHIP1)
10
  {
11
    LCD_CMD_PORT &=  ~(1<<CS1);  
12
    LCD_CMD_PORT |=  (1<<CS2);  
13
    return;
14
  }
15
16
  if (chip == CHIP2)
17
  {               
18
     LCD_CMD_PORT   &=  ~(1<<CS2);
19
    LCD_CMD_PORT   |=   (1<<CS1);
20
    return;
21
  }
22
23
  LCD_CMD_PORT   |=  (1<<CS1)|(1<<CS2);
24
  return;  
25
}

Habe ich noch etwas übersehen? Denn es zeigt überhaupt nichts an... :(

lg

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.