eDIP128 - mal geht es mal nicht

OP #4588595
Lesenswert?
• ▲
▼
Hallo
ich verwende das genannte Display an einem I2C Bus. Bin dabei die 
verschiedenen Darstekllungen auszuprobieren bzw. anzuwenden. Dazu 
verwende ich z.B. die folgenden Codes in C:
1
void Test_schreiben1(int8_t x1, int8_t y1, int8_t x2, int8_t y2)
2
  {
3
  int8_t bcc;
4
  bcc = 0x11 + 0x07 + 0x1b + 'G' + 'D' + x1 + y1 + x2 + y2;
5
  bcc = bcc % 0x100;
6
  i2c_start(slave_adresse_1);
7
  i2c_write(0x11);      // DC1 0x11
8
  i2c_write(0x07);    //07 Strich
9
  i2c_write(0x1b);      // ESC   0x1b
10
  i2c_write('G');    // G
11
  i2c_write('D');    // D
12
  i2c_write(x1);
13
  i2c_write(y1);
14
  i2c_write(x2);
15
  i2c_write(y2);
16
  i2c_write(bcc);
17
  i2c_stop();
18
  }
19

20
void Graphik_Rechteck(int8_t a1, int8_t b1, int8_t a2, int8_t b2)
21
  {
22
  int8_t bcc;
23
  bcc = 0x11 + 0x07 + 0x1b + 'G' + 'R' + a1 + b1 + a2 + b2;
24
  bcc = bcc % 0x100;
25
  i2c_start(slave_adresse_1);
26
  i2c_write(0x11);      // DC1 0x11
27
  i2c_write(0x07);    //07 Strich
28
  i2c_write(0x1b);      // ESC   0x1b
29
  i2c_write('G');    // G
30
  i2c_write('R');    // R
31
  i2c_write(a1);
32
  i2c_write(b1);
33
  i2c_write(a2);
34
  i2c_write(b2);
35
  i2c_write(bcc);
36
  i2c_stop();
37
  }
Mal geht der Code und mal nicht. Nach Datenblatt können auch 
verschiedene Figuren gleichzeitig geschrieben werden. Das klappt aber 
garnicht. Die überprüfung mit ACK habe ich nicht drin. Wo liegt der 
Fehler?
achim
OP #4588608
Lesenswert?
• ▲
▼
Auszug aus dem Datenblatt des Herstellers:

2. Binär-Modus
- Das Escape-Zeichen entspricht dem Zeichen ESC (hex: $1B, dez: 27).
- Die Befehlsbuchstaben werden direkt gesendet.
- Die Koodinaten x und y und alle anderen Parameter werden als 8-Bit 
Binärwert (1 Byte) gesendet.
- Zeichenketten (Texte) werden mit CR (hex: $0D), LF (hex: $0A) oder NUL 
(hex: $00) abgeschlossen.
Im Binär-Modus dürfen keine Trennzeichen z.B. Leerzeichen oder Kommas 
verwendet werden.
Die Befehle benötigen kein Abschlussbyte wie z.B Carriage Return (außer 
Zeichenkette: $00).

Teilweise sollen noch zusätzliche Daten übermittelt werden
OP #4589761
Lesenswert?
• ▲
▼
Habe es getestet. Gebe ich das Rechteck aus und lese danach ACK ein 
bekomme ich die Anzeige 6. Probe dazu, habe einen Wert geändert bekomme 
ich kein Rechteck mehr angezeigt und bekomme 21 (???) angezeigt.
Das zweite Teil des Programme wird vollkommen ignoriert und bekomme 
keine Gerade angezeigt.
Leider versteh ich es nicht.
achim
Gast #4589783
Lesenswert?
• ▲
▼
Aus dem Datenblatt:

Das EA eDIP128-6 quittiert dieses Paket
mit dem Zeichen <ACK> (=$06) bei erfolgreichem Empfang oder <NAK> (=$15 
= 21dez!) bei fehlerhafter Prüfsumme
oder Empfangspufferüberlauf. In jedem Fall wird bei <NAK> das komplette 
Paket verworfen und muss erneut
gesendet werden.
Ein <ACK> bestätigt lediglich die korrekte Übertragung. Ein Syntax-Check 
erfolgt nicht.

Hinweis: <ACK> muss eingelesen werden.

Ende Datenblatt.

Und mach mal aus den ganzen int8_t ein uint8_t.
Diese Zeile
  bcc = bcc % 0x100;
löschen.
OP #4589793
Lesenswert?
• ▲
▼
Habe ich gemacht. Im Grunde hat sich nichts geändert. Es geht jetz nur 
schneller, wenn ich andere Werte für das Rechteck eingebe. Eine Gerade 
wird trotzdem nicht gezeichnet. Auch die Checksumme des zweiten Aufrufes 
wird nicht angezeigt. Etwas hat sich noch drastisch geändert. Bisher 
blinkte der Cursor gemütlich oben links, jetz flackert er sehr schnell.

Ist unwahrscheinlich, das ein Fehler in einem Teil steckt. Habe das 
Peogramm auf das aller nötigste reduziert. Zur Kontrolle und Anzeige der 
korrekten Adresse und ACK verwende ich noch ein zweites Display. Dort 
geht alles

achim
OP #4589802
Lesenswert?
• ▲
▼
Mir ist da was aufgefallen.
1
void Graphik_Rechteck(int8_t a1, int8_t b1, int8_t x2, int8_t y2)
2
  {
3
  uint8_t bcc;
4
  bcc = 0x11 + 0x07 + 0x1b + 'G' + 'R' + a1 + b1 + x2 + y2;
5
  //bcc = 0x07 + 0x1b + 'G' + 'R' + a1 + b1 + x2 + y2;
6
  //bcc = bcc % 256;   //0x100
7
  i2c_start(slave_adresse_1);
8
  i2c_write(0x11);      // DC1 0x11
9
  i2c_write(0x07);    //07 Strich
10
  i2c_write(0x1b);      // ESC   0x1b
11
  i2c_write('G');    // G
12
  i2c_write('R');    // R
13
  i2c_write(a1);
14
  i2c_write(b1);
15
  i2c_write(x2);
16
  i2c_write(y2);
17
  i2c_write(bcc);
18
  //i2c_stop();    ----->  mit diesem Stop läuft es nicht ????
19
  i2c_start(slave_adresse_2);
20
  e = i2c_readNak();
21
  i2c_stop();
Mit dem ersten Stop (auskommentiert) geht es nicht.
OP #4590205
Lesenswert?
• ▲
▼
Habe es noch mal mit ACK getestet. Bekomme jetzt von beiden Teieln des 
Programmes "6" zurück und es werden beide Graphiken korrekt angezeigt. 
Das ganze reagiert etwas komisch auf delay. Die Pause dazwischen, wie 
vom Hersteller vorgegeben, könnte auch was beeinflussen.
Wie ist eure Erfahrung mit der Zeit? Teilweise kommt es mir verzögert 
oder langsam vor.
achim

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