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
structPufferData{
6
unsignedchardc;
7
unsignedcharlen;
8
unsignedchardata;
9
unsignedcharbcc;
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
unsignedcharleseDaten(){
25
chardataS[]={S};
26
unsignedcharbccS,lenS=1;
27
unsignedcharackE=0;
28
structPufferDatadataE;
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
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
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...
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.
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
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.
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
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
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
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?
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.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.