mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Buchstaben am LCD nicht richtig dargestellt


Autor: Ronald E. (ronald_1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein kleines Problem mit meinem ANAG VISON AV0820.
Datenblatt:
http://www.google.at/#hl=de&&sa=X&ei=flXVTM70G4WXO...

Ich kann zwar in beide Zeilen Buchstaben schreiben, diese werden jedoch 
nicht richtig dargestellt. Die Kontrastspannung ist richtig eingestellt 
(und auch daran herumregeln vervollständigt die Buchstaben nicht). Ich 
benütze einen ATMEGA8 (myAVR board). Der Schaltplan ist im Anhang. 
Ebenso ein Bild vom Display (sorry das es so groß ist, aber sonst kann 
man den Fehler nicht erkennen).
Hat evt. jemand eine Idee woran es liegen könnte?
Ich bitte um Hilfe.

MfG Ronald
#include <avr/io.h>
#define F_CPU 3686400UL
#include <util/delay.h>


#define LCD_RS        PC0
#define LCD_RW        PC1
#define LCD_EN        PC2
#define LCD_DATAPORT  PORTD
#define LCD_CTRLPORT  PORTC
#define LCD_DATADIR   DDRD
#define LCD_CTRLDIR   DDRC



////////////////////////////////////////////////////////////////////////////////
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)
 
#define LCD_BOOTUP_MS           15
#define LCD_ENABLE_US           1
#define LCD_WRITEDATA_US        46
#define LCD_COMMAND_US          42
 
#define LCD_SOFT_RESET_MS1      5
#define LCD_SOFT_RESET_MS2      1
#define LCD_SOFT_RESET_MS3      1
#define LCD_SET_4BITMODE_MS     5
 
#define LCD_CLEAR_DISPLAY_MS    2
#define LCD_CURSOR_HOME_MS      2
 
////////////////////////////////////////////////////////////////////////////////
// Zeilendefinitionen des verwendeten LCD
// Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
// Bei anderen Zeilenlängen müssen diese Einträge angepasst werden
 
#define LCD_DDADR_LINE1         0x00
#define LCD_DDADR_LINE2         0x40
#define LCD_DDADR_LINE3         0x10
#define LCD_DDADR_LINE4         0x50

////////////////////////////////////////////////////////////////////////////////
// LCD Befehle und Argumente.
// Zur Verwendung in lcd_command
 
// Clear Display -------------- 0b00000001
#define LCD_CLEAR_DISPLAY       0x01
 
// Cursor Home ---------------- 0b0000001x
#define LCD_CURSOR_HOME         0x02
 
// Set Entry Mode ------------- 0b000001xx
#define LCD_SET_ENTRY           0x04
 
#define LCD_ENTRY_DECREASE      0x00
#define LCD_ENTRY_INCREASE      0x02
#define LCD_ENTRY_NOSHIFT       0x00
#define LCD_ENTRY_SHIFT         0x01
 
// Set Display ---------------- 0b00001xxx
#define LCD_SET_DISPLAY         0x08
 
#define LCD_DISPLAY_OFF         0x00
#define LCD_DISPLAY_ON          0x04
#define LCD_CURSOR_OFF          0x00
#define LCD_CURSOR_ON           0x02
#define LCD_BLINKING_OFF        0x00
#define LCD_BLINKING_ON         0x01
 
// Set Shift ------------------ 0b0001xxxx
#define LCD_SET_SHIFT           0x10
 
#define LCD_CURSOR_MOVE         0x00
#define LCD_DISPLAY_SHIFT       0x08
#define LCD_SHIFT_LEFT          0x00
#define LCD_SHIFT_RIGHT         0x04
 
// Set Function --------------- 0b001xxxxx
#define LCD_SET_FUNCTION        0x20
 
#define LCD_FUNCTION_4BIT       0x00
#define LCD_FUNCTION_8BIT       0x10
#define LCD_FUNCTION_1LINE      0x00
#define LCD_FUNCTION_2LINE      0x08
#define LCD_FUNCTION_5X7        0x00
#define LCD_FUNCTION_5X10       0x04
 
