EA eDIP 240 I²C liefert nur letztes Byte

Gast #3268499
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
Angehängte Dateien:
Gast #3268929
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();
Gast #3269397
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
#3269517
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
Gast #3269546
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?
#3269571
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).
Gast #3269700
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.
#3269756
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.
#3269757
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.
#3269770
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...
#3269777
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren