Forum: Mikrocontroller und Digitale Elektronik Problem mit ATMega644 und TFT-Display (EA eDIPTFT43-A) über I2C


von Pal .. (pal)


Angehängte Dateien:

Lesenswert?

Hi,
ich habe beim Empfangen von Nachrichten über I2C so meine Probleme.

Und zwar habe ich einen ATMega644 und das TFT-Display "eDIPTFT43-A" von 
ELECTRONIC ASSEMBLY über I2C verbunden. Für die I2C Kommunikation habe 
ich die Bibliothek von Peter Fleury verwendet. Der Controller steckt im 
stk500 Board und zum programmieren nutze ich AVR Studio 4.

Bei drücken eines Touchbuttons am Display wird in den Sendepuffer (vom 
Display) eine Nachricht abgelegt (LED für Nachricht im Sendepuffer 
leuchtet nun). Diese Nachricht will ich jetzt abholen. Dazu steht in der 
Doku des Displays, dass zunächst der Befehl  "DC2   1   S   bcc" (d.h. 
DC2=?   1=Länge   S=Sendepuffer anfordern   bcc=Checksum) gesendet 
werden muss. Das Display bestätigt den Empfang des Befehls mit einen ACK 
und beginnt die gesammelten Daten zu senden. Die Nachricht, die vom 
Display gesendet wird ist dann folgendermaßen aufgebaut "DC1   len 
data   bcc". So die Theorie... leider funktioniert das bei mir nicht...

Sobald ich Daten im Sendepuffer habe erhalte ich keine Bestätigung bzw. 
keine Daten gesendet.

Man kann erkennen, dass der Befehl "DC2   1   S   bcc" gesendet wird, 
weil kurz nach dem Senden die LED des Sendepuffers nicht mehr leuchtet. 
Ich hab das Gefühl, dass das Display alles richtig macht und den 
Sendepuffer entleert - ich allerdings die Nachrichten nicht empfangen 
kann.

Kann mir jemand weiterhelfen?

Welche Einstellungen muss ich machen bzw. wie muss ich die Fuses setzen? 
Welche Einstellungen muss ich im makefile, makefile.twimaster, 
makefile.i2cmaster, twimaster.c und i2cmaster.S machen?

Wenn ich die Doku vom Display richtig verstanden habe, werden die 
Pull-Up Widerstände (10k) für die I2C Verbindung durch das 
Entwicklerboard des Displays gesetzt.

Im Anhang befindet sich Bilder von den Einstellungen und den Fuses. Mein 
Progr habe ich unten gepostet.

Ich hoffe mir kann jemand weiterhelfen.

Vielen Dank für eure Hilfe!


Programm:
1
#include <util/delay.h>
2
#include <i2c/i2cmaster.h>
3
4
5
struct PufferData {
6
  unsigned char dc;
7
  unsigned char len;
8
  unsigned char data;
9
  unsigned char bcc;
10
};
11
12
13
#define DISPLAY_WRITE  0xDE      // Display-Adresse zum Schreiben
14
#define DISPLAY_READ  0xDF      // Display-Adresse zum Lesen
15
16
#define NULL      0x00      // NULL
17
#define ACK        0x06
18
#define DC2        0x12      // 18(dez) Bezeichung für DC2
19
#define S        0x53
20
21
22
23
24
unsigned char leseDaten() {
25
  char dataS[] = {S};
26
  unsigned char bccS, lenS = 1;
27
  unsigned char ackE = 0;
28
  struct PufferData dataE;
29
30
  i2c_init();
31
32
  // Initialisiere Struktur
33
  dataE.dc = NULL;
34
  dataE.len = NULL;
35
  dataE.data = NULL;
36
  dataE.bcc = NULL;
37
38
  // Prüfsumme berechnen
39
  bccS  = DC2 + lenS + dataS[0];
40
41
  // Daten senden (d.h. sind Nutzdaten vorhanden?)
42
  i2c_start_wait(DISPLAY_WRITE+I2C_WRITE);            // setze Adresse vom Display und Schreib-Modus
43
  i2c_write(DC2);                          // sende DC2
44
  i2c_write(lenS);                        // sende Datenlänge
45
  i2c_write(dataS[0]);                      // sende Nutzdaten
46
  i2c_write(bccS);                        // sende Prüf-Summe
47
48
49
  // Quittierung vom Display holen (lesen)
50
  i2c_rep_start(DISPLAY_WRITE+I2C_READ);              // setze Adresse vom Display und Lese-Modus
51
52
  _delay_us(100);
53
  ackE = i2c_readAck();                      // Quittierung erfolgreich
54
55
56
  if(ackE == ACK) {                        // Alles ok - Informationen lesen    
57
      
58
    dataE.dc = i2c_readAck();                  // DC2 aus Empfangspuffer bekommen
59
    dataE.len = i2c_readAck();                  // Länge aus Empfangspuffer bekommen
60
    dataE.data = i2c_readAck();                  // Anzahl abholbarer Bytes aus Empfangspuffer bekommen
61
    dataE.bcc = i2c_readAck();                  // Prüfsumme aus Empfangspuffer bekommen
62
  }
63
64
  i2c_stop();
65
66
  return 1;
67
}

