www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Die übliche Kinderkrankheit: LCD


Autor: tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Also ich bin jetzt kurz vorm verzweifeln. Ich habe unzählige 
Forenbeiträge angeschaut, viele verschiedene fertige Quellcodes (in C) 
und Bibliotheken modifiziert und trotzdem nicht mein 1x16 Zeichen 
Display zum arbeiten bewegen können.
In Bascom habe ich ein funktionierendes Programm:
$regfile = "m8def.dat"
$crystal = 1000000                                         

'Pins (Port B) für LCD-Modul definieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 1a       'LCD-Modul 1x16
Config Portb = Output
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32   'LCD-Sonderzeichen
Cls
Lcd "Hello world"
Wait 10
Nur in C wills mir nicht gelingen. Ich hab das Display an einen Atmega8 
angehängt. Pinbelegung steht im obigen Bascom Programm. Hab gleich mal 
das Datenblatt des LCDs angehängt.

Vielleicht kann mir mal jemand ein Programm schicken, das funktionieren 
sollte.

danke

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs, wenn du mal deinen Versuch in "C" postest?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tim,

wo ist denn dein Datenblatt hin? -- malsogefragt

ich würde mich wundern, wenn einer hier dir ein fertiges Programm 
schickt, du musst die Lösung schon selber herausarbeiten...

Lass mal zuerst die grundlegenden Sachen ausschliessen:

1.) kannst du in C Programmieren??
    Wenn "nein": erst das hier lesen und verstehen:
    http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
2.) Ist es dir klar, wie ein LCD angesteuert wird??
    Wenn "nein" : guggstdu hier:
    http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
3.) wenn du die beiden oberen Links durchgearbeitet hast, so kannst du 
definitiv kein Problem mehr haben  --> Problem gelöst, Thread 
geschlossen :-)

Gruss:

"Ich bekomme mein LCD nicht zum laufen" - 
Seufzernichtmehrhörenkannmensch

Und nochwas: Hier im Forum gibt es eine Suchfunktion, mit Hirn benutzt 
bringt sie echt was.....

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ Dennis (Gast)

> wo ist denn dein Datenblatt hin? -- malsogefragt

Das Datenblatt hatte Tim versehentlich an einen anderen Thread 
angehängt. Er hatte auch darum gebeten, dass jemand diesen Lapsus 
korrigiert.

Ich hatte hier als 3. Nachricht einen Link auf den anderen Thread 
gesetzt.

Leider ist inzwischen der Thread mit dem Datenblatt sowie mein Hinweis 
darauf spurlos verschwunden.

Ich hatte aber aus Neugier das Datenblatt heruntergeladen und hänge es 
jetzt an...

> der Rest deiner Nachricht...

Verschlägt mir die Worte.

Autor: déjà vu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> der Rest deiner Nachricht...
>Verschlägt mir die Worte.
anderen verschlaegts die sprache, wenn jeden zweiten tag die gleichen 
fragen auftauchen, obwohl sich einige leute einen haufen arbeit machen 
und ganze tutorials drueber schreiben:

http://www.mikrocontroller.net/forum/1?filter=lcd

Autor: Nixweiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja da sieht man mal wieder wie gut bascom ist.

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
déjà vu wrote:
>>> der Rest deiner Nachricht...
>>Verschlägt mir die Worte.
> anderen verschlaegts die sprache, wenn jeden zweiten tag die gleichen
> fragen auftauchen, obwohl sich einige leute einen haufen arbeit machen
> und ganze tutorials drueber schreiben:
>
> http://www.mikrocontroller.net/forum/1?filter=lcd

Stell dir vor die gleichen Fragen würden nicht mehr regelmäßig 
auftauchen - Google müsste seine ganze Werbung umkrempeln ;-)

Autor: defekter_netzschalter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>anderen verschlaegts die sprache, wenn jeden zweiten tag die gleichen
>fragen auftauchen

Offenbar nicht, oder warum kommt von diesen "anderen" stets ein 
grenzwertiger Spruch so in Richtung "Du bist so blöd und ich bin der 
Oberpeiler, werde dir aber nicht helfen"?

Autor: déjà vu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man muss kein oberpeiler sein, um die suchfunktion benutzen zu koennen. 
aber lassen wir das. da koennte man auch mit einer wand reden, 
spaetestens uebermorgen kommt die naechste frage nach lcds, 
led-vorwiderstaenden oder nach dem ultimativ richtigen controller fuer 
einsteiger. ich hoffe die 'aehliche 
beitraege'-funktion(Beitrag "Neue Funktion: ähnliche Beiträge (experimentell)") wird 
bald eingefuehrt, dann hat das endlich ein ende.

Autor: tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke für die freundlichen Hinweise auf die Tut's. Trotzdem hakts 
noch wo. Hab mal den Code gepostet, so wie er im LCD-Tutorial steht - 
aber auf mein LCD umgebogen.
#include <avr/io.h>
#include <util/delay.h>
#include "lcd-routines.h"

#define DELAY50US() _delay_us(25); _delay_us(25)
 
// LCD Befehle
 
#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME   0x02
 
// Pinbelegung für das LCD
 
#define PORT_LCD      PORTB
#define LCD_RS        5
#define  LCD_EN        4
 
 
// sendet ein Datenbyte an das LCD
void lcd_data(unsigned char temp1)
{
   unsigned char temp2 = temp1;
 
   temp1 = temp1 >> 4;
   temp1 = temp1 & 0x0F;
   PORT_LCD &= 0xF0;
   PORT_LCD |= temp1 | (1<<LCD_RS); // inkl. LCD_RS = RS-Leitung setzen
   lcd_enable();
 
   temp2 = temp2 & 0x0F;
   PORT_LCD &= 0xF0;
   PORT_LCD |= temp2 | (1<<LCD_RS); // inkl. LCD_RS = RS-Leitung setzen
   lcd_enable();
   
   DELAY50US();
}
 
// sendet einen Befehl an das LCD
// wie lcd_data, nur ohne RS zu setzen
void lcd_command(unsigned char temp1)
{
   unsigned char temp2 = temp1;
 
   temp1 = temp1 >> 4;   // oberes Nibble holen
   temp1 = temp1 & 0x0F; // maskieren
   PORT_LCD &= 0xF0;
   PORT_LCD |= temp1;        // setzen
   lcd_enable();
 
   temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
   PORT_LCD &= 0xF0;
   PORT_LCD |= temp2;        // setzen
   lcd_enable();
   
   DELAY50US();
}
 
// erzeugt den Enable-Puls
void lcd_enable(void)
{
   PORT_LCD |= (1<<LCD_EN);
   asm("nop");
   asm("nop");
   asm("nop");
   PORT_LCD &= ~(1<<LCD_EN);
}
 
// Initialisierung: 
// Muss ganz am Anfang des Programms aufgerufen werden.
// LCD_PORT  (DDRx) muss bereits als Ausgang eingestellt sein.
void lcd_init(void)
{
   unsigned char temp3 = 50;
 
   while(temp3 != 0)
   {
      _delay_ms(5);  // 5ms = 250ms warten
      temp3 = temp3 - 1;
   }
 
   // muss 3mal hintereinander gesendet werden zur Initialisierung
   PORT_LCD &= 0xF0;
   PORT_LCD |= 0x03;       // 0b00000011  
   lcd_enable();
   PORT_LCD |= 0x03;
   lcd_enable();
   PORT_LCD |= 0x03;
   lcd_enable();
 
   // 4bit-Modus einstellen
   PORT_LCD |= 0x02;       
   lcd_enable();
   _delay_ms(5);
 
   // 4Bit / 1 Zeile / 5x8
   lcd_command(0x20);   
 
   // Display ein / Cursor aus / kein Blinken
   lcd_command(0x0C);          
 
   // inkrement / kein Scrollen
   lcd_command(0x06);
}
 
// Sendet den Befehl zur Löschung des Displays
void lcd_clear(void)
{
   lcd_command(CLEAR_DISPLAY);
   _delay_ms(5);
}
 
// Sendet den Befehl: Cursor Home
void lcd_home(void)
{
   lcd_command(CURSOR_HOME);
   _delay_ms(5);
}

Die main.c ist auch die selbe wie im Tutorial aber DDRB statt DDRD 
eingestellt.

Das, was ich am LCD zu sehen bekomme ist, dass die ersten 8 Kästchen 
durch die Hintergrundbeleuchtung komplett schwarz sind und sich lauter 
"w" darin befinden. Also 8 w's nebeneinander.

auf freundliche unterstützung hofft
tim

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.