#define LCD_SOFT_RESET          0x30
 
// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
#define LCD_SET_CGADR           0x40
 
#define LCD_GC_CHAR0            0
#define LCD_GC_CHAR1            1
#define LCD_GC_CHAR2            2
#define LCD_GC_CHAR3            3
#define LCD_GC_CHAR4            4
#define LCD_GC_CHAR5            5
#define LCD_GC_CHAR6            6
#define LCD_GC_CHAR7            7
 
// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
#define LCD_SET_DDADR           0x80
 
////////////////////////////////////////////////////////////////////////////////
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init( void );
 
////////////////////////////////////////////////////////////////////////////////
// LCD löschen
void lcd_clear( void );
 
////////////////////////////////////////////////////////////////////////////////
// Cursor in die 1. Zeile, 0-te Spalte
void lcd_home( void );
 
////////////////////////////////////////////////////////////////////////////////
// Cursor an eine beliebige Position 
void lcd_setcursor( unsigned char spalte, unsigned char zeile );
 
////////////////////////////////////////////////////////////////////////////////
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition 
void lcd_data( unsigned char data );
 
////////////////////////////////////////////////////////////////////////////////
// Ausgabe eines Strings an der aktuellen Cursorposition 
void lcd_string( const char *data );
 
////////////////////////////////////////////////////////////////////////////////
// Ausgabe eines Kommandos an das LCD.
void lcd_command( unsigned char data );

////////////////////////////////////////////////////////////////////////////////
// Erzeugt einen Enable-Puls
static void lcd_enable( void )
{
    LCD_CTRLPORT |= (1<<LCD_EN);     // Enable auf 1 setzen
    _delay_us( LCD_ENABLE_US );      // kurze Pause
    LCD_CTRLPORT &= ~(1<<LCD_EN);    // Enable auf 0 setzen
}
 
////////////////////////////////////////////////////////////////////////////////
// Sendet eine 8-bit Ausgabeoperation an das LCD
static void lcd_out8( unsigned char data )
{
    LCD_DATAPORT = data;
    lcd_enable();
}

////////////////////////////////////////////////////////////////////////////////
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init( void )
{
    // verwendete Pins auf Ausgang schalten
    unsigned char pins = (1<<LCD_RW) |           // R/W Leitung
                         (1<<LCD_RS) |           // R/S Leitung
                         (1<<LCD_EN);            // Enable Leitung


    LCD_CTRLDIR  |= pins;
    LCD_CTRLPORT &= ~pins;
    LCD_DATADIR  |= 0xFF;
    LCD_DATAPORT &= ~0xFF;


    // warten auf die Bereitschaft des LCD
    _delay_ms( LCD_BOOTUP_MS );
    
    // Soft-Reset muss 3mal hintereinander gesendet werden 
    // zur Initialisierung
    lcd_out8( LCD_SOFT_RESET );
    _delay_ms( LCD_SOFT_RESET_MS1 );
 
    lcd_enable();
    _delay_ms( LCD_SOFT_RESET_MS2 );
 
    lcd_enable();
    _delay_ms( LCD_SOFT_RESET_MS3 );

    // 8-bit Modus / 2 Zeilen / 5x7
    lcd_command( LCD_SET_FUNCTION |
                 LCD_FUNCTION_8BIT |
                 LCD_FUNCTION_2LINE |
                 LCD_FUNCTION_5X7 );
 
    // Display ein / Cursor aus / Blinken aus
    lcd_command( LCD_SET_DISPLAY |
                 LCD_DISPLAY_ON |
                 LCD_CURSOR_OFF |
                 LCD_BLINKING_OFF); 
 
    // Cursor inkrement / kein Scrollen
    lcd_command( LCD_SET_ENTRY |
                 LCD_ENTRY_INCREASE |
                 LCD_ENTRY_NOSHIFT );
 
    lcd_clear();
}
  
