Forum: Projekte & Code LCD Ansteuerung im 4bit-Modus


von Johannes K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich hab eine einfache LCD-Routine für KS0070 und HD44780 LCD-Controller
, welche im 4Bit Modus betrieben werden, geschrieben. Ich steuere damit
einen 2 Zeilen Display mit jeweils 16 Zeichen an.

von Anfänger (Gast)


Lesenswert?

Hallo
Bei Einbinden hat soweit alles funktioniert aber er findet  die 
avrinttypes.h die bei io.h aufgerufen wird nicht. Wer hat dieses 
Programm schonmal zum laufen begracht? Ich habe so ne datei nicht habe 
schon alle includes dursucht.

Ich benutze AVR Studio4 und\ oder CodeVisionAVR

Über eine schnelle Antwort würde ich mich freuen

von Anfänger (Gast)


Lesenswert?

Das Problem ist schon geklärt es ist ein schreibfehler.
Es steht #include <avr/avrinttypes.h> im code(ka ob nur bei mir) doch es 
soll  #include <avr/inttypes.h> heisen.

von rennreh (Gast)


Lesenswert?

Guten Morgen,

ich wollte kein im Sinne der Wiederverwendbarkeit keinen neuen Thread 
erstellen.
folgendes Assembler Programm habe ich geschreiben:
1
.include "m8def.inc"
2
3
4
.def  time =  r16
5
6
;  D4    D0
7
;  D5    D1
8
;  D6    D2
9
;  D7    D3
10
;  RS    D4    
11
;  E    D5
12
;  RW    
13
14
start:
15
  ldi    r16,  LOW(RAMEND)
16
  out    SPL,  r16
17
  ldi    r16,  HIGH(RAMEND)
18
  out    SPH,  r16
19
20
  ldi    r16,  0xff
21
  out    DDRD,  r16
22
23
  ; initialisierung
24
  ; mehr als 15 ms warten
25
  ldi    time,  250  
26
  rcall delay
27
28
29
  ; function set
30
  ldi    r16,  0b00100011
31
  out    PORTD,  r16
32
33
34
  ldi    time,  250
35
  rcall   delay
36
37
38
  ; function set 2
39
  ldi    r16,   0x00
40
  out    PORTD,  r16
41
42
  ldi    r16,  250
43
  rcall  delay
44
45
  ldi    r16,  0b00100011
46
  out    PORTD,   r16
47
48
  ldi    r16,   250
49
  rcall  delay
50
51
52
  ; function set 3
53
  ldi    r16,   0x00
54
  out    PORTD,  r16
55
56
  ldi    r16,  250
57
  rcall  delay
58
59
  ldi    r16,  0b00100011
60
  out    PORTD,   r16
61
62
  ldi    r16,   250
63
  rcall  delay
64
65
  ldi    r16,  0b00000011
66
  out    PORTD,  r16
67
68
69
  ; zeugs
70
  ldi    r16,   250
71
  rcall  delay
72
73
  ldi    r16,   0b00100010
74
  out    PORTD,  r16
75
76
  ldi    r16,  0b00000010
77
  out    PORTD,  r16
78
79
80
81
82
83
  ldi    r16,   250
84
  rcall  delay
85
86
87
  ldi    r16,  0b00100010
88
  out    PORTD,  r16
89
90
  ldi    r16,   250
91
  rcall  delay
92
93
  ldi    r16,  0b00000010
94
  out    PORTD,  r16
95
96
  ldi    r16,   250
97
  rcall  delay
98
99
  ldi    r16,  0b00101000
100
  out    PORTD,  r16
101
102
  ldi    r16,   250
103
  rcall  delay
104
105
  ldi    r16,  0b00001000
106
  out    PORTD,  r16
107
108
  ldi    r16,   250
109
  rcall  delay
110
111
112
113
114
115
116
  ldi    r16,  0b00100000
117
  out    PORTD,  r16
118
119
  ldi    r16,   250
120
  rcall  delay
121
122
  ldi    r16,  0x00
123
  out    PORTD,  r16
124
125
  ldi    r16,   250
126
  rcall  delay
127
128
  ldi    r16,  0b00101000
129
  out    PORTD,  r16
130
131
  ldi    r16,   250
132
  rcall  delay
