mikrocontroller.net

Forum: Compiler & IDEs Fehler bei 4Bit LCD Init?


Autor: Thorsten Paesler (chaosmaker)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen zusammen!

Ich verzweifel gerade dabei, ein LCD-Display an einen ATmega16 zu 
klemmen.
Allen die mich jetzt aufmerksam machen wollen auf anderen Foreneinträge 
kann ich versichern, ich habe schon alles durchsucht (nicht nur dieses 
Forum hier) und alle vorgefertigeten Codes ausprobiert.

Immer mit dem selben Missrfolg, dass sich nichts tut und das Display 
leer bleibt oder nur für den Bruchteil einer Sekunde auf beiden Zeilen 
den gleichen Sonderzeichenmüll anzeigt.

Kurz vorweg, der ATmega16 wurde schon gewechselt und das Display wurde 
auch schon durch ein Display anderen Types ersetzt, daher schliesse ich 
einen Hardwareschaden an den 2 Bauteilen aus.

Ich hoffe das wer den Fehler sieht den ich gemacht habe. Möglich wäre 
es, dass hier ein Fehler drin ist der natürlich in dem zum Teil fertig 
angebotenen Code nicht drin ist (allerdings funktionieren diese 
Beispiele ja auch nicht). Daher möchte ich alles von Grund auf einmal 
durchtesten und ausprobieren. Falls es nicht am Code liegen sollte, weis 
ich zumindest das die Software funktioniert.

Ich habe mir das Hitachi Datenblatt des HD44780 Controllers durchgelesen 
und eine sehr vereinfachte Form des 4Bit Inits und der Datenübertragung 
gebastelt.

Um die Arbeit zu erleichtern habe ich das Hitachi Datenblatt in  den 
Anhang gesteckt.
Die Seiten 47 (4Bit Init) und 25,26 (Table 6) der PDF sind wichtig.

Pinnbelegung von PA0 bis PA6:
D4 D5 D6 D7 RS RW EN
Die Spannungsversorgung sollte auch stimmen.

Es handelt sich um ein 2 Zeiliges Display mit 5x8 Punkten.

Hier der etwas beschnittene Code:
#define F_CPU 4000000  

#include <avr/io.h>
#include <util/delay.h>

#define LCD_PORT      PORTA
#define LCD_RS        4
#define LCD_RW        5
#define  LCD_EN        6

#define LCD_enable_pulse()   LCD_PORT &= ~(1 << LCD_EN);_delay_us(5);LCD_PORT |=  (1 << LCD_EN)

void   Port_Init(void) {  
  DDRA = 0b11111111;    // LCD  
  DDRD = 0b11110011; 
}

int   main(void) {
  
  Port_Init();
  LED1_R();
  LED2_R();
  LCD_PORT = 0b00000000;
  double speed = 10;

  // INIT  

  DELAY(1000); // 1000ms = 1s

  LCD_PORT = 0b00000011;  LCD_enable_pulse();     DELAY(10);
  
  LCD_PORT = 0b00000011;  LCD_enable_pulse();     DELAY(1);
  
  LCD_PORT = 0b00000011;  LCD_enable_pulse();  DELAY(speed);
  
  LCD_PORT = 0b00000010;  LCD_enable_pulse();     DELAY(speed);
  
  LCD_PORT = 0b00000010;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00001011;  LCD_enable_pulse();  DELAY(speed);  
  
  LCD_PORT = 0b00000000;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00001000;  LCD_enable_pulse();  DELAY(speed);  

  LCD_PORT = 0b00000000;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00000001;  LCD_enable_pulse();  DELAY(speed);
  
  LCD_PORT = 0b00000000;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00000111;  LCD_enable_pulse();  DELAY(speed);

  // DATA

  LCD_PORT = 0b00010011;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00010001;  LCD_enable_pulse();  DELAY(speed);
  // => 1

  LCD_PORT = 0b00010011;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00010010;  LCD_enable_pulse();  DELAY(speed);
  // => 2

  LCD_PORT = 0b00010011;  LCD_enable_pulse();  DELAY(speed);
  LCD_PORT = 0b00010011;  LCD_enable_pulse();  DELAY(speed);
  // => 3
  
  while(1) {
  
  }
}

Vielen Dank schonmal.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt meines HD44780-kompatiblen Displays sieht die 
Initialisierung etwas anders aus. Außerdem ist es sinnvoll, den 
ENABLE-Impuls als High-Impuls und nicht wie bei Dir als Low-Impuls 
durchzuführen. Abgesehen davon solltest Du alles an Code schicken, was 
für das Problem relevant sein könnte. Ich vermisse z.B. die Definition 
von DELAY().

Autor: Thorsten Paesler (chaosmaker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok den Pulse habe ich eben umgedreht da tut sich immer noch nichts.
#define LCD_enable_pulse()   LCD_PORT |=  (1 << LCD_EN);_delay_us(5);LCD_PORT &= ~(1 << LCD_EN)

Die DELAY Methode hatte ich mir schon einmal zurechtgefummelt und mit in 
den Header gepackt. hier ist der Code.
void   DELAY(float wait_delay) {
  float p;
  for(p=0;p<=wait_delay;p++) 
  {_delay_ms(1);}
}

Könntest du mir den Link für dein Datenblatt geben? Möglicherweise hat 
Hitachi ja doch unterschiede zum allgemienen HD44780 Chip.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für ein Display ist das überhaupt? Meine sind von Electronic 
Assembly (www.lcd-module.de). Früher habe ich mal mit einem Sharp 2x16 
gearbeitet, und mit der selben Init-Routine laufen definitiv auch die 
EA-Module.

BTW:
Was hat Dich eigentlich geritten, einen float als Übergabeparameter für 
die DELAY-Funktion zu verwenden? Für eine Variable, bei der eh nur der 
ganzzahlige Anteil eine Bedeutung hat, benutzt man doch um Himmels 
Willen keinen Gleitkommatyp!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Könntest du mir den Link für dein Datenblatt geben? Möglicherweise hat
> Hitachi ja doch unterschiede zum allgemienen HD44780 Chip.
Übrigens: Der HD44780 IST von Hitachi. Deshalb wird es da wohl kaum 
Unterschiede geben. Bei anderen Display-Controllern (sog. 
44780-kompatible, z.B. der KS 0073, der in den EA-Displays verbaut ist) 
kann es geringfügige Unterschiede im Timing geben.

Autor: Thorsten Paesler (chaosmaker)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> BTW:
> Was hat Dich eigentlich geritten, einen float als Übergabeparameter für
> die DELAY-Funktion zu verwenden? Für eine Variable, bei der eh nur der
> ganzzahlige Anteil eine Bedeutung hat, benutzt man doch um Himmels
> Willen keinen Gleitkommatyp!

Das ist ein Überbleibsel. Zuerst sollte das Dalay eben auch z.B. 120.5 
anerkennen können. Aber das hat wohl nichts mit dem grundlegenden 
Problem zu tun.

Datenblatt ist im Anhang.

Autor: Johannes M. (johnny-m)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Schön, das Datenblatt gibt anscheinend überhaupt keine Auskunft über 
4-Bit-Initialisierung. Das Hauptproblem an Deiner Initialisierung dürfte 
sein, dass Du die 8-Bit-Init aus dem Datenblatt übernommen hast und das 
Display zunächst auch auf 8 Bit initialisierst! Du darfst am Anfang kein 
"0b00000011" senden. Das muss "0b00000010" sein. Die erste Version sagt 
dem Display, dass es im 8-Bit-Modus angesteuert wird.

Ich hab Dir mal das Sharp-LCD-Manual angehängt. Ist zwar schon älter, 
aber mit den Initialisierungsroutinen da drin hab ich bisher noch jedes 
Display ans laufen gekriegt. Auf S. 14 ist die Init-Sequenz für den 
4-Bit-Modus.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW:
Mit den Displaytech-Modulen hab ich auch schon gearbeitet und die 
Initialisierungs-Sequenz nach dem Sharp-Manual funktioniert 
nachgewiesenermaßen.

Autor: Thorsten Paesler (chaosmaker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Hitachi DB und in deinem von Sharp steht das zuerst 3mal 0b00000011 
(im 8Bit Modus) gesendet werden soll und dann erst 0b00000010 zum 
umschalten auf 4Bit.

Netterweise passt dein Vorschlag. Ich bekomme jetzt eine Ausgabe, mit 
ein paar Ausgabefehlern. Aber die bekomme ich schon behoben.

Danke vielmals!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jau, hast Recht. Hatte ich jetzt nicht mehr so genau hingeschaut. Aber 
wenns läuft ist ja gut.

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.