////////////////////////////////////////////////////////////////////////////////
// Sendet ein Datenbyte an das LCD
void lcd_data( unsigned char data )
{

    LCD_CTRLPORT |= (1<<LCD_RS);    // RS auf 1 setzen


    lcd_out8( data );
    _delay_us( LCD_WRITEDATA_US );
}
 
////////////////////////////////////////////////////////////////////////////////
// Sendet einen Befehl an das LCD
void lcd_command( unsigned char data )
{

    LCD_CTRLPORT &= ~(1<<LCD_RS);    // RS auf 0 setzen

    lcd_out8( data );
    _delay_us( LCD_COMMAND_US );
}

////////////////////////////////////////////////////////////////////////////////
// Sendet den Befehl zur Löschung des Displays
void lcd_clear( void )
{
    lcd_command( LCD_CLEAR_DISPLAY );
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
}
 
////////////////////////////////////////////////////////////////////////////////
// Sendet den Befehl: Cursor Home
void lcd_home( void )
{
    lcd_command( LCD_CURSOR_HOME );
    _delay_ms( LCD_CURSOR_HOME_MS );
}
 
////////////////////////////////////////////////////////////////////////////////
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..4) 
 
void lcd_setcursor( unsigned char x, unsigned char y )
{
    unsigned char data;
 
    switch (y)
    {
        case 1:    // 1. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;
            break;
 
        case 2:    // 2. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;
            break;
 
        case 3:    // 3. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x;
            break;
 
        case 4:    // 4. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x;
            break;
 
        default:
            return;                                   // für den Fall einer falschen Zeile
    }
 
    lcd_command( data );
}
 
////////////////////////////////////////////////////////////////////////////////
// Schreibt einen String auf das LCD
 
void lcd_string( const char *data )
{
    while( *data != '\0' )
        lcd_data( *data++ );
}
 
////////////////////////////////////////////////////////////////////////////////
// MAIN
void main(void)
{
  lcd_init();

  lcd_setcursor(0,1);
  lcd_string("Hallo");
  lcd_setcursor(0,2);
  lcd_string("Forum");
  

  while (1)
  {
    
  }
}


Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manchmal ist es das, wonach es aussieht: LCD defekt!

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@  Ronald E. (ronald_1)

>      PC050049.JPG
>      1.3 MB, 16 Downloads


>Ebenso ein Bild vom Display (sorry das es so groß ist, aber sonst kann
>man den Fehler nicht erkennen).

Ausrede. Lies mal was über Bildformate und lerne mit deiner Kamera 
umzugehen. Und dann lies was über Netiquette, lange Quelltexte 
gehören in den Anhang.

>Hat evt. jemand eine Idee woran es liegen könnte?

Möglicherweise ist das LCD defekt. Denn die Software schreibt nur ganze 
Zeichen, nicht einzelene Spalten. Es kann aber auch sein, dass das LCD 
eine Verschiebung des Textes um einzelene Spalten ermöglichst und das 
aus Versehen irgendwie um eine Spalte verschoben wurde. Das kann man 
aber auf dem LCD sehen, ob die erste Spalte tot ist oder nicht. In 
deinem "tollen Bild" sieht man nichts.

MFG
Falk

P S Und nun vergleiche mal das Bild im Anhang mit deinem Monster.

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Das kann man
> aber auf dem LCD sehen, ob die erste Spalte tot ist oder nicht. In
> deinem "tollen Bild" sieht man nichts.

Zwar mit wenig Kontrast, aber auf meinem Monitor kann man die erste 
Spalte sehen ...und sie ist tot.

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

tut mir leid für das Bild und den Quellcode im Text. Zuerst habe ich das 
LCD an einem Infineon XC164 betrieben (und es hat einwandfrei 
funktioniert). Beim ATMEGAE hab ich nun diese Probleme. Jetzt hab ichs 
nochmals an den XC164 gehängt, und es zeigt sich ein ähnliches Bild.
Heißt das, dass das Display hinüber ist?

MfG Ronald

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Scheint wohl so.

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. kein Kontakt zwischen Kontrollerplatine und LCD-Glas (oft mittels 
leitender Gummileiste), das kann man meistens reparieren

2. Bruch des LCD-Glases am Kontakt, das kann man nicht reparieren

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann sein, dass der Leitgummi, der von der Platine zum eigentlichen 
Display (Glas) führt, keinen Kontakt macht.

Versuche es mal mit Drücken, Biegen oder Schieben.
Gehen die restlichen Spalten?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  eProfi (Gast)

>Gehen die restlichen Spalten?

Wie man am Bild unschwer erkennen kann . . .

Namen sind Schall und Rauch . . .

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort: Kontrastspannung?

Da mal ein bisschen rumprobiert?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Lehrmann Michael (ubimbo)

>Stichwort: Kontrastspannung?

>Da mal ein bisschen rumprobiert?

Stichwort lesen? Schon mal probiert?

"Die Kontrastspannung ist richtig eingestellt (und auch daran 
herumregeln vervollständigt die Buchstaben nicht)."

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also hab mal ein Bisschen rumgedrückt und rumgeschoben. Da passiert 
nichts. Danach hab ich mal an der kleinen Schaltung für die 
Kontrastspannung herumgerüttelt. Plötzlich waren alle Felder des 
Displays alle komplett im Besten Kontrast ausgeleuchtet (Keine 
Buchstaben, sondern die kompletten Felder).

MfG

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Plötzlich waren alle Felder des
> Displays alle komplett im Besten Kontrast ausgeleuchtet (Keine
> Buchstaben, sondern die kompletten Felder).

Auch das erste Feld und dort die erste Spalte?

Das ist schwer zu sehen, wenn man so drückt und schüttelt. Vielleicht 
den Makromode plus Moviemode der Kamera benutzen und später die 
Einzelbilder getrennt untersuchen (Virtualdub oder ähnliches Videotool).

Ansonsten den Aufbau der Kontrastspannung überprüfen und ggf. neu bauen.

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab das Poti zur Sicherheit mal getauscht (selbes Bild). Wenn ich die 
Spannungsversorgung des Displays unterbreche und anschließend wieder 
hingebe, ist die erste Zeile komplett ausgeleuchtet (auch die erste 
Spalte des ersten Feldes).

MfG

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fällt allerdings auf, dass die Leuchtintensität nicht mehr so stark 
ist, als es noch funktionierte.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ronald E. schrieb:

> hab das Poti zur Sicherheit mal getauscht (selbes Bild).

Welches myAVR Board hast du genau? MK1 LPT oder MK2 USB oder anderes?

Wie wurde die Verkabelung zwischen myAVR Board und LCD gemacht?

Auf dem MK1 LPT und dem MK2 USB sind je zwei Poti vorhanden. Benutzt du 
eines davon zur Kontrasteinstellung?

Beim MK1 LPT und dem MK2 USB liegen an der 20-poligen Erweiterungsbuchse 
nur PD2 bis PD7. PD0 und PD1 musst du ja anderswo besorgen (RXD, TXD).

> Es fällt allerdings auf, dass die Leuchtintensität nicht mehr so stark
> ist, als es noch funktionierte.

Wie bzw. wo ist die Beleuchtung angeschlossen?

Autor: Dennis Brenzel (danrulz81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das Display ist wohl defekt. Hatte ich auch mal:

Beitrag "Kontrastproblem am LCD"

Das neue funktionierte einwandfrei, mit der gleichen Software und gleich 
verkabelt.

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ja ich denk auch dass es hinüber ist. es funktioniert auf keinen der 
beiden controller (und vorher hats funktioniert). Ich besorg mir mal ein 
neues und probiers nochmals. Ich geb dann nochmal Bescheid.
Danke für eure Hilfe.

MfG Ronald

Autor: Ronald E. (ronald_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan: Mk2 ... habs mittlerweile auf den Infineon umgesteckt --> und 
da schauts nun gleich aus wie beim avr. Ich habs mal zu nem Freund 
mitgenommen, und denke dass beim Transport was zu Bruch gegangen ist. 
Wie gesagt, ich meld mich nochmal wenn ich das neue habe.

MfG

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.