eDIP128 - mal geht es mal nicht

OP #4588595
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
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
Nach Angabe des Herstellers sind bis zu 100kHz bei Pausen von 6uS 
zulässig. Gebe vorsichtshalber ca 50 oder 100 mS.
An ACK habe ich auch gedacht. Wie weit ist den der Einfluss von ACK 
dabei?
Werde es heute auf jeden Fall mit ACK testen.
achim
OP
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.