von Pal .. (pal)


Lesenswert?

Niemand eine Idee?

von spess53 (Gast)


Lesenswert?

Hi

>  if(ackE == ACK) {
>    dataE.dc = i2c_readAck();
>    dataE.len = i2c_readAck();
>    dataE.data = i2c_readAck();
>    dataE.bcc = i2c_readAck();  <<<<<<<<<<<<<<<<<<<
>  }
>  i2c_stop();

An diese Stelle sollte ein READ_NACK.

MfG Spess

von Pal .. (pal)


Lesenswert?

Hallo Spess,

danke für deine Antwort. Ich hab den Programmteil so ergänzt, aber es 
hat leider kein Ergebnis gebacht.
1
  if(ackE == ACK) {                     
2
    dataE.dc = i2c_readAck();  
3
    dataE.len = i2c_readAck();
4
    dataE.data = i2c_readAck();
5
    dataE.bcc = i2c_readNak();
6
  }

Ich steh momentan echt voll auf dem Schlauch und weiß nicht mehr wo ich 
nach suchen soll.

von Pal .. (pal)


Lesenswert?

Hat jemand noch eine Idee?

von Toni (Gast)


Lesenswert?

Hallo Pal,

kamst du mit deinem Quellcode weiter? Wir haben genau das selbe Touch 
Panel und möchten über I²C den ATmega8 und ATmega32 steuern. Falls du 
weiter kamst, bitte um Rückmeldung... Wir sind momentan auch dran an 
verzeifeln...

von Pal .. (pal)


Angehängte Dateien:

Lesenswert?

Hallo Toni,

ja ich bin weiter gekommen. Kämpfe zwar zur Zeit mit anderen Problemen 
aber das Senden und Empfangen funktioniert. Habt ihr an die Widerstände 
in den SDA und SCL Leitungen gedacht?

Mit dem Quellcode aus dem Anhang sollte es funktionieren.

von Toni (Gast)


Lesenswert?

Hallo Pal,

erstmal vielen Dank für die rasche Antwort, dass freut mich!
Ja wir haben an beiden Leitungen je ein 10kOhm Widerstand.
Also mit den Programm klappt es bei uns leider noch nicht. Kannst du das 
main Programm uns zukommen lassen, dass an Port D eine Ausgabe an den 
LED´s erfolgen kann.

Bin leider in den Sachen noch ein Anfänger. Also SBUF leuchtet auf und 
ich hab über das Small Protokoll geprüft, dass die gesendeten 5 dez die 
ich über den Befehl #SB 5 über ein Macro schicke auch beim Small 
Protocoll beim LCD Terminal angezeigt werden.

Ich hab noch folgenden Fragen:

1. Hast du die kleinen Adapterpltine für I2C auf dem Evaluation-Board 
werden des Austausch der Daten gesteckt? Falls ja, auf welcher Position 
stehen die DIP-Schalter?

2. Wohin werden die abgholten Daten auf dem Mikrokontroller geschickt 
und wie kommen die rüber? Muss man die notwendigen relevanten Byten raus 
fischen?

Mit welchen weiteren Problemen bist du den am kämpfen?



Gruß

Toni

von Pal .. (pal)


Angehängte Dateien:

Lesenswert?

