Forum: Mikrocontroller und Digitale Elektronik LCD zeigt was falsches nach Reset; ATmega8 avrgcc


von Werner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich habe mir bei Conrad ein Display gekauft (ANAG VISION AV2020) 
welches den KS066 Controller (oder kombatibel) verwendet.
Ich befolge genau die Initialisierungsroutine wie sie gefordert ist.
Wenn man die Stromversorung aus und wieder einschaltet passt die 
Anzeige.

Nach einem Reset zeigt das 2 zeilige LCD manchmal nur eine Zeile, bzw 
lauter komische Sachen in einer oder 2 Zeilen.
Hab schon viele delays eingebaut und wird nicht besser.

// erzeugt den Enable-Puls
void lcd_enable(void) {

   LCD_STEUER_PORT |= (1 << LCD_EN);
    _delay_us(120);  // 100 nicht zu knapp warten
   LCD_STEUER_PORT &= ~(1 << LCD_EN);
}


// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.

void lcd_init(void) {

  _delay_ms(50); _delay_ms(50);            // Verzögerung wegen 
Einschaltung notwendig
   LCD_DATEN_DDR |= (0x0F << LCD_DATEN_BIT1);  // Datenausgänge
  LCD_STEUER_DDR |= (1 << LCD_RS) | (1 << LCD_EN);
                            // Steuerausgänge
  LCD_STEUER_PORT &= ~(1 << LCD_RS | 1 << LCD_EN);// Ausgänge 
ausschalten


  // LCD_STEUER_PORT = ~(1 << LCD_RW);
  // Funktion einstellen
     // 3 mal senden zur Initialisierung laut Beschreibung
    _delay_ms(50); _delay_ms(50); _delay_ms(50); // Verzögerung wegen 
Einschaltung notwendig

  LCD_DATEN_PORT &= ~(0b00001111 << LCD_DATEN_BIT1);  // Datenausg. 
löschen


  // 4 Bit Modus, 5x8 Pixel, 2 Zeilen
     LCD_DATEN_PORT |= (1 << LCD_DB5);
     LCD_STEUER_PORT &= ~(1<<LCD_RS);    // RS auf 0
     lcd_enable();

   _delay_ms(50);      //
     lcd_enable();

  LCD_DATEN_PORT &= ~(0b00001111 << LCD_DATEN_BIT1);// Datenausg. 
löschen
    _delay_ms(50);    //
  LCD_DATEN_PORT |= (1 << LCD_DB7);    // DB6 dazu ?
     lcd_enable();

  // Display ON/OFF Controll
  // Display ein  Cursor aus  kein Blinken

  _delay_ms(50);          // Verzögerung laut Beschreibung
  lcd_befehl(0b00001100);      // siehe Beschreibung S14


  // Display Clear
  _delay_ms(50);          // Verzögerung laut Beschreibung
    lcd_befehl(0b00000001);      // siehe Beschreibung


  // Entry Mode Set
     // inkrement / kein Scrollen
  _delay_ms(50);          // Verzögerung laut Beschreibung
    lcd_befehl(0b00000110);      // siehe Beschreibung

  _delay_ms(50);          // 20
}

von Michael U. (amiga)


Lesenswert?

Hallo,

das Display weiß ja nichts vom AVR-reset. Manche Funktionen lassen sich 
nur einmal nach dem Displaystart einstellen und der erfolgt ja nur beim 
PowerOn, nicht beim AVR-Reset.

Oben in den Kommentaren gibt es
// 3 mal senden zur Initialisierung laut Beschreibung
 da sendest Du nichts.
Ich weiß auch nicht, ob der KS0066 den Softwarereste des HD44780 kann 
(3x 0x30 senden), versuchen kannst Du es ja mal, im Datenblatt auf ich 
beim Überfliegen nichts dazu gefunden.

Gruß aus Berlin
Michael

von Werner (Gast)


Lesenswert?

o.k. das gilt ab dem Kommentar "4 Bit Modus", die 3 x lcd_enable() bis 
zum nächsten Kommentar "DISPLAY ON/OFF".
Werd ich mal versuchen, ich hab nämlich im Datenblatt leider auch keinen 
expliziten Reset Befehl gefunden.

Was mir auch noch aufgefallen ist, wenn ich Reset drücke und er zeigt 
was falschen an drücke ich erneut Reset und dann passt es wieder.
Wenn man den Reset genau richtig drückt (nicht zu kurz oder zu lang) 
zeigt er auch gleich das richtige.

Danke
Werner

von Neubi (Gast)


Angehängte Dateien:

Lesenswert?

meine init sieht so aus (funktioniert) .....


void InitLCD(void)
{
  DisplayDataEnable();   // set all display-portpins first

  LCD_RS_CONTROL();      // write to control register
  LCD_RW_LOW();          // set to write function
  LCD_E_LOW();           // data-invalid
  delay(25000);          // wait 20ms after restart

  lcd_write(0x30);
  delay(6500);           // wait 5.2ms
  lcd_write(0x30);
  delay(6500);           // wait 5.2ms
  lcd_write(0x30);
  delay(100);            // 80µs

  lcd_write(0x38);       // display has 2lines
  delay(100);            // 80µs

  lcd_write(0x0C);       // display on, no cursor
  delay(100);            // 80µs

  lcd_write(0x01);       // clear display
  delay(6500);           // 80µs

  lcd_write(0x06);       // clear display
  delay(100);            // 80µs

  DisplayDataDisable();
}

von Werner (Gast)


Lesenswert?

Sehr lässig jetzt geht es , danke !!!!!!!!!!!

von Alien (Gast)


Lesenswert?

Hallo zusammen,

hatte das gleiche Problem mit nem anderen Atmega, aber auch dem KS0066 
Controller, die Lösung war an sich simpel.

Zumindest bei mir, bei mir musste ich nur den Controller nach dem 
einschalten einmalig auf den 8Bit Modus setzen. 0x30 auf die 
Datenleitungen.

Anschließend die im Datenblatt angegebene Initialisierung ausführen.

Ich hoffe es steinigt mich jetzt keiner dass ich hier meine Lösung 
angehängt hab.

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.