www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Display funktioniert nur mit angeschlossener ISP


Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich hab mir das Display 162 von Displaytech gekauft und möchte es nun im 
4Bit Modus betreiben.

Ich hab nun folgendes Problem:
das Display lässt sich nur dann initialisieren und mit Zeichen füttern, 
wenn die ISP an den Prozessor (ATMega8 16MHz) angeschlossen ist.

Nehm ich die ISP ab und leg die Versorgungsspannung neu an, hab ich nur 
die schwarzen Balken. Auch eine Neuinitialisierung per Tastendruck 
klappt im Betrieb nicht.

Laut meinen Logikanalyser werden alle Zeiten nach dem Datenblatt richtig 
eingehalten.

Kann es evt an die Anlaufzeit vom Mikrocontroller o.ä. liegen oder dem 
Reset was die ISP auslöst?

Wär schön wenn jemand das Problem kennt, hab leider beim googlen nichts 
dazu gefunden.

Hiernochmal meine Initialisierung (Übernommen von dem Hersteller des 
Displaycontrollers ST7066U):
void lcd_init_();
{
...
  LOW_EN;
  LOW_RS;
  LOW_RW;
  LOW_RS;
  delayms(40);

  HI_EN;
  long_delay();
  DATA = 0x30;
  long_delay();
  LOW_EN;
  long_delay();

  lcd_write_cmd(0x28);
  lcd_write_cmd(0x28);
  lcd_write_cmd(0x0F);
  lcd_write_cmd(0x01);
  delayms(2);
  lcd_write_cmd(0x06);      
}
void lcd_write_cmd(unsigned char cmd)
{
  HI_EN;
  short_delay();
  DATA = (cmd & 0xf0);
  long_delay();
  LOW_EN;
  long_delay();

  HI_EN;
  short_delay();
  DATA = (cmd << 4);  
  long_delay();
  LOW_EN;
  long_delay();
}

MfG
Matthias S.

PS: Ein long_delay() hat eine Zeit von 1ms

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal kontrolliert ob dein delayms(40) wirklich 40msec wartet.
Ich habe einige, zugegebenermassen ältere, Display, da tut sich unter 
50msec PowerOnTime gar nichts.
Eventuell auch in den Fuses lange Starttime einstellen.

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das tut sie.

Ich hab die Anlaufzeit des Mikrocontrollers auf Ext. Crystal/Resonator 
High Freq: Start-up time 16CK + 64ms gesetzt.

Ich hab mich auch schon gefragt ob die angeschlossene ISP beim Anlegen 
der Versorgungsspannung den Mikrocontroller zusätzlich resettet, aber 
laut Oszilloskop wird das Reset nur am Start ausgeführt.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne angesteckten ISP ein Reset ausführen, kein Power On, dann weisst du 
ob es der ISP oder die zu kurze Wartezeit ist.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder ISP filtert die Versorgungsspannung.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Masseverbindung OK?

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk
Die Masseverbindung scheint wohl i.O. zu sein.

@Gast
Die Spannungsversorgung ist stabil und beim Einschalten mit und ohne ISP 
steigt sie in der selben Zeit auf 5V an.

@HubertG
Wenn ich den Reset manuell ausführe läuft das Display.

Welche Wartezeit meinst du? Vor der Initialisierung oder die Zeit bevor 
der Mikrocontroller arbeiten darf?