133
134
  ldi    r16,  0b00001000
135
  out    PORTD,  r16
136
137
  ldi    r16,   250
138
  rcall  delay
139
140
141
142
143
144
145
  ldi    r16,  0b00100000
146
  out    PORTD,  r16
147
148
  ldi    r16,   250
149
  rcall  delay
150
151
  ldi    r16,  0x00
152
  out    PORTD,  r16
153
154
  ldi    r16,   250
155
  rcall  delay
156
157
  ldi    r16,  0b00100001
158
  out    PORTD,  r16
159
160
  ldi    r16,   250
161
  rcall  delay
162
163
  ldi    r16,  0x00
164
  out    PORTD,  r16
165
166
  ldi    r16,   250
167
  rcall  delay
168
  
169
170
171
172
173
  ldi    r16,  0b00100000
174
  out    PORTD,  r16
175
176
  ldi    r16,   250
177
  rcall  delay
178
179
  ldi    r16,  0x00
180
  out    PORTD,  r16
181
182
  ldi    r16,   250
183
  rcall  delay
184
185
  ldi    r16,  0b00100111
186
  out    PORTD,  r16
187
188
  ldi    r16,   250
189
  rcall  delay
190
191
  ldi    r16,  0b00000111
192
  out    PORTD,  r16
193
194
  ldi    r16,   250
195
  rcall  delay
196
197
198
199
loop:
200
  rjmp loop
201
202
203
204
delay:
205
  delay_loop:
206
    dec    time    ;  1
207
    cpi    time,  1  ;  1
208
    nop
209
210
    brlt  delay_loop  ;   2 
211
ret

Das LCD Modul der Firma Batrom, habe ich enntsprechend angeschlossen.
Die datenleitunengen D0 - D3 des Controllers ATMEGA8 habe ich an LCD 
angeschlossen: DB4 - DB7 ... Die Anderen Datenelietungen am LCD hab ich 
auf Masse gesetzt (DB0 - DB3). Da ich kein Busy-Flag abfrage, benötige 
ich das  den Pin E am LCD nicht, so setze ich ihn auf Masse.
RS hängt am D4 und R/W am D5.
Mit einem TC 7660 erzeuge ich eine negative Spannung, mit der ich den 
Kontrast des LCD modifizieren kann.

Wenn ich das Programm auf den Kontroller übertrage, so zeigt mein LCD 
nur zwei schwarze Balken an, mehr aber nicht.

Kann man die Funktion des LCD schrittweise Testen, sodass ich den Fehler 
einkreisen kann ?
oder liegt es am Programm ?


von Falk (Gast)


Lesenswert?

@rennreh

1.) Solche Quelltexte sind besser als Anhang aufgehoben.
2.)

>auf Masse gesetzt (DB0 - DB3). Da ich kein Busy-Flag abfrage, benötige
>ich das  den Pin E am LCD nicht, so setze ich ihn auf Masse.

DAS wage ich zu bezweifeln. Du musst R/W auf Masse legen, aber E wird 
IMMER benötigt.

> Kann man die Funktion des LCD schrittweise Testen, sodass ich den Fehler
>einkreisen kann ?

Werstmal mit dem Simulator schauen, was an den Ports rauskommt. Dann die 
Port auf gute und richtige Verbindung zum LCD prüfen.

> oder liegt es am Programm ?

Who knows?

MFG
Falk

von Karl heinz B. (kbucheg)


Lesenswert?

> @rennreh
>
> 1.) Solche Quelltexte sind besser als Anhang aufgehoben.

Und vor allen Dingen nicht in der Codesammlung.
Wie der Name (und das Kleingedruckte) schon sagt:
Hier geht es um Code der funktioniert, den man anderen
zur gefälligen Weiterbenutzung zur Verfügung stellt.

Ansonsten hat Falk schon alles gesagt:
Ohne E wird das nichts.
Hast du dir das LCD-Beispiel im Tutorial schon mal reingezogen?

von rennreh (Gast)


Lesenswert?

ich danke für eure hilfe.
jap das tutorial habe ich mir angeschaut und ich habe den quellcode 
einfach kopiert und auf den controller geschoben. die verbindungen habe 
ich entsprechend angeschlossen.
so, nun hab ich die verbindungen alle mal durchgeklingelt ich hab nur 
bei einem (DB1) 2 ohm gemessen der rest geht gegen 0.
sorry aber ... mein LCD zeigt immernoch zwei schwarze balken an, selbst 
mit dem quellcode von dem tutorial.

von Falk (Gast)


Lesenswert?

Was für einen Quarz hast du? Bist du sicher, dass dein uC auch läuft? 
Lass mal ne LED blinken.

MfG
Falk

von gast (Gast)


Lesenswert?

Mal ganz blöd....

zwei schwarze Balken?? Liegt das nicht vielleicht am Kontrast?? Nicht 
das du wegen den Balken die Zeichen nicht siehst??

Grüße...

von Paul (Gast)


Lesenswert?

Hallo
Ich steuere meine LCD auch im 4 bit modus an. Nach langem rumsuchen und 
lesen compeliert mein Code jetzt ohne probleme doch ich kann nicht auf 
den EEPROM schreiben es kommt immer eine fehlermeldung.

Die wäre "Extra precaution should be made when using the CKDIV fuse 
and/or Clock Prescaler Register (CLKPR) on parts supportig this."

Davor steht noch das die ISP programming frequency 1/4 der frequenz sein 
sollte das habe ich so auch gemacht. Ich traue mich nicht an die Fuses 
dran kann mir jemang sagen was ich machen soll ich benutze AVR Studio 4. 
Ach genau es gibt ja daten die man auf den fash schreiben muss und das 
geht ohne probleme.

Danke für die Antworten

von Johannes K (Gast)


Lesenswert?

Hallo,
Habe vor langer Zeit einmal die Software erweitert, damit man die 4 
Datenbits am unteren oder oberen Half-Byte eine Ports ausgeben kann. Bin 
bis jetzt leider noch nicht zum Testen gekommen, aber normal sollte 
alles funktionieren.

mfg. Johannes

von Johannes K (Gast)


Angehängte Dateien:

Lesenswert?

Ohne Kommentar.

von Newbie ..... (Gast)


Lesenswert?

Wenn es auch ne dumme Frage ist, aber wo kann man den port und bit-nr. 
einstellen? ich find irgentwie nicht ;)

von Joachim B. (jar)


Lesenswert?

Newbie ..... wrote:
> Wenn es auch ne dumme Frage ist, aber wo kann man den port und bit-nr.
> einstellen? ich find irgentwie nicht ;)


in LCD4b.h ?

#ifndef F_CPU
#define F_CPU 16000000UL     //Prozessor Frequenz in Hz
#endif

#define lcd_e 3              //E Pinnummer
#define lcd_rs 2             //RS Pinnummer
#define HalfByteSel 0        //Oberes (0) oder Unteres Halbbyte (1) für 
Datenübertragung
#define PORT PORTD

von Wolfgang K. (Gast)


Lesenswert?

Hallo!

@ Johannes: Habe deine Quelltexte ausprobiert, funktioniert einwandfrei. 
Danke

Meine Frage: Mit LCD_Data kann ich ein Zeichen laut Tabelle ausgeben und 
mit LCD_Out eine String-Folge. Aber wie bekomme ich eine Variable 
einfach hinaus? Will den ADC-Wert anzeigen lassen.

Vielen Dank jetzt schon mal!

Wolfgang

von Wolfgang K. (Gast)


Lesenswert?

Habs rausgefunden ... ITOA

von Martin (Gast)


Lesenswert?

Hallo,

@ Johannes
@ Wolfang

versuche seit lange mit ein LCD aber funktioniert leider nicht! in der 
LCD4b_v1.2.rar Archiv gibt es 3 Dateien, .h .c und .txt (mit Beispiel), 
meine Frage:
wenn ich alles so wie dort einpielen und kompilieren will wie soll ich 
vorgehen?

ich habe folgendes mit "Notepad" gemacht:

1. ...c öffnen
2.   .h öffnen
3. ganz am ende von .c die Beispielprogram eingefügt also:

#include <avr/io.h>
#include "lcd4b.h"        //LCD-Routine einbinden

int main(void)
{
  DDRD |= 0b11111100;      //Pins 2-7 als Ausgänge
      lcd_linit();        //LCD Initialisieren
  lcd_clear();        //Display löschen
  lcd_out("Hallo Welt");      //Text ausgeben
  lcd_command(line2);      //2. Zeile
  lcd_out("!!!");        //Text ausgeben

  while(1);
}

4. Makefile generiert (für Atmega16 und ext. 147456 Quarz)
5. entsprechende Pins (RS, E und Port) angepasst
6. Kompiliert, ohne Fehler dann am Controller übertragen aber nichts !!!

was mache ich Falsch?
vielen Dank für die Hilfe

Gruß
Martin

von Martin (Gast)


Lesenswert?

Hallo,

hat jemand eine idee für mich?
vielen Dank

Gruß
Martin

von Peta (Gast)


Lesenswert?

Hallo Johannes,

danke für dein Programm, es funktioniert sofort.

Zwei Fragen habe ich da noch:

(1) wie kann ich immer nur auf die zweite Zeile schreiben und die erste 
dabei unverändert lassen? Das lcd_clear löscht ja immer das gesamte 
Display.

(2) Kann ich integer Werte übergeben? Wie ist denn dann der Aufruf?

Danke
Peta

von SoLaLa (Gast)


Lesenswert?

steht so im README:
void lcd_command(char byte)
  sendet einen Befehl an das LCD
  z.B.
lcd_command(line1);  //Der Courser springt in die 1. Zeile
lcd_command(line2);  //Der Courser springt in die 2. Zeile

ich denk mal Johannes hat da so programmiert daß das auch so 
funktioniert :-)

von Peta (Gast)


Lesenswert?

Hallo,

die Grundlagen sind schon gut. Hier noch ein Nachtrag zum einzelnen 
Schreiben von den beiden Zeilen.
1
void write_1st_line(char *s)
2
{
3
  lcd_command(line1);
4
  lcd_out("                "); //16 signs empty
5
  lcd_command(line1);
6
  lcd_out(s);
7
}
8
9
10
11
void write_2nd_line(char *s)
12
{
13
  lcd_command(line2);
14
  lcd_out("                "); //16 signs empty
15
  lcd_command(line2);
16
  lcd_out(s);
17
}


Kann mir jemand helfen? Wie programmiere ich zum Beispiel das:
Pseudocode:
i++;
lcd_out("Tmp betraegt: "i);

Also wie bringe ich in die Zeilenausgabe noch die Variable mit rein?

von SoLaLa (Gast)


Lesenswert?

so wie ich lcd_out verstehe, beherrscht die Routine keine Formatierung.
Das mußt Du wohl in Deinem Programm selbst erledigen

von Peter D. (peda)


Lesenswert?


von Crazy-Sonic (Gast)


Angehängte Dateien:

Lesenswert?

Hi Leute.

Ich beschäftige mich seid ein paar wochen mit einem Atmega48 auf nem 
Atmel Evaluationboard Ver. 2.01 von Pollin.

Folgenede Anschlussbelegung verwende ich:

        LCD Anag Vision 4x20 Zeichen

LCD:       Pollin:   Atmel MC:
             J4

D7 pin14 -->  4 -->    PC3
D6 pin13 -->  3 -->    PC2
D5 pin12 -->  2 -->    PC1
D4 pin11 -->  1 -->    PC0
D3 Pin10 -->GND -->    GND
D2 Pin09 -->GND -->    GND
D1 Pin08 -->GND -->    GND
RW Pin07 -->GND -->    GND
 E pin 6 -->  6 -->    PC4
RS Pin 5 -->  5 -->    PC5


         LED´s an folgenden Ports:

LED:       Pollin:    Atmel MC:
             J4

Rot  -->     11  -->    PB0
Grün -->     12  -->    PB1
Blau -->     13  -->    PB2
Weiß -->     14  -->    PB3
UV   -->     15  -->    PB4

(Ansteuerung über Transistoren BD809)

LED lauflich hat schon gefunzt...
aber LCD bekomm ich absolut nicht zum laufen.
Habe LCD4b_v1.2.rar runtergaladen und angepasst aber irgendwie klapt das 
nicht. Zwei schwarze balken :-(

Ich hoffe ihr könnt mr helfen...


MfG.: Crazy

von Crazy-Sonic (Gast)


Lesenswert?

SO Habe keine Balken mehr "Kontrast einstellung" Schäm
aber Trotzdem noch kein Hallo Welt :-(

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.