Forum: Mikrocontroller und Digitale Elektronik EA eDIP 240 I²C liefert nur letztes Byte


von Christian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sebastian H. (technik_freak)


Lesenswert?

Hallo,

Hast Du vor dem Senden, den Empfangspuffer leergemacht?

von holger (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

Ach verdammt... die "Richtung" vergessen!
Ich werde das morgen gleich ausprobieren.
Danke soweit!

von Christian (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

Wenn ich jetzt readAck durch readNak ersetze, dann liefert mir das 
Display 0x06. Aber darstellen tut das Display trotzdem nix...

von Sebastian H. (technik_freak)


Lesenswert?

Christian schrieb:
> Zum Thema Empfangspuffer leeren konnte ich im Datenblatt
> nichts finden.

Seite 8, unter deinem Beispiel ("Inhalt des Sendepuffers anfordern").

von Joachim .. (joachim_01)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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?

von Joachim .. (joachim_01)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

Okay danke, ich werds ausprobieren!

von dummy (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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

von Joachim .. (joachim_01)


Lesenswert?

Gibt keinen Kontrast-Pin. Ist kein 44780. Kontrast passt default-mässig.
Einzig EN485/I2CMode muß beim Power-On auf gnd liegen.

von Christian (Gast)


Lesenswert?

Ja, I2CMODE liegt auf GND.

Das Ding geht jetzt zurück und wir besorgen eins mit Evaluationskit.

Danke für eure Hilfe!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Joachim .. (joachim_01)


Lesenswert?

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

von Joachim .. (joachim_01)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.