Autor: Sven K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void lcd_init_();
{
...
  LOW_EN;
  LOW_RS;
  LOW_RW;
  LOW_RS;
  delayms(40);

Setze mal das delayms(40) auf 100 oder mehr....

Dann gibst Du dem Display mehr Zeit zu starten.


Gruß Sven

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es mit manuellem Reset läuft, dann hat es mit dem ISP nichts zu 
tun.
Ich meine die Wartezeit vor dem initialisieren. Ich nehme an das die 
PowerOn-Wartezeit zu kurz ist. Füge einfach noch ein paar delayms(40) 
ein, du kannst sie ja dann schrittweise reduzieren.

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven K.
Das hab ich mir auch zuerst gedacht, vorallem da die in den meisten 
Threats ein falsches Timing die Ursache war. Aber es geht auch nicht mit 
einem Delay von t>40ms.

Also wenn ich den Reset manuell ausführe, geht die Schaltung auch ohne 
ISP. Jedoch nur nach dem 2ten Reset.

Ich hab auch schon einen Konensator nach Masse an die Resetschaltung 
angelegt um die Resetzeit ein bischen zu verlängern. Das bringt aber 
auch nichts.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt die übliche sichere Initialisierung mit 2* 8Bit-Modus und dann 
4Bit-Modus.
Nur diese bringt Dich immer zuverlässig in den 4Bit Modus, sowohl beim 
Einschalten, als auch bei einem Restart nach dem 1. Nibble.


Peter

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Initialisierung mit 2* 8Bit müsste doch mit
  HI_EN;
  long_delay();
  DATA = 0x30;
  long_delay();
  LOW_EN;
  long_delay();

gemacht werden oder?

Nochwas: Ich hab die Pins D0-D3 auf Gnd, könnt das evt. das Problem 
sein?

MfG
Matthias

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Matthias S. (lecorde)

>Nochwas: Ich hab die Pins D0-D3 auf Gnd, könnt das evt. das Problem
>sein?

JAAA! Die müssen offen bleiben!

MfG
Falk

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An dem Reset liegt es auch nicht. Wenn ich im Betrieb die 
Initialisierung mit einer Taste auslöse geht das Display nur nach jeder 
zweiten Iitialisierung

Ich hab nun zu begin einen Delay von 150ms und zwischen jeder 
Registereinstellung einen zusätzlichen Delay vom 10ms eingefügt.

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmpf, mir ein jemand dazu geraten die an Masse anzuschliessen...

Aber super, es geht nun, danke an allen.

MfG
Matthias

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Matthias S. (lecorde)

>Hmpf, mir ein jemand dazu geraten die an Masse anzuschliessen...

Das gilt oft, aber nicht immer :-0

MfG
Falk

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider läuft das Programm doch nicht so ganz. Ich muss die 
Registerinitialisierung 2x aufrufen damit das Programm immer und normal 
läuft.

Damit sieht mein Programm etwa so aus
...
delayms(50);
for(i=0;i<2;i++)
{
  HI_EN;
  long_delay();
  DATA = 0x30;
  long_delay();
  LOW_EN;
  long_delay();
  
  
  lcd_write_cmd(0x28);
  lcd_write_cmd(0x28);
  lcd_write_cmd(0x02);
  lcd_write_cmd(0x06);
  lcd_write_cmd(0x0C);  
  lcd_write_cmd(0x01);  
  delayms(50);   
}
...

Zeichen lassen sich nun ganz normal anzeigen.

Es ist zwar nicht eine elegante Lösung, aber ich lass es erstmal so.

Vlt. fällt jmd noch was uaf.

MfG und vielen Dank
Matthias

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias S. schrieb:
> Die Initialisierung mit 2* 8Bit müsste doch mit
>
>   HI_EN;
>   long_delay();
>   DATA = 0x30;
>   long_delay();
>   LOW_EN;
>   long_delay();
> 
>
> gemacht werden oder?

Nö, das ist nur ein E-high-Puls.
Die 3 Delays erzeugen doch keine Pulse?


Peter

Autor: Matthias S. (lecorde)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nein, sie erzeugen zwischendurch keine Impulse am Display.

Laut Logikanalyser wird:

1.) EN auf Hi gesetzt
2.) Nach 800us 0011 xxxx an DB7 ... DB0 gelegt
3.) Nach 800us EN auf Low gesetzt

Laut dem Datenblatt des Herstellers der Chips ST7066U wird damit 
zunächst der Modus auf 8Bit gesetzt. Der Hertseller schreibt zwar 0x38, 
aber in seinem Unterprogramm wird nur das oberste Nibble an den 
Datenport angelegt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im 4-Bit Modus muss das 0x30 dreimal hintereinander per ENA geschrieben 
werden. Mit kleiner werdenden Pausen. Erst ~4ms, dann noch ~100us.

