Hallo, ich habe das Display eDIP240-7 von EA in Betrieb genommen und versuche es mit einem Atmega über I2C anzusteuern. Dafür verwende ich die I2C Library von Peter Fleury. Ich habe den Beispielcode aus dem Datenblatt ausprobiert. Dieser sollte eine diagonale Linie von 0,0 nach 239,127 zeichnen. Die Rückgabe von ACK sollte 0x06 (i.O.) oder 0x15 (n.i.O) lauten. Es kommt aber im das zuletzt gesendete Byte zurück. In diesem Fall 0xDA. Es erscheint keine Linie auf dem Display. Es leuchtet lediglich die blaue Hintergrundbeleuchtung. Hat jemand eine Idee, woran es liegen könnte? Viele Grüße Christian
Hallo, Hast Du vor dem Senden, den Empfangspuffer leergemacht?
>Hat jemand eine Idee, woran es liegen könnte?
Du hast keine Ahnung was du tust. Eine Library zu verwenden
ist ohne Ahnung vom Thema zu haben nicht sinnvoll.
Also lies mal was zum Thema I2C.
Damit du ein kleines Erfolgserlebnis hast hier mal wie es
vermutlich gehen wird:
1 | i2c_start(LCD_ADDRESS + I2C_WRITE); |
2 | i2c_write(0x11); |
3 | i2c_write(0x0A); |
4 | i2c_write(0x1B); |
5 | i2c_write(0x44); |
6 | i2c_write(0x4C); |
7 | i2c_write(0x1B); |
8 | i2c_write(0x47); |
9 | i2c_write(0x44); |
10 | i2c_write(0x00); |
11 | i2c_write(0x00); |
12 | i2c_write(0xEF); |
13 | i2c_write(0x7F); |
14 | i2c_write(0xDA); |
15 | i2c_rep_start(LCD_ADDRESS + I2C_READ); |
16 | c=i2c_readNak(); |
Ach verdammt... die "Richtung" vergessen! Ich werde das morgen gleich ausprobieren. Danke soweit!
Also ich habe jetzt I2C_WRITE und I2C_READ ergänzt. Die Linie sehe ich noch immer nicht und das LCD liefert als ACK jetzt 0xFF zurück... @Sebastian: Zum Thema Empfangspuffer leeren konnte ich im Datenblatt nichts finden. Hat noch jemand eine Idee? Viele Grüße Christian
Wenn ich jetzt readAck durch readNak ersetze, dann liefert mir das Display 0x06. Aber darstellen tut das Display trotzdem nix...
Christian schrieb: > Zum Thema Empfangspuffer leeren konnte ich im Datenblatt > nichts finden. Seite 8, unter deinem Beispiel ("Inhalt des Sendepuffers anfordern").
Auf der Webseite des Herstellers gibt's fertige Libs. Hier ein paar Schnipsel, ist zwar für ein 160x104 Touch, die Sw sollte aber meines Wissens auch 1:1 für die dickeren passen.
1 | #include <avr/io.h> |
2 | #define F_CPU 16000000UL
|
3 | #include <util/delay.h> |
4 | |
5 | #include <string.h> |
6 | #include <stdio.h> |
7 | #include <avr/interrupt.h> |
8 | #include "i2cmaster.h" |
9 | #include "eDIP-Touch.h" |
10 | #include "gendefs.h" |
11 | |
12 | |
13 | |
14 | // command to display: ctd
|
15 | unsigned char ctddark[] = {0x04, 0x1B, 'Y', 'H', 0}; |
16 | unsigned char ctddark10[] = {0x04, 0x1B, 'Y', 'H', 10}; |
17 | unsigned char ctddark20[] = {0x04, 0x1B, 'Y', 'H', 20}; |
18 | unsigned char ctddark30[] = {0x04, 0x1B, 'Y', 'H', 30}; |
19 | unsigned char ctddark40[] = {0x04, 0x1B, 'Y', 'H', 40}; |
20 | unsigned char ctddark50[] = {0x04, 0x1B, 'Y', 'H', 50}; |
21 | unsigned char ctddark60[] = {0x04, 0x1B, 'Y', 'H', 60}; |
22 | unsigned char ctddark70[] = {0x04, 0x1B, 'Y', 'H', 70}; |
23 | unsigned char ctddark80[] = {0x04, 0x1B, 'Y', 'H', 80}; |
24 | unsigned char ctddark90[] = {0x04, 0x1B, 'Y', 'H', 90}; |
25 | unsigned char ctddark100[] = {0x04, 0x1B, 'Y', 'H', 100}; //100% |
26 | |
27 | |
28 | |
29 | unsigned char ctdcursoroff[] = {0x04, 0x1B, 'T', 'C', 0}; //cursor off ESC T C 0 |
30 | // disable touch:
|
31 | unsigned char ctdDisableTouch[] = {0x05, 0x1B, 'A', 'L', 0, 1}; |
32 | |
33 | |
34 | unsigned char ctdfont1[] = {0x04, 0x1b, 'Z','F',1}; //ESC Z F n1 Font 1: 4x6 monospaced |
35 | unsigned char ctdfont2[] = {0x04, 0x1b, 'Z','F',2}; //ESC Z F n1 Font 2: 6x8 monospaced |
36 | unsigned char ctdfont3[] = {0x04, 0x1b, 'Z','F',3}; //ESC Z F n1 Font 3: 7x12 monospaced |
37 | unsigned char ctdfont4[] = {0x04, 0x1b, 'Z','F',4}; //ESC Z F n1 Font 4: GENEVA10 proportional |
38 | unsigned char ctdfont5[] = {0x04, 0x1b, 'Z','F',5}; //ESC Z F n1 Font 5: CHICAGO14 proportional |
39 | unsigned char ctdfont6[] = {0x04, 0x1b, 'Z','F',6}; //ESC Z F n1 Font 6: Swiss30 Bold proportional |
40 | unsigned char ctdfont7[] = {0x04, 0x1b, 'Z','F',7}; //ESC Z F n1 Font 7: grosse Ziffern BigZif57 |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | /************************************************************************/
|
55 | /* */
|
56 | /************************************************************************/
|
57 | unsigned char sendCommandToTouch (unsigned char i2cDestination , unsigned char* commandToDisplay) { |
58 | |
59 | unsigned char retvalue; |
60 | |
61 | i2c_start_wait(i2cDestination); |
62 | SendCommand(commandToDisplay); |
63 | i2c_start_wait(i2cDestination + 1); |
64 | retvalue = i2c_readAck(); |
65 | i2c_stop(); |
66 | |
67 | return retvalue; |
68 | |
69 | }
|
70 | |
71 | |
72 | |
73 | /************************************************************************/
|
74 | /* */
|
75 | /************************************************************************/
|
76 | void SendCommand(unsigned char buf[]) |
77 | { unsigned char i, len, bcc; |
78 | len = buf[0]; |
79 | i2c_write(0x11); // Send DC1 |
80 | bcc = 0x11; |
81 | i2c_write(len); // Send data length |
82 | bcc = bcc + len; |
83 | for(i = 1; i < len + 1 ; i++) // Send buf |
84 | {
|
85 | i2c_write(buf[i]); |
86 | bcc = bcc + buf[i]; |
87 | };
|
88 | i2c_write(bcc); // Send checksum |
89 | }
|
90 | |
91 | |
92 | |
93 | |
94 | |
95 | /************************************************************************
|
96 | *
|
97 | * SendAsciiInFont (xpos, ypos, string)
|
98 | *
|
99 | ************************************************************************/
|
100 | void SendAsciiInFont(unsigned char i2cDestination, uint8_t x, uint8_t y, char *buf) |
101 | {
|
102 | // example:
|
103 | // unsigned char ctdchars[] = {13, 0x1b, 'Z','L',1,1,'D','i','s','p','l','a','y', 0x10 }; //
|
104 | |
105 | unsigned char i, j, bcc, test; |
106 | j = strlen(buf) + 6 ; // 6 = esc + Z + L + xpos + ypos + NUL |
107 | |
108 | i2c_start_wait(i2cDestination + 0); //write a bunch of asciis |
109 | |
110 | //1.
|
111 | test = i2c_write(0x11); // send starter DC1 |
112 | bcc = 0x11; |
113 | |
114 | //2.
|
115 | test += i2c_write(j); // send data length |
116 | bcc += j; |
117 | |
118 | //3.
|
119 | test += i2c_write(0x1b); // send esc |
120 | bcc += 0x1b; |
121 | |
122 | //4.
|
123 | test += i2c_write('Z'); // send 'Z' |
124 | bcc += 'Z'; |
125 | |
126 | //5.
|
127 | test += i2c_write('L'); // send 'L' |
128 | bcc += 'L'; |
129 | |
130 | //6.
|
131 | test += i2c_write(x); // send xpos |
132 | bcc += x; |
133 | |
134 | //7.
|
135 | test += i2c_write(y); // send ypos |
136 | bcc += y; |
137 | |
138 | //8.
|
139 | for(i = 0; i < strlen(buf); i++) {// send buf |
140 | test += i2c_write(buf[i]); |
141 | bcc = bcc + buf[i]; |
142 | };
|
143 | |
144 | //9.
|
145 | test += i2c_write(0x00); // send NUL for sequence end |
146 | bcc += 0x0; |
147 | |
148 | test += i2c_write(bcc); // send checksum |
149 | |
150 | i2c_start_wait(i2cDestination + 1); |
151 | i2c_readAck(); |
152 | i2c_stop(); |
153 | |
154 | }
|
155 | |
156 | |
157 | |
158 | |
159 | |
160 | /************************************************************************
|
161 | *
|
162 | * fetch Data from eDip Touch
|
163 | *
|
164 | ************************************************************************/
|
165 | unsigned char fetchdata (unsigned char i2cDestination, unsigned char *ubuf) { //buf = requestInfo2 |
166 | unsigned char test = 0,dc2 ,len ,sendbuf ,recbuf ,bcc; |
167 | |
168 | i2c_start_wait(i2cDestination + 0); |
169 | SendcommandDC2(ubuf); |
170 | |
171 | i2c_start_wait(i2cDestination + 1); |
172 | test = i2c_readAck(); // 06 |
173 | dc2 = i2c_readAck(); // 12 |
174 | len = i2c_readAck(); // 02 |
175 | sendbuf= i2c_readAck(); // 00 |
176 | recbuf = i2c_readAck(); // FA |
177 | bcc = i2c_readNak(); // 0E |
178 | i2c_stop(); |
179 | |
180 | |
181 | return 0; //... useless |
182 | }
|
183 | |
184 | |
185 | |
186 | /************************************************************************
|
187 | * send DC2
|
188 |
|
189 | unsigned char dc2ReqSendBuf[] = {1, 'S'}; //sequence flush buffer
|
190 | unsigned char dc2ReqBufInfo[] = {1, 'I'}; //sequence
|
191 | unsigned char dc2ProtocolSettings[] = {3, 'D', 64, 200 }; //sequence
|
192 | unsigned char dc2ReqProtocolInfo[] = {1, 'P'}; //sequence
|
193 | unsigned char dc2RepLastPackage[] = { 1, 'R'}; //sequence
|
194 | unsigned char dc2ReqRS485Addr[] = {3, 'A', 'S',42}; //'S' = select, 'D' = desel., 42 = Addr
|
195 |
|
196 | ************************************************************************/
|
197 | void SendcommandDC2(unsigned char buf[]) |
198 | { unsigned char i, len, bcc; |
199 | |
200 | i2c_write(0x12); // Send DC2 |
201 | bcc = 0x12; |
202 | |
203 | len = buf[0]; |
204 | i2c_write(len); // Send data length |
205 | bcc += len; |
206 | |
207 | for(i = 1; i < len + 1 ; i++) // Send buf |
208 | {
|
209 | i2c_write(buf[i]); |
210 | bcc += buf[i]; |
211 | };
|
212 | |
213 | i2c_write(bcc); // Send checksum |
214 | }
|
215 | |
216 | |
217 | /*******************************************************************
|
218 | *
|
219 | * initLcdImage & encoder startup
|
220 | *
|
221 | ********************************************************************/
|
222 | void initLcdImage(unsigned char i2cDestination) { |
223 | PORTC |= (1 << reset); // preset LCD reset |
224 | DDRC |= (1 << DDC2); // reset |
225 | |
226 | PORTC &= ~(1 << I2CMode); // preset I2C mode |
227 | DDRC |= (1 << DDC3); // /I2C mode |
228 | |
229 | //PCINT7
|
230 | //Hardware: external LCD with built-in pullup, pulled low by open-drain.
|
231 | //if falling edge on PCint7 -> IRQ
|
232 | |
233 | // PCIFR – Pin Change Interrupt Flag Register
|
234 | |
235 | // PCMSK0 – Pin Change Mask Register 0
|
236 | PCMSK0 |= 0b10000000; |
237 | |
238 | //PCI0 Interrupt vector
|
239 | // PCICR – Pin Change Interrupt Control Register
|
240 | PCICR |=0b00000001; // Bit0: PCINT 0..7 |
241 | |
242 | |
243 | //init
|
244 | flagFetchData = 0; |
245 | |
246 | //LCD data transfer starts here
|
247 | i2c_init(); |
248 | sendCommandToTouch(i2cDestination, ctddark10); |
249 | sendCommandToTouch(i2cDestination, ctdDisableTouch); |
250 | sendCommandToTouch(i2cDestination, ctdcursoroff); |
251 | |
252 | |
253 | if (i2cDestination == Touch128x64 ) sendCommandToTouch(i2cDestination, ctdcontrast); |
254 | else if (i2cDestination == Touch160x104 ) sendCommandToTouch(i2cDestination, ctdcontrast160x104Blue); |
255 | // else if (i2cDestination == Touch160x104 ) sendCommandToTouch(i2cDestination, ctdcontrast);
|
256 | |
257 | |
258 | |
259 | sendCommandToTouch(i2cDestination, ctdDefineBargraph1); |
260 | sendCommandToTouch(i2cDestination, ctdDefineBargraph2); |
261 | sendCommandToTouch(i2cDestination, ctdDefineBargraph3); |
262 | |
263 | }
|
Und main:
1 | /*
|
2 | * Start LCD_1.c
|
3 | *
|
4 | * Created: 01.12.2012 00:50:20
|
5 | * Author: Joachim
|
6 | */
|
7 | |
8 | |
9 | //JTAG Fuse DISABLE !
|
10 | |
11 | #define F_CPU 16000000
|
12 | #include <avr/io.h> |
13 | #include <util/delay.h> |
14 | #include <avr/interrupt.h> |
15 | #include <avr/sleep.h> |
16 | #include <stdio.h> |
17 | #include <string.h> |
18 | #include "i2cmaster.h" |
19 | #include "gendefs.h" |
20 | |
21 | // command to display: ctd
|
22 | extern unsigned char ctddark[] ; |
23 | extern unsigned char ctddark10[]; |
24 | extern unsigned char ctddark20[]; |
25 | extern unsigned char ctddark30[]; |
26 | extern unsigned char ctddark40[]; |
27 | extern unsigned char ctddark50[]; |
28 | extern unsigned char ctddark60[]; |
29 | extern unsigned char ctddark70[]; |
30 | extern unsigned char ctddark80[]; |
31 | extern unsigned char ctddark90[]; |
32 | extern unsigned char ctddark100[]; //100% |
33 | |
34 | extern unsigned char ctdcursoroff[]; |
35 | |
36 | // disable touch:
|
37 | extern unsigned char ctdDisableTouch[]; |
38 | |
39 | extern unsigned char ctdfont1[]; //ESC Z F n1 Font 1: 4x6 monospaced |
40 | extern unsigned char ctdfont2[]; //ESC Z F n1 Font 2: 6x8 monospaced |
41 | extern unsigned char ctdfont3[]; //ESC Z F n1 Font 3: 7x12 monospaced |
42 | extern unsigned char ctdfont4[]; //ESC Z F n1 Font 4: GENEVA10 proportional |
43 | extern unsigned char ctdfont5[]; //ESC Z F n1 Font 5: CHICAGO14 proportional |
44 | extern unsigned char ctdfont6[]; //ESC Z F n1 Font 6: Swiss30 Bold proportional |
45 | extern unsigned char ctdfont7[]; //ESC Z F n1 Font 7: grosse Ziffern BigZif57 |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | //PC0 + PC1: ATMEGA 1284P
|
53 | #define ATMEGA_328P
|
54 | |
55 | int main(void) |
56 | {
|
57 | //init
|
58 | // ext pull up!!
|
59 | //LCD Touch reset
|
60 | |
61 | char buf1[25]; |
62 | DDRC = 0b00000000; |
63 | |
64 | #ifdef ATMEGA_328P
|
65 | //
|
66 | #endif
|
67 | |
68 | |
69 | |
70 | DDRC |= (1 << DDC5); // extended LED upper |
71 | DDRD |= (1 << DDD4); // LED middle |
72 | DDRD |= (1 << DDD5); // LED lower |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | //--------------------------------------------------------------------------------------------------------------
|
79 | //this is where the fun begins
|
80 | |
81 | //LCD starts here
|
82 | PORTD = 0; //LEDs off |
83 | |
84 | i2c_init(); |
85 | sendCommandToTouch(Touch160x104,ctddark30); |
86 | sendCommandToTouch(Touch160x104,ctdcursoroff); |
87 | sendCommandToTouch(Touch160x104,ctdfont2); |
88 | |
89 | int8_t input1; |
90 | input1 = 0; |
91 | |
92 | sprintf( buf1, "Hello, World."); |
93 | SendAsciiInFont(Touch160x104, 0, FONTHEIGHT * 2, buf1); |
94 | |
95 | while(1); |
96 | } //main |
Danke! Werde ich ausprobieren! Ich habe gelesen, dass das Display beim ersten Einschalten in den Terminal-Mode geht und ein Cursor oben links in der Ecke blinken soll. Das hat das Display bei mir noch nie gemacht. Ist das Display vielleicht schlichtweg defekt?
Uups. Auch wenn so aussieht: Der Code ist nicht komplett, ich weiß nicht ob das Hello World auf Anhieb geht. Alles Relevante zum Selberfickeln steht aber drin. >Ich habe gelesen, dass das Display beim ersten Einschalten in den >Terminal-Mode geht und ein Cursor oben links in der Ecke blinken soll. Nee, das ist nicht defekt, das kommt auf den Modus an. Bei mir war glaub ich das Verhalten von 128x64 und 160x104 auch seltsam, hat sich dann aber alles logisch erklären lassen (Ich hatte anfangs ebenfalls ziemliche Schwierigkeiten).
>Ich habe gelesen, dass das Display beim ersten Einschalten in den >Terminal-Mode geht und ein Cursor oben links in der Ecke blinken soll. Mein Display macht das. Da blinkt oben links ein Cursor. Hat dein Display überhaupt ausreichend Kontrast? Hast du irgendwas am Kontrastpin angeschlossen? Wenn ja lass den mal offen.
Welches ist der Kontrast-Pin? Davon steht im Datenblatt nichts. Ich habe es so angeschlossen wie im Datenblatt im Abschnitt I²C. VADJ und VOUT sind "offen".
Gibt keinen Kontrast-Pin. Ist kein 44780. Kontrast passt default-mässig. Einzig EN485/I2CMode muß beim Power-On auf gnd liegen.
Ja, I2CMODE liegt auf GND. Das Ding geht jetzt zurück und wir besorgen eins mit Evaluationskit. Danke für eure Hilfe!
1 | Das Display benötigt eine bestimmte Zeit um |
2 | die Daten bereit zu stellen; deshalb muss vor |
3 | jedem zu lesenden Byte mindestens 6μs |
4 | gewartet werden (keine Aktivität auf der SCL |
5 | Leitung). |
1 | Alle Displays in blau-weiß (B) und schwarz-weiß (J) sind mit einer modernen |
2 | und stromsparenden LEDBeleuchung ausgestattet. Während das Schwarz-Weiß- |
3 | Display und das amber-farbige auch mit komplett abgeschalteter Beleuchtung |
4 | noch lesbar ist, benötigt das blau-weiße Display dagegen zum Ablesen in |
5 | jedem Fall eine minimale Beleuchtung. |
>Das Ding geht jetzt zurück und wir besorgen eins mit Evaluationskit. >Danke für eure Hilfe! Ach Schnickschnack. Das Ding funktioniert. Ich sehe gerade, daß deine Widerstände an dem Mäuseklavier aber keine Pull-up sind sondern Masse nur ganz schwach durchlassen. Die müssen quasi gegen die eingebauten Pull-ups im Display ziehen. Wenns dumm läuft liegst du dann im Tri-State bei 2V. Leg die Widerstände an Vcc und schalte gnd mit dem Klavier, dann liegt der Pegel auch zuverlässig an.
>Das Display benötigt eine bestimmte Zeit um >die Daten bereit zu stellen; deshalb muss vor >jedem zu lesenden Byte mindestens 6μs >gewartet werden (keine Aktivität auf der SCL >Leitung). Hihi. Ja, das stimmt. Ich hatte meinen Code 1:1 auf den Due (Cortex M3) übersetzt und hab mich gewundert was los ist. Zu schnell gewesen, das Biest...
Joachim ... schrieb: > Ich sehe gerade, daß deine Widerstände an dem Mäuseklavier aber keine > Pull-up sind sondern Masse nur ganz schwach durchlassen. Die müssen > quasi gegen die eingebauten Pull-ups im Display ziehen. Wenns dumm läuft > liegst du dann im Tri-State bei 2V. > Leg die Widerstände an Vcc und schalte gnd mit dem Klavier, dann liegt > der Pegel auch zuverlässig an. Oder wie es im Datenblatt heißt
1 | Die Pins BA0..2, SA0..2, DPOM, DPROT und TEST/SBUF haben einen |
2 | internen Pull-Up, deshalb ist nur der LO-Pegel (L=0=GND) aktiv anzulegen. |
3 | Für Hi-Pegel (H=1) sind diese Pins offen zu 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.