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.
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
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.
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 ?
@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
> @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?
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.
Was für einen Quarz hast du? Bist du sicher, dass dein uC auch läuft? Lass mal ne LED blinken. MfG Falk
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...
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
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
Wenn es auch ne dumme Frage ist, aber wo kann man den port und bit-nr. einstellen? ich find irgentwie nicht ;)
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
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
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
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
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 :-)
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?
so wie ich lcd_out verstehe, beherrscht die Routine keine Formatierung. Das mußt Du wohl in Deinem Programm selbst erledigen
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.