MFG
Falk

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müssen die Zeiten ziemlich genau eingehalten werden oder genügt die 
richtige Reihenfolge bei einhaltung der Minimalzeiten`?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
lcd_init:
   rcall   lcd_reset

   ldi     TEMP_A,$28                  ; 4Bit - Mode, 2 Zeilen
   rcall   lcd_control

   ldi     TEMP_A,$80                  ; DDRAM auf Anfang
   rcall   lcd_control

   ldi     TEMP_A,$01                  ; Display löschen
   rcall   lcd_control

   rcall   wait_5ms

   ldi     TEMP_A,$06                  ; Increment, Not Shiftet
   rcall   lcd_control

   ldi     TEMP_A,$10                  ; Cursor Move, Shift off
   rcall   lcd_control

   ldi     TEMP_A,$0C                  ; Display an, Cursor aus
   rcall   lcd_control

   ret

;*********************************************************************
;  Write LCD-Reset...  keine Daten, kein Busy
;
;  Scratch-Reg: TEMP_A
;*********************************************************************

lcd_reset:
   rcall   wait_5ms
   rcall   wait_5ms
   rcall   wait_5ms

   cbi     LCD_CTRL,LCD_RS      ; Register auf Control

   ldi     TEMP_A,$03        ; D4...7 an Bit 0...3
   out     LCD_OUT,TEMP_A

   rcall   lcd_clock

   rcall   wait_5ms

   rcall   lcd_clock

   rcall   wait_5ms

   rcall   lcd_clock

   rcall   wait_5ms

   ldi     TEMP_A,$02                  ; 4Bit - Mode
   rcall   lcd_clock

   rcall   wait_5ms

   ret

;*********************************************************************
;  Clock LCD E-Impuls
;
;  Scratch-Reg: ---
;*********************************************************************

lcd_clock:

   sbi     LCD_CTRL,LCD_E          ; E auf 1    ; 750nS
   nop
   nop
   nop
   nop
   nop
   nop
   cbi    LCD_CTRL,LCD_E          ; E auf 0

   ret

 Ist zwar ASM, aber Du kannst ja mal vergleichen.
 Hier mit Software-Reset des Display mit den 3x 0x30 senden.

Gruß aus Berlin
Michael

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Jan (Gast)

>Müssen die Zeiten ziemlich genau eingehalten werden

Nein.

>oder genügt die
>richtige Reihenfolge bei einhaltung der Minimalzeiten`?

Ja.

MfG
Falk

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So,es geht jetzt. Zwar hatte ich 3x 0x30 auf die Datenports D7...D4 
gelegt, hab aber das anschließende 0x20 vergessen.

MfG und vielen Dank an die Helfer
void lcd_init(void)
{
...
  DATA_OUTPUT();
  LOW_EN;
  LOW_RS;
  LOW_RW;
  LOW_RS;
  delayms(16);

  for(i=0;i<3;i++)
  {
    HI_EN;
    long_delay();
    DATA = 0x30;
    long_delay();
    LOW_EN;
    long_delay();
    delayms(6);
  }

  HI_EN;
  long_delay();
  DATA = 0x20;
  long_delay();
  LOW_EN;
  delayms(6);

  lcd_write_cmd(0x28);
  lcd_write_cmd(0x80);
  lcd_write_cmd(0x01);
  delayms(6);
  lcd_write_cmd(0x06);
  lcd_write_cmd(0x10);
  lcd_write_cmd(0x0C);
  delayms(6); 
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Matthias S. (lecorde)
  for(i=0;i<3;i++)
  {
    HI_EN;
    long_delay();
    DATA = 0x30;
    long_delay();
    LOW_EN;
    long_delay();
    delayms(6);
  }

Hier steckt auch noch eine Unschärfe drin. Der Ruhepegel von ENA ist 
LOW. Du hälst ihn aber auf HIGH! Das kann mal schief gehen. Mach es wie 
im Dateblatt.

MfG
Falk

Autor: Matthias S. (lecorde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hatte ich im Zeitdiagramm des Datenblatts so herausgelesen. Da wurde 
erst EN auf High gesetzt und nach einer kurzen Zeit das Bibble angelegt 
und anchließend nach einem Delay EN zur Übernahme des Nibbles auf Low 
gezogen.

Aber das kann ich ja eh auf
  DATA = 0x30;
  for(i=0;i<3;i++)
  {
    HI_EN;
    long_delay();
    LOW_EN;
    delayms(6);
  }
ändern, da das Nibble nur vor der neg. Flanke anliegen muss.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.