Forum: Mikrocontroller und Digitale Elektronik eDIP128 - mal geht es mal nicht


von Achim S. (achims)


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

von Achim S. (achims)


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

von Achim S. (achims)


Lesenswert?

Keiner eine Idee dazu?

von holger (Gast)


Lesenswert?

>Keiner eine Idee dazu?

I2C zu schnell?

>Die überprüfung mit ACK habe ich nicht drin.

Warum nicht? Gerade das wäre jetzt interessant.

von Achim S. (achims)


Lesenswert?

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

von Achim S. (achims)


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

von Mark B. (markbrandis)


Lesenswert?

Achim S. schrieb:
> Mal geht der Code und mal nicht.

...ist keine besonders aussagekräftige Fehlerbeschreibung.

Der Fehler kann auch gut und gerne in einem Teil des Codes liegen, den 
Du uns hier nicht zeigst.

von holger (Gast)


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.

von Achim S. (achims)


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

von Achim S. (achims)


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.

von Achim S. (achims)


Lesenswert?

Bekomme bei der "Geraden" den ACK von 61 zurück

von Achim S. (achims)


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

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.