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


von tim (Gast)


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:
1
$regfile = "m8def.dat"
2
$crystal = 1000000                                         
3
4
'Pins (Port B) für LCD-Modul definieren
5
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
6
Config Lcd = 16 * 1a       'LCD-Modul 1x16
7
Config Portb = Output
8
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32   'LCD-Sonderzeichen
9
Cls
10
Lcd "Hello world"
11
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

von ARM-Fan (Gast)


Lesenswert?

Wie wärs, wenn du mal deinen Versuch in "C" postest?

von Dennis (Gast)


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.....

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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.

von déjà vu (Gast)


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

von Nixweiss (Gast)


Lesenswert?

tja da sieht man mal wieder wie gut bascom ist.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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 ;-)

von defekter_netzschalter (Gast)


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"?

von déjà vu (Gast)


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.

von tim (Gast)


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.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include "lcd-routines.h"
4
5
#define DELAY50US() _delay_us(25); _delay_us(25)
6
 
7
// LCD Befehle
8
 
9
#define CLEAR_DISPLAY 0x01
10
#define CURSOR_HOME   0x02
11
 
12
// Pinbelegung für das LCD
13
 
14
#define PORT_LCD      PORTB
15
#define LCD_RS        5
16
#define  LCD_EN        4
17
 
18
 
19
// sendet ein Datenbyte an das LCD
20
void lcd_data(unsigned char temp1)
21
{
22
   unsigned char temp2 = temp1;
23
 
24
   temp1 = temp1 >> 4;
25
   temp1 = temp1 & 0x0F;
26
   PORT_LCD &= 0xF0;
27
   PORT_LCD |= temp1 | (1<<LCD_RS); // inkl. LCD_RS = RS-Leitung setzen
28
   lcd_enable();
29
 
30
   temp2 = temp2 & 0x0F;
31
   PORT_LCD &= 0xF0;
32
   PORT_LCD |= temp2 | (1<<LCD_RS); // inkl. LCD_RS = RS-Leitung setzen
33
   lcd_enable();
34
   
35
   DELAY50US();
36
}
37
 
38
// sendet einen Befehl an das LCD
39
// wie lcd_data, nur ohne RS zu setzen
40
void lcd_command(unsigned char temp1)
41
{
42
   unsigned char temp2 = temp1;
43
 
44
   temp1 = temp1 >> 4;   // oberes Nibble holen
45
   temp1 = temp1 & 0x0F; // maskieren
46
   PORT_LCD &= 0xF0;
47
   PORT_LCD |= temp1;        // setzen
48
   lcd_enable();
49
 
50
   temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
51
   PORT_LCD &= 0xF0;
52
   PORT_LCD |= temp2;        // setzen
53
   lcd_enable();
54
   
55
   DELAY50US();
56
}
57
 
58
// erzeugt den Enable-Puls
59
void lcd_enable(void)
60
{
61
   PORT_LCD |= (1<<LCD_EN);
62
   asm("nop");
63
   asm("nop");
64
   asm("nop");
65
   PORT_LCD &= ~(1<<LCD_EN);
66
}
67
 
68
// Initialisierung: 
69
// Muss ganz am Anfang des Programms aufgerufen werden.
70
// LCD_PORT  (DDRx) muss bereits als Ausgang eingestellt sein.
71
void lcd_init(void)
72
{
73
   unsigned char temp3 = 50;
74
 
75
   while(temp3 != 0)
76
   {
77
      _delay_ms(5);  // 5ms = 250ms warten
78
      temp3 = temp3 - 1;
79
   }
80
 
81
   // muss 3mal hintereinander gesendet werden zur Initialisierung
82
   PORT_LCD &= 0xF0;
83
   PORT_LCD |= 0x03;       // 0b00000011  
84
   lcd_enable();
85
   PORT_LCD |= 0x03;
86
   lcd_enable();
87
   PORT_LCD |= 0x03;
88
   lcd_enable();
89
 
90
   // 4bit-Modus einstellen
91
   PORT_LCD |= 0x02;       
92
   lcd_enable();
93
   _delay_ms(5);
94
 
95
   // 4Bit / 1 Zeile / 5x8
96
   lcd_command(0x20);   
97
 
98
   // Display ein / Cursor aus / kein Blinken
99
   lcd_command(0x0C);          
100
 
101
   // inkrement / kein Scrollen
102
   lcd_command(0x06);
103
}
104
 
105
// Sendet den Befehl zur Löschung des Displays
106
void lcd_clear(void)
107
{
108
   lcd_command(CLEAR_DISPLAY);
109
   _delay_ms(5);
110
}
111
 
112
// Sendet den Befehl: Cursor Home
113
void lcd_home(void)
114
{
115
   lcd_command(CURSOR_HOME);
116
   _delay_ms(5);
117
}

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.