www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HD44780 kompatibles LCD Display.


Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich habe heute mein HD44780 kompatibles LCD Display angeschlossen udn 
versuche nun vergebens etwas auszugeben.
Als ich das ganze das erstemal angeschlossen habe da waren alle Stellen 
wo man dann etwas ausgeben kann noch dunkel und übers Poti regelbar, das 
ist nichtmehr so.
kann es sein das das kaputt ist?
Also es mach nichts außer schön blau leuchten. Wie kann man das ganze 
einfach testen? Anschlüsse habe ich eigl alle überprüft

möchte den 4-bit modus
http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDE...

Ich habe das gefühl ich verstehe dei initialisierung falsch und wie gebe 
ich dann ein Zeichen aus, z.B. H das dieplay ist zweilzeilig.

Danke

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ist mein testcode
#include <avr/io.h>         
#include <stdio.h>
#include <stdlib.h>

#define LCD_PORT         PORTC        
#define LCD_DATA0_PIN    3          
#define LCD_DATA1_PIN    4            
#define LCD_DATA2_PIN    5          
#define LCD_DATA3_PIN    6           
#define LCD_RS_PIN       0         
#define LCD_RW_PIN       1            
#define LCD_E_PIN        2       

void msleep(int msec);
void enable();

int main(void)
{
  DDRC = 0xff; // port als ausgang
  msleep(20);
  
  LCD_PORT = 0b00010000; // 4bit datenlänge einschalten
  enable();
  msleep(10);


  LCD_PORT = 0b00000000; 
  enable();
  msleep(10);        //display ein cursor ein cursor blinken
  LCD_PORT = 0b01111000; 
  enable();
  msleep(10);
  
  



  
  
  while(1);
}

void enable()
{
  LCD_PORT |= (1 << LCD_E_PIN);
  msleep(5);
  LCD_PORT &= ~(1 << LCD_E_PIN);
}

void msleep(int msec)
{  
  for (int s=0; s<msec; s++) {
    for (long int i=0; i<2403; i++) {
      asm volatile("nop"); 
    }
  }
}


Autor: Wilhelm F. (ferkes-willem)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich habe das gefühl ich verstehe dei initialisierung falsch und wie
>gebe ich dann ein Zeichen aus, z.B. H das dieplay ist zweilzeilig.

Ein Flußdiagramm der Initialisierung sollte im Datenblatt vorhanden 
sein.

Am besten suchst du mal nach Softwarebeispielen.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich es im Kopf habe muss 3x 0x03 und einpaar zeichen mehr 
ausgegebenwerden zur Initialisierung.
Zu diesem Controller findet man genügend Beispiele.
Nicht vergessen D/I umschalten.

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja Ok
aber wie ist das mit Function Set da blick ich nicht durch.
Muss ich das 2mal machen? und da muss ich ja auch irgendwie die Display 
größe mit reinbringen wie mache ich das?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>größe mit reinbringen wie mache ich das?

Gar nicht. Initialisieren musst du nur auf eine oder zwei Zeilen.

>  LCD_PORT = 0b00010000; // 4bit datenlänge einschalten

Und zählen lernen;) 0x20 sieht bei mir anders aus.

Autor: Wilhelm F. (ferkes-willem)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cyb3r schrieb:

>aber wie ist das mit Function Set da blick ich nicht durch.

>Muss ich das 2mal machen?

Ich sah Beispiele, wo es auch 3 mal gemacht wurde.

Und zwischen den Initialisierungsschritten, müssen Wartezeiten 
eingehalten werden.

Daher, bitte auf jeden Fall mal das Datenblatt besorgen.

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Und zählen lernen;) 0x20 sieht bei mir anders aus.

omg Liese doch mal den Quellcode ich hab doch oben definiert wie meine 
Pinbelegung ist auch wenn ichs zu dem Zeitpunkt nicht nutze

So ich habe meine Quellcode einmal überarbeitet:
    Jedoch ist mein Problem nun wie dei Funktion lcd_load_byte aussehen 
muss? Muss ich dsa ganze immer in s Register schreiben? ich bin 
irgendwie verwirrt /verpeilt heute
Danke für die Hilfe
#include <avr/io.h>    

#define LCD_PORT          PORTC
#define LCD_ENABLE_PIN    2
#define LCD_RW_PIN        1 
#define LCD_RS_PIN        0 
#define LCD_D4_PIN        3
#define LCD_D5_PIN        4
#define LCD_D6_PIN        5
#define LCD_D7_PIN        6


#defune FUNCTION_SET  
#define ENTRY_MODE_SET    
#define LCD_CMD_ON 
#define LCD_CMD_OFF  
#define LCD_CMD_CLEAR    


void _delay_ms(int msec);
void _delay_us(int usec);

void lcd_init();
void lcd_send_cmd();
void lcd_strobe_E();
void lcd_load_byte(int out_byte);

int main (void)
{
    // PORTC Pin 0...7 Outputs fürs Display
  DDRC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5) | (1 << DDC6) | (1 << DDC7);                    
    
        
  while(true);
    return 0;
}

void lcd_load_byte(int out_byte)
{

}

void lcd_strobe_E()
{
    // strobe E Signal */
    LCD_PORT |= _BV(LCD_ENABLE_PIN);
    _delay_us(450); 
    LCD_PORT &= ~_BV(LCD_ENABLE_PIN);
}

void lcd_send_cmd()
{
    /* Befehl liegt an, so RS muss low (0) sein */
    LCD_PORT &= ~_BV(LCD_RS_PIN); 
    lcd_strobe_E();
    _delay_us(40);
}

void lcd_init()
{
  // 20ms delay ... LCD power
    _delay_ms(16);       
  LCD_PORT &= ~_BV(LCD_ENABLE_PIN);     // E = 0
  LCD_PORT &= ~_BV(LCD_RW_PIN);       // R/W = 0
  LCD_PORT &= ~_BV(LCD_RS_PIN);      // RS = 0   
   
    //schreibe 0x30 -> LCD und warte 5 ms damit die Instruktion verarbeitet ist 
    lcd_load_byte(0x30);
    lcd_send_cmd();
    _delay_ms(5);
   
    //schreibe 0x30 -> LCD und warte 160 us damit die Instruktion verarbeitet ist
    lcd_load_byte(0x30);
    lcd_send_cmd();
    _delay_us(160);
  
    //schreibe 0x30 -> LCD und warte 160 us damit die Instruktion verarbeitet ist
    lcd_load_byte(0x30);
    lcd_send_cmd();
    _delay_us(160);
   
    // Function Set und 40 us warten
    lcd_load_byte(FUNCTION_SET);
    lcd_send_cmd();
  _delay_us(40);

    // Display OFF 40 us warten
    lcd_load_byte(LCD_CMD_OFF);    
    lcd_send_cmd();
  _delay_us(40);

    // Clear Display und 2 ms warten
    lcd_load_byte(LCD_CMD_CLEAR);    
    lcd_send_cmd();
    _delay_ms(2);
  _delay_us(40);
    
    // Entry Mode Set und 40 us warten
    lcd_load_byte(ENTRY_MODE_SET);    
    lcd_send_cmd();
  
    // Display ON und 40 us warten
    lcd_load_byte(LCD_CMD_ON);    
    lcd_send_cmd();
  _delay_us(40);
}


void _delay_ms(int msec)
{  
  for (int s=0; s<msec; s++) {
    for (long int i=0; i<2403; i++) {
      asm volatile("nop"); 
    }
  }
}

void _delay_us(int usec)
{  
  for (int s=0; s<usec; s++) {
    for (long int i=0; i<2; i++) {
    if(true)
      asm volatile("nop"); 
    }
  }
}

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setze es erst 2x hintereinander in den 8-Bit-Modus und dann in den 
4-Bit-Modus. Damit bist Du auf der sicheren Seite. Sonst weßt Du ja gar 
nicht, ob das Display gerade das obere oder das untere Halb-Byte 
erwartet.
void lcd_load_byte(int out_byte)
{

}

macht evtl. etwas wenig ...

... so wie eigentlich das ganze Programm ...


Du benötigst im 4-Bit-Mode zwei Schreibvorgänge pro Byte ... (hint)


Gruß

Jobst

Autor: LCD (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void lcd_load_byte( char byte , uint8_t mode)
{
// daten oder befehlsmodus auswählen
// also die jeweiligen leitungen setzen/ löschen

//obere 4 bit des char out_byte an die 4 datenleitungen anlegen
// enable pin vom LCD an .... 80µs warten  ... aus

//untere 4 bit  an die datenleitungen anlegen
// enable pin vom LCD an .... 80µs warten  ... aus
}


um das ganze universell zu halten kann man die pins direkt vorher 
undefinieren

  if(byte & 0x80) LCDPORTD7 |= (1<<LCD_D7);
  if(byte & 0x40) LCDPORTD6 |= (1<<LCD_D6);
  if(byte & 0x20) LCDPORTD5 |= (1<<LCD_D5);
  if(byte & 0x10) LCDPORTD4 |= (1<<LCD_D4);
  dann enable togglen

dann entweder bitschieben byte<<=4 ; und nochmal das ganze
(in einer schleife schnell machbar)
oder man schreibt das ganze nochmal hin

  if(byte & 0x08) LCDPORTD7 |= (1<<LCD_D7);
  if(byte & 0x04) LCDPORTD6 |= (1<<LCD_D6);
  if(byte & 0x02) LCDPORTD5 |= (1<<LCD_D5);
  if(byte & 0x01) LCDPORTD4 |= (1<<LCD_D4);
  enable togglen


kann man sowas nit mit in das tut aufnehmen ???
alle 2 tage kommt sone frage

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cyb3r schrieb:
> holger schrieb:
>> Und zählen lernen;) 0x20 sieht bei mir anders aus.
>
> omg Liese doch mal den Quellcode ich hab doch oben definiert wie meine
> Pinbelegung ist auch wenn ichs zu dem Zeitpunkt nicht nutze

omg Lies doch bitte das Tutorial. Da gibt es einen ganzen Abschnitt über 
LCD.
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

omg benutz doch bitte google. LCD Libraries gibt es für den HD44780 wie 
Sand am Meer.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LCD schrieb:

> um das ganze universell zu halten kann man die pins direkt vorher
> undefinieren
>
>   if(byte & 0x80) LCDPORTD7 |= (1<<LCD_D7);

Das ist leider nur die halbe Miete
    if(byte & 0x80)
      LCDPORTD7 |= (1<<LCD_D7);
    else
      LCDPORTD7 &= ~(1<<LCD_D7);

> kann man sowas nit mit in das tut aufnehmen ???

Kann man. Warum nicht du?

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe auch alle fertigen Librarys jetzt durchgetestet das tut sich 
bei mir auch absolut garnichts und die Pinbelegung, sowie die Leitungen 
überprüft alles einwandfrei.

Aber trotzdem habe ich noch ein grundlegendes verständiss Problem
unzwar wenn ich im 4bit modus bin werden immer zuerst die 4 
höherwertigen bits gesendet?

und ich sende 4bit (hbit) erzeuge die negative flanke mit enable und 
dann wieder 4bit(lbit) und flanke ??
die wartezeit zwiscehn den bits kann beliebig lang sein?

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es hat sich alles geklärt

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.