Meine Probleme haben z.Z. nichts mit dem Display zu tun :-) Kämpfe in 
Sachen Controller, der jetzt zu klein geworden ist. Habe zuerst den 
ATmega16 verwendet und steige jetzt auf den ATmega644 um.

Hast du in deinem C-Programm die Bib von Peter Fleury für die I2C 
Kommunikation eingebunden?

Sendest du am Display auch einen Befehl?
z.B.
1
# SB5

>1.
Ja, die Platine ist aufgesteckt (siehe Bild). Die Schalter stehen alle 
nach unten.

>2.
Du benötigst natürlich zwei Busleitungen von Board zum Controller (siehe 
Bild). Sobald du auf dem Display den "# SB5" absendest empfängt die 
Leseroutine die Zahl "5"

Die main.c ist nicht getestet. Habe dir nur die wesentlichen Teile von 
mir reinkopiert.

von Toni (Gast)


Lesenswert?

Hallo Pal,

erst mal vielen Dank für die Hilfe und sorry für die lange Funkstille.

Ja wir haben die Bibl. von Peter eingebunden. Unser I2C läuft auch nun 
stabil und sicher zwischen ediptft43a und ATmega8 oder ATmega32. Wir 
haben den ATmega als Master und das Touch Panel als Slave.

Ja wir senden Bytes. Wir können auch die Werte vom Bargraph über Arrays 
auswerten udn verarbeiten. Wir stoßen auch momentan an die Kapazitäten 
der PINS.

Wir haben vor das der ATmega32 Master ist und das Touch Panel und 
ATmega8 die Slaves sind. Zwischen ATmega32 und Touch Panel klappt es 
wunderbar. Aber die TWI Verbindung passt noch nicht. Eigentlich gibt es 
hier im Forum schon bereits fertige Programme. Leider kriegen wir die so 
nciht compaliert.

Hast du Probiert über den i2c drei Komponenten zu betreiben oder hast du 
es bis jetzt nur mit zwei versucht?

Wir haben uns die Tage Bus Pirate v3.6 geholt. Das ist eine Platine mit 
der man den i2c Schniffen kan. Also sowas wie ein Logic Analyzer für 
günstiges Geld. Bin gespannt ob es klappt.

Mussten dein Main nur etwas anpassen und dann lief es für unsere 
Bedürfnisse auch. Danke nochmal ;-)

Gruß

Toni

von Pal .. (pal)


Lesenswert?

Hi Toni,

kein Problem! Freut mich das es nun funkt.

Ich hab nur den Controller und das Display. Mehr benötige ich nicht.

Aber haltet mich doch bitte mal auf dem Laufenden. Würde mich 
interessieren wie es mit mehreren Komponenten funkt.

mfg

von freakLuky (Gast)


Lesenswert?

Hallo Toni,

ich habe ebenfalls einen ATMega (16) in Verwendung und würde gerne mit 
dem Display kommunizieren.
Im Datenblatt habe ich gelesen, dass ich dem Display sagen muss, wann es 
mir die Daten geben soll. (Mit DC2 1 S bcc)
Leider funktioniert meine Routine nicht so wie gewünscht.
Ich wäre sehr froh, wenn ich meinen Code mit deinem vergleichen könnte.
Würdest mir deine Empangs - Methode zur Verfügung stellen.

MfG,

Luky

von Pal .. (pal)


Lesenswert?

Hi freakLuky,

schau dir meinen Beitrag vom Datum: 20.11.2012 07:29 mal an. Dort sind 
alle Routinen.

von Simon L. (simon_l836)


Angehängte Dateien:

Lesenswert?

Hallo, ich benutzt jetzt Atmega2561 und EA eDIPTFT43-A ueber I2C. Ich 
habe Ihren code benutzt jetzt. Und habe ich mit portD im Atmega2561 mit 
EA eDIPTFT43-A verbinden. Das ist PD0--SDA und PD1--SCL. Aber jetzt nur 
Lampe der SDA  immer hell und SCL nicht. Und display funktionieren 
nicht. Haben Sie   Idea fuer das?

von Simon L. (simon_l836)


Lesenswert?

Hallo,
ich habe gleich Problem jetzt. Nur die Lampe der SCL und SDA hell, aber 
keine Data nach Display senden. Was machen Sie danach? Koennen Sie mir 
antworten? Dnake.

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.