Guten Tag, Ich betreibe zur Zeit an einem ATmga32 dieses Display: http://www.avrcard.com/Documents/datasheets/dip204-4.pdf Jetzt hab ich alles fertig gelötet, und als ich dann das Display soweit initialisieren wollte klappte das auch ganz gut, jedoch versteh ich einige Sachen aus dem Datenblatt nicht so ganz :( 1. Das RE Bit, was ist das genau, ist das EN der Steuerleitungen? 2. Das kleine Sternchen was bei den Befehlen drin steht (nur manchmal) was hat das zu sagen, wie muss ich dann den Pin beschalten? Würd mir echt weiterhelfen wenn die Fragen mir keine Hindernisse mehr darstellen;) Besten Danke schonmal, euer Hans
Hi Das RE-Bit findest du im 'Function Set'-Befehl. Sternchen bedeuten 'egal'. MfG Spess
spess53 schrieb:
> Das RE-Bit findest du im 'Function Set'-Befehl.
Jo schon klar, aber was muss ich da genau setzen? Ich steh grad aufem
Schlauch, :D
Schau dir mal den Function Set Befehl an: 0 0 1 DL N RE DH REV Wenn du diesen Befehl an das Display sendest und dabei RE auf 1 stellst, wird ab diesen Moment das Bit RE auf 1 sein. Damit gelten dann nur noch die Zeilen in der Tabell wo in der 1. Spalte RE=1 steht. Wenn du nun einen Befehl senden willst wo in der 1. Spalte für RE ein 0 steht musst du das RE Bit erst wieder mit obigen Befehl auf Null schalten. Bsp. Du möchtest gerne den Kursor auf invertiert schalten. Das geht mit dem Befehl extended Function Set 0 0 0 0 1 FW BW NW wo du das BW-Bit auf 1 setzen musst. Nun funtioniert dieser Befehl aber nur bei gesetztem RE-Bit. Du musst also vorher mit dem Befehl Function Set 0 0 1 DL N RE DH REV das RE Bit erst auf 1 setzen. Danach kannst du das BW-Bit setzen und dann solltest du das RE-Bit wieder zurück schalten, damit die anderen Befehle wieder richtig klappen. Hab damals auch eine Weile gebraucht, vor allem da ich ein 4-zeiliges Display benutzte, wo man das NW-Bit im extended Function Set umschalten muss. Gruß Sven
Ahh okay, weil ich hab die Routine von nem anderen Thread und die meinten wenn man alles umgestelt hat, dann geht das bei denen, aber bei meinem Display zeigt der bei jedem Neu-Einschalten von der Betriebsspannung etwas anderes auf dem Display an und immer so kryptische Zeihen, hab jetzt gedacht, dass es an der Initialisierung liegen kann, aber bei denen geht ja alles. PS.: Meins ist auch vier-zeilig :D Grüße Dennis
kann mir denn niemand die Initialisierung und die Funktion für nen Text asgeben schildern? Ich komm da irgendwie net so drauf. Grüße
Hi >kann mir denn niemand die Initialisierung und die Funktion für nen Text >asgeben schildern? Ich komm da irgendwie net so drauf. Dann zeig doch mal, was du schon hast. Außerdem weiss niemand hier, ob du 8Bit-, 4Bit- oder SPI-Interface benutzt. Die Initialisierung für 8Bit steht übrigens im Datenblatt. MfG Spess
Jo schon, kann ich dann die einzelnen Pins immer High oder Low setzen, und nach ner Zeile dann immer 2-3 ms warten oder? und dann wieder alle so umstellen und wieder warten? Dann nehm ich die 8-Bit Methode und wie kann ich dann genau dem Display die einzelnen Buchstaben senden? Grüße Dennis
Guten Abend wieder einmal ;) also ich hab jetzt die Initialisierung genau nach dem Datenblatt gemacht, also wie es in der 8-Bit Variante steht, jedoch macht mein LCD gar nichts, ich hab immer 3 ms Pause zwischen jedem Byte. Hab die Pins genau so High oder Low gesetzt, wie es d abeschrieben ist :( Hoff jemand hat ähnliche Erfahrungen oder Probleme und kann mir helfen.
Hi >also ich hab jetzt die Initialisierung genau nach dem Datenblatt >gemacht,... Wie? Wenn du dich weiterhin so sperrst, mal deinen Code zu zeigen, kannst du kaum auf Hilfe hoffen. MfG Spess
Okay Tshculdigung, hab halt immer die PINS high oder Low gesetz, und dann 5 ms abgewartet ;)
1 | #include <avr/io.h> |
2 | #define F_CPU 1000000UL
|
3 | #include <util/delay.h> |
4 | |
5 | //Wait Funktion
|
6 | //
|
7 | void wait(unsigned int ms) |
8 | {
|
9 | for(unsigned int temp=0;temp != ms;temp++) |
10 | _delay_ms(1); |
11 | }
|
12 | |
13 | void wait_us(unsigned int us) |
14 | {
|
15 | for(unsigned int temp=0;temp != us;temp++) |
16 | _delay_us(1); |
17 | }
|
18 | |
19 | void LCD_INIT(void) |
20 | {
|
21 | DDRB=0b11111111; //Port B auf Ausgang |
22 | DDRD=0b11111111; //Port D auf Ausgang |
23 | |
24 | |
25 | //00 00110100
|
26 | PORTD &= ~(1<<PD7); |
27 | PORTD &= ~(1<<PD6); |
28 | |
29 | PORTB &= ~(1<<PB4); |
30 | PORTB &= ~(1<<PB3); |
31 | PORTB |= (1<<PB2); |
32 | PORTD |= (1<<PD0); |
33 | PORTD &= ~(1<<PD1); |
34 | PORTD |= (1<<PD2); |
35 | PORTD &= ~(1<<PD3); |
36 | PORTD &= ~(1<<PD3); |
37 | wait(5); |
38 | |
39 | |
40 | ///00 00001001
|
41 | PORTD &= ~(1<<PD7); |
42 | PORTD &= ~(1<<PD6); |
43 | |
44 | PORTB &= ~(1<<PB4); |
45 | PORTB &= ~(1<<PB3); |
46 | PORTB &= ~(1<<PB2); |
47 | PORTD &= ~(1<<PD0); |
48 | PORTD |= (1<<PD1); |
49 | PORTD &= ~(1<<PD2); |
50 | PORTD &= ~(1<<PD3); |
51 | PORTD |= (1<<PD3); |
52 | wait(5); |
53 | |
54 | |
55 | //00 00110000
|
56 | PORTD &= ~(1<<PD7); |
57 | PORTD &= ~(1<<PD6); |
58 | |
59 | PORTB &= ~(1<<PB4); |
60 | PORTB &= ~(1<<PB3); |
61 | PORTB |= (1<<PB2); |
62 | PORTD |= (1<<PD0); |
63 | PORTD &= ~(1<<PD1); |
64 | PORTD &= ~(1<<PD2); |
65 | PORTD &= ~(1<<PD3); |
66 | PORTD &= ~(1<<PD3); |
67 | wait(5); |
68 | |
69 | |
70 | //00 00001111
|
71 | PORTD &= ~(1<<PD7); |
72 | PORTD &= ~(1<<PD6); |
73 | |
74 | PORTB &= ~(1<<PB4); |
75 | PORTB &= ~(1<<PB3); |
76 | PORTB &= ~(1<<PB2); |
77 | PORTD &= ~(1<<PD0); |
78 | PORTD |= (1<<PD1); |
79 | PORTD |= (1<<PD2); |
80 | PORTD |= (1<<PD3); |
81 | PORTD |= (1<<PD3); |
82 | wait(5); |
83 | |
84 | |
85 | //00 00000001
|
86 | PORTD &= ~(1<<PD7); |
87 | PORTD &= ~(1<<PD6); |
88 | |
89 | PORTB &= ~(1<<PB4); |
90 | PORTB &= ~(1<<PB3); |
91 | PORTB &= ~(1<<PB2); |
92 | PORTD &= ~(1<<PD0); |
93 | PORTD &= ~(1<<PD1); |
94 | PORTD &= ~(1<<PD2); |
95 | PORTD &= ~(1<<PD3); |
96 | PORTD |= (1<<PD3); |
97 | wait(5); |
98 | |
99 | |
100 | //00 00000110
|
101 | PORTD &= ~(1<<PD7); |
102 | PORTD &= ~(1<<PD6); |
103 | |
104 | PORTB &= ~(1<<PB4); |
105 | PORTB &= ~(1<<PB3); |
106 | PORTB &= ~(1<<PB2); |
107 | PORTD &= ~(1<<PD0); |
108 | PORTD &= ~(1<<PD1); |
109 | PORTD |= (1<<PD2); |
110 | PORTD |= (1<<PD3); |
111 | PORTD &= ~(1<<PD3); |
112 | wait(5); |
113 | }
|
114 | |
115 | //Main-Funktion
|
116 | //
|
117 | int main(void) |
118 | {
|
119 | LCD_INIT(); |
120 | |
121 | while(1) |
122 | {
|
123 | |
124 | }
|
125 | |
126 | return 1; |
127 | }
|
Das ist zwar jetzt PIC-Assembler, aber Anhand der gesetzten Bits und der einzuhaltenden Wartezeiten, solltest du das auch in AVR-C übernehmen können. Ich hatte damals genau das selbe Display (4x20 Zeichen) und mit dieser Init ging es auf Anhieb.
1 | ;LCD initialisieren in 9 Schritten |
2 | |
3 | call Wait250 ; 250 ms Pause nach dem Einschalten |
4 | |
5 | movlw B'00110000' ; 1 8-Bit Mode |
6 | movwf LcdPort |
7 | bsf LcdE |
8 | nop |
9 | bcf LcdE |
10 | |
11 | movlw D'50' ; 50 ms Pause |
12 | movwf loops |
13 | call WAIT |
14 | |
15 | movlw B'00110000' ; 2 8-Bit Mode |
16 | call Control8Bit |
17 | movlw B'00110000' ; 3 8-Bit Mode |
18 | call Control8Bit |
19 | movlw B'00100000' ; 4 4-Bit Mode |
20 | call Control8Bit |
21 | |
22 | movlw B'00101100' ; 4a 4-Bit Mode; RE-Bit ein |
23 | call OutLcdControl |
24 | movlw B'00001001' ; 4b 4-Zeilenmodus, 5x7 |
25 | call OutLcdControl |
26 | movlw B'00101000' ; 4c 4-Bit Mode; RE-Bit aus |
27 | call OutLcdControl |
28 | movlw B'00000001' ; 5 löschen und cursor home |
29 | call OutLcdControl |
30 | movlw B'00001000' ; 6 display off |
31 | call OutLcdControl |
32 | movlw B'00000110' ; 7 entry mode, increment, disable display-shift |
33 | call OutLcdControl |
34 | movlw B'00000011' ; 8 cursor home, cursor home |
35 | call OutLcdControl |
36 | movlw B'00001100' ; 9 display on, cursor off, blink off |
37 | call OutLcdControl |
Eventuell nützt es dir ja was. Sven
Da war doch auch mal was mit dreimal hintereinander senden oder? weil mitder Init vom Datnblatt, gehts auf jeden Fall net oder machte ich was falsch? In Assembler bin ich jetzt net gut, drum verstehich da auch nix, aber der ungefäre Ablauf deiner Init würde mir helfen. Guten Abend noch
Hi >Okay Tshculdigung, hab halt immer die PINS high oder Low gesetz, und >dann 5 ms abgewartet ;) Ups. So geht das überhaupt nicht. Das Display hat 3 Steuerleitungen: RS- Gibt an, ob es sich um Daten oder Befehle handelt. RW- Entscheidet über Lesen oder Schreiben E - Mit der fallenden Flanke werden die an D0-D7 anliegenden Daten/Befehle übernommen Um z.B. den Befehl 'Function Set' lt. Datenblatt an das Display zu übergeben must du folgendes machen: E auf H setzen RS auf L setzen RW auf L setzen an D7-D0 $34 anlegen E auf L setzen kurz warten E auf H setzen. Ich habe dir mal das Datenblatt von dem Kontroller angehängt, der in deinem Display ist. Auf S.49 sind die Signale dargestellt. Meine C-Kenntnisse sind etwas rudimentär, aber muss man dein 'Programm' so interpretieren, das die Datenleitungen an verschiedenen Ports hängen? MfG Spess
Cool danke man, du hast des echt super erzählt, hätt sowas nie aus dem Datenblatt herausgelesen, weil da war ja eins dabei, aber ich denk das ist beim ersten mal normal oder? ;) Werd mich nacher mal dran setzen ;) DANKE schonmal, denk jetzt wirds auch gehen ;)
Kann es sein, dass die Init vom Datenblatt nicht geht? weil da steht ds so: 00 00110100 00 00001001 00 00110000 00 00001111 00 00000001 00 00000110 und dann hab ich den Code so geschrieen wie oben beschrieben:
1 | void LCD_INIT(void) |
2 | {
|
3 | DDRB=0b11111111; //Port C auf Ausgang |
4 | DDRD=0b11111111; //Port D auf Ausgang |
5 | |
6 | |
7 | //00 00110100
|
8 | //
|
9 | PORTD |= (1<<PD5); |
10 | PORTD &= ~(1<<PD7); |
11 | PORTD &= ~(1<<PD6); |
12 | |
13 | PORTB &= ~(1<<PB4); |
14 | PORTB &= ~(1<<PB3); |
15 | PORTB |= (1<<PB2); |
16 | PORTD |= (1<<PD0); |
17 | PORTD &= ~(1<<PD1); |
18 | PORTD |= (1<<PD2); |
19 | PORTD &= ~(1<<PD3); |
20 | PORTD &= ~(1<<PD3); |
21 | |
22 | PORTD &= ~(1<<PD5); |
23 | wait(50); |
24 | PORTD |= (1<<PD5); |
25 | |
26 | //00 00001001
|
27 | //
|
28 | PORTD &= ~(1<<PD7); |
29 | PORTD &= ~(1<<PD6); |
30 | |
31 | PORTB &= ~(1<<PB4); |
32 | PORTB &= ~(1<<PB3); |
33 | PORTB &= ~(1<<PB2); |
34 | PORTD &= ~(1<<PD0); |
35 | PORTD |= (1<<PD1); |
36 | PORTD &= ~(1<<PD2); |
37 | PORTD &= ~(1<<PD3); |
38 | PORTD |= (1<<PD3); |
39 | |
40 | PORTD &= ~(1<<PD5); |
41 | wait(50); |
42 | PORTD |= (1<<PD5); |
43 | |
44 | //00 00110000
|
45 | //
|
46 | PORTD &= ~(1<<PD7); |
47 | PORTD &= ~(1<<PD6); |
48 | |
49 | PORTB &= ~(1<<PB4); |
50 | PORTB &= ~(1<<PB3); |
51 | PORTB |= (1<<PB2); |
52 | PORTD |= (1<<PD0); |
53 | PORTD &= ~(1<<PD1); |
54 | PORTD &= ~(1<<PD2); |
55 | PORTD &= ~(1<<PD3); |
56 | PORTD &= ~(1<<PD3); |
57 | |
58 | PORTD &= ~(1<<PD5); |
59 | wait(50); |
60 | PORTD |= (1<<PD5); |
61 | |
62 | //00 00001111
|
63 | //
|
64 | PORTD &= ~(1<<PD7); |
65 | PORTD &= ~(1<<PD6); |
66 | |
67 | PORTB &= ~(1<<PB4); |
68 | PORTB &= ~(1<<PB3); |
69 | PORTB &= ~(1<<PB2); |
70 | PORTD &= ~(1<<PD0); |
71 | PORTD |= ~(1<<PD1); |
72 | PORTD |= (1<<PD2); |
73 | PORTD |= (1<<PD3); |
74 | PORTD |= (1<<PD3); |
75 | |
76 | PORTD &= ~(1<<PD5); |
77 | wait(50); |
78 | PORTD |= (1<<PD5); |
79 | |
80 | //00 00000001
|
81 | //
|
82 | PORTD &= ~(1<<PD7); |
83 | PORTD &= ~(1<<PD6); |
84 | |
85 | PORTB &= ~(1<<PB4); |
86 | PORTB &= ~(1<<PB3); |
87 | PORTB &= ~(1<<PB2); |
88 | PORTD &= ~(1<<PD0); |
89 | PORTD &= ~(1<<PD1); |
90 | PORTD &= ~(1<<PD2); |
91 | PORTD &= ~(1<<PD3); |
92 | PORTD |= (1<<PD3); |
93 | |
94 | PORTD &= ~(1<<PD5); |
95 | wait(50); |
96 | PORTD |= (1<<PD5); |
97 | |
98 | //00 00000110
|
99 | //
|
100 | PORTD &= ~(1<<PD7); |
101 | PORTD &= ~(1<<PD6); |
102 | |
103 | PORTB &= ~(1<<PB4); |
104 | PORTB &= ~(1<<PB3); |
105 | PORTB &= ~(1<<PB2); |
106 | PORTD &= ~(1<<PD0); |
107 | PORTD &= ~(1<<PD1); |
108 | PORTD |= (1<<PD2); |
109 | PORTD |= (1<<PD3); |
110 | PORTD &= ~(1<<PD3); |
111 | |
112 | PORTD &= ~(1<<PD5); |
113 | wait(50); |
114 | PORTD |= (1<<PD5); |
115 | |
116 | }
|
Mach doch endlich mal eine Funktion aus deinem Einzelbitspaghetticode. Sowas schaut sich doch niemand länger als 10s an. Dann passiert dir sowas auch nicht: PORTD &= ~(1<<PD3); PORTD &= ~(1<<PD3); Zweimal hintereinander macht die Null auch nicht besser.
Jo THX aber ausschlaggebend war das nicht, also eig schon, aber hatte noch ein Tippfehler, jetzt ist das teil initialisiert, und jetzt kommt die zweite hürde, aber ich denk das grig ich hin THX!
Hey jetzt ab ich ja alles mal erreicht, also die Init geht jetzt erfekt, und ein Befehl, dass der Cursor nach Links und rechts rutscht hab ich auch geschrieben. Was mir jetzt noch fehlt ist der Text, ich weiß, dass der Text in zwei Nibbles gesendet wird, aber wie sag ich meiner 8-Bit Init, dass ich jetzt eine nText i der Zeile schreiben will? Ich versteh das Grundprinzip vom senden, High-Nibble senden enablen Low-Nibble senden enablen und warten. Doch wie schreib ich das jetzt in meinem Code? Hoff jemand kann mir ne Stütze sein.
Hi Erst mal vorneweg: Was hat dich geritten, D0..D7 auf zwei Ports zu splitten? >Was mir jetzt noch fehlt ist der Text, ich weiß, dass der Text in zwei >Nibbles gesendet wird, Nein, wird genau wie ein Befehl gesendet, nur das RS=H ist. Du bist im 8-Bit-Mode. Ich muss mich Holger anschliessen: Was du als erstes brauchst, ist eine Funktion, die einen 8-Bit-Wert auf deine Pins verteilt. Oder willst du jedes ASCII-Zeichen bitweise verteilen? MfG Spess
Also wenn ich das richtig verstehe dann muss ich nur Nibbles einzeln senden, wenn ich einen 4-Bit Mode hab oder? ja das ist jetzt natürlich doof, weil ich kann ja das nicht so einfach mit dem gesplitteten Port macen oder? Naja das ist mein erstes Display, ich mach noch nicht lang mit den uC, drum immer die Fragen;) also wenn ich jetzt einzelne Variablen erstel, und denen dann immer die 1 oder die 0 zuweiß, dann geht es ja aber sicher nicht mehr in einer Binär Zahl? Aber ich muss doch noch mehr machen als nur die "Upper Bits" und die "Lower Bits" (Kann mir einer sagen was damit gemeint ist?) zu übertragen oder? Danke für das Verständnis ;)
Hi Am einfachsten wäre es, wenn du mal mitteilst, wie dein ATMega32 jetzt beschaltest ist. Unter Umständen wäre es einfacher, noch mal den Lötkolben zu benutzen, als hier irgendwelche Softwareklimmzüge zu machen. MfG Spess
PB4 PB3 PB2 PD0 PD1 PD2 PD3 PD3 so ist er zur zeit beschaltet, wobei ich hier jetzt einen jumper hab, um den dann auf 4-Bit umzustellen, also PD0 wird dann zu PB1, also 4 Bit dann, weiß nicht ob das was bringt, Initialisieren kann ich das auch. Aber hier muss ich ja dann auf zwei mal senden oder?
Hi >PB4 >PB3 >PB2 >PD0 >PD1 >PD2 >PD3 >PD3 >so ist er zur zeit beschaltet Und wo gehen die hin? MfG Spess
PB4 7 PB3 6 PB2 5 PB1 4 (oder im 8-Bit Modus PD0) PD1 3 PD2 2 PD3 1 PD4 0 Meinste so? Wenn man da eine Funktion schreiben könnte, die auch mit den gemischten Ports auskommt macht das ja kein Problem das ist halt alles auf Lochraster, drum ist ein zweites Löten nicht allzu gut. Und dann muss ich einfach nur RS auf Data setzen, das Byte schreiben? Wie adressier ich das dann alles? Am besten ist nacher einfach eine Funktion, in der ich Das Wort, und den Spalten und Zeilenbeginn übergeb.
Also wie wäre dann der genaue Ablauf wenn ich eine Funktion schreiben will, welche einen Text an einer besimme Stelle am LCD schreibt? Ich verstehe das mit der Adressierung nicht so richtig, die Funktion mit den Parametern ist nacher kein Problem mehr. Also mir fehlt nur der Ablauf wie oben schon mit dem enable beschrieben wurde.
Hat mir denn keiner den Grundsätzlichen Ablauf, wenn ich etwas auf diesem Display anzeigen will? Ich brauch nur den Grundsatz, damit ich eine Funktion schreiben kann. Hab sonst nix gefunden. Hoff irgendjemand kennt sich mit dem aus ;)
Hallo, im C File des Anhangs kannst Du solche Abläufe mal sehen. Servus Wolfgang
Hallo, und damit die Bezeichnung der Sonderzeichen leichter fällt .. noch ein kleiner header für diesen Controller. Wolfgang
Hallo, ich hab die Routine von hier genutzt; funktioniert einwandfrei. Beitrag "LCD EA DIP204-4 Initialisieren" Entgegen der Andeutung im Schaltplan den Reset Pin des Displays aber keinesfalls auf Ground, sondern per 10kOhm gegen +5V oder einfach unbeschaltet lassen.
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.