Forum: Mikrocontroller und Digitale Elektronik EA eDIPTFT43-A an Arduino Board


von Marco D. (iben)


Lesenswert?

Hallo ich will o.g. TFT über ein Arduino Board (i2c, Seite 7 der TFT 
Anleitung) ansteuern.

http://arduino.cc/en/Main/ArduinoBoardDuemilanove
http://www.lcd-module.de/pdf/grafik/ediptft43-a.pdf

Als ersten Test dachte ich mir ich schliesse pin1 (GND for logic) und 
Pin2 (VDD for logic) an die
entsprechenden pins des Arduino Boards an (GND, 5V) und habe erwartet 
das
das Display Storm bekommt und irgendeine Reaktion von sich gibt, doch 
leider pasiert nichts :( Auch nur mit den Pins21 und 22 (GND, VDD) gab 
es keine Reaktion. Was bedeutet der Zusatz "for logic" bei den Pins 1 u. 
2?

Schliesse ich das TFT zusammen mit dem Programmer an einen PC/MAC über 
USB an dann läuft eine Komplette Demo ab, also ist das TFT nicht defekt.

Kann mir jemand weiterhelfen ich bin da elektronik Laie.

Um das TFT über i2c anzusteuern hätte ich nur diese 4 pins (VCC,GND, 
SDA, SCL) angeschlossen, wie ich es auch schon mit folgendem LCD03 
erfolgreich getan habe:
http://www.active-robots.co.uk/media/pdf/LCD03.pdf

Das TFT Applikationsbeispiel auf Seite 7 zeigt noch weiter Pins wie z.B. 
Reset 5(5V) und i2c mode 12(GND), müssen diese evtl. auch beschaltet 
werden?

Aus Sicherheitsgründen habe ich beim Testen das Arduino Board mit einer 
9V Block Batterie betrieben, kann das die Ursache sein.

Kann mir jemand sagen wie ich das TFT an das Arduino Board richtig 
anschliessen kann?

Vielen Dank,
 Marco

von Gast (Gast)


Lesenswert?

Also ich sehe da einen kompletten Schaltplan für I2C Betrieb

von Marco D. (iben)


Lesenswert?

Was muss ich denn noch mit anschliessen?
(Ich gehe ja davon aus das die Pins 1,2,14,15 ausreichend sind)

von Gast (Gast)


Lesenswert?

1  - GND
2  - 5V
5  - 5V
12 - GND
14 - SDA
15 - SCL

von Marco D. (iben)


Lesenswert?

Super, danke.

von Marco D. (iben)


Lesenswert?

Hallo,
ich brauche doch noch eurer Hilfe.
Ich habe das TFT wie oben an den Arduino angeschlossen, die Pins BA2-BA0 
und SA2-SA0 sind offen und wegen Pullup -> 1.
Jetzt will ich es mit der wire.h lib wie folgt ansteuern:
1
#include <Wire.h>
2
3
void setup()
4
{
5
  Wire.begin(0xDE);           // join i2c bus (address optional for master)
6
                              // 8Bit 11011110 / 11011111 
7
  Wire.beginTransmission(4);  // transmit to device #4 ???
8
  Wire.send("#TA");           // switches off terminal mode
9
  Wire.send("#FR");           // fills a rectangle with colour 7  
10
  Wire.send(100);
11
  Wire.send(100);
12
  Wire.send(200);
13
  Wire.send(200);
14
  Wire.send(7);
15
  
16
  Wire.endTransmission();     // stop transmitting
17
}
18
19
20
void loop()
21
{
22
  for(;;)
23
  ;
24
}

Es passiert aber nichts, nur das standard Demo wird abgespielt (Clown, 
Erdkugel usw.)

Zwei Punkte sind mir unklar:
1. Brauche ich eine Device Adresse? Wenn ja welche ist das?
2. Ich habe etwas von zwei 10k Ohm an SDA u.SCL nach Plus 5V legen, 
gelesen? Brauche ich etvl. diese Widerstände?

Vielen Dank,
 Marco

von Chris H. (wuselwutz)


Lesenswert?

Marco D. schrieb:

> 1. Brauche ich eine Device Adresse? Wenn ja welche ist das?

Schon mal auf Seite 7 des von Dir selbst verlinkten Handbuchs geschaut?

> 2. Ich habe etwas von zwei 10k Ohm an SDA u.SCL nach Plus 5V legen,
> gelesen? Brauche ich etvl. diese Widerstände?

Nein, der I2C Bus wird generell ohne Pull Up Widerstände betrieben...

Hier im Forum finden sich jede Menge Infos zum I2C/IIC/TWI Bus. Da steht 
auch einiges zu den Widerständen.

http://de.wikipedia.org/wiki/I2C

von Helge T. (htefs)


Lesenswert?

Chris H. schrieb:
> Nein, der I2C Bus wird generell ohne Pull Up Widerstände betrieben...

Steht im von Dir verlinkten Wikipedia-Artikel aber anders:
Zitat:
"Die Pull-Up-Widerstände RP an der Takt- und Datenleitung passen den 
High-Pegel an die Höhe der Versorgungsspannung an."
Im danebensteheneden Bild sind die auch zu sehen.

von Marco D. (iben)


Lesenswert?

Ja schon ist mir jedoch nicht ganz klar. Die i2c Adresse sollte 0xDE für 
Schreiben sein. Der Fehler könnte beim initialisieren liegen: 
Wire.begin(0xDE) und Wire.beginTransmission(4).

Werde es heute Abend wie folgt versuchen:
1
...
2
Wire.begin();                  // join i2c bus (address optional for master)
3
Wire.beginTransmission(0xDE);  // transmit to device 0xDE
4
...

Danke.

von Marco D. (iben)


Lesenswert?

Auf der Abbildung des Links zum TFT auf Seite 7 sind die Widerstände 
auch gestrichelt eingezeichnet.

Wenn das mit den geändertem Code nicht klappt, lege ich zwei Widerstände 
an. Sind 2 x 10k OHM ok?

Gruß,
 Marco

von Chris H. (wuselwutz)


Lesenswert?

Helge Tefs schrieb:
> Chris H. schrieb:
>> Nein, der I2C Bus wird generell ohne Pull Up Widerstände betrieben...
>
> Steht im von Dir verlinkten Wikipedia-Artikel aber anders:

Verflixt, ich hab die Ironie-Tags vergessen...

Mein Beitrag sollte natürlich lauten: "Lesen bildet!"

von Marco D. (iben)


Lesenswert?

So langsam steige ich durch, doch leider führt das TFT immer noch seine 
Demoprozedur durch und lässt sich nicht ansprechen :(

So habe ich es angeschlossen (mit Widerständen):

1  - GND
2  - 5V
5  - 5V
12 - GND
14 - SDA (10k Ohm nach 5V)
15 - SCL (10k Ohm nach 5V)

Hier das aktuelle coding (sketch) für den Arduino:
1
#include <Wire.h>
2
#define  i2c_eaDIP  0xDE        // Ba2|Ba1|Ba0|Sa2|Sa1|Sa0|R/W
3
4
byte bcc;       
5
6
void setup()
7
{
8
  Serial.begin(9600);
9
10
  Wire.begin();           // join i2c bus (address optional for master)
11
  Wire.beginTransmission(i2c_eaDIP);  // transmit to device #0xDE
12
13
  Display_loeschen();
14
15
  Wire.endTransmission();     // stop transmitting
16
17
  delay(100);
18
19
  Wire.requestFrom(0xDF, 1);
20
  Serial.println(Wire.available(), HEX);
21
  Serial.println(Wire.receive(), HEX);
22
23
}
24
25
void Display_loeschen() {
26
  Wire.send(0x11);   // <DC1>
27
  Wire.send(0x03);   // len
28
  Wire.send(0x1B);   // ESC
29
  Wire.send('D');
30
  Wire.send('L');
31
  bcc = ( 0x11 + 0x03 + 0x1B + 'D' + 'L' ) % 0x400; 
32
  Wire.send(bcc);
33
  //D = 0x44
34
  //L = 0x1B
35
}
36
37
void loop()
38
{
39
  for(;;)
40
    ;
41
}

Serial.print dient nur zur Überprüfung der Ausgabe, um zu überprüfen ob 
mir das TFT ein ACK zurückliefert, es kommt jedoch nichts zurück ausser 
0.

Es muss ja entweder das Coding oder die Art wie es angeschlossen ist 
sein, kann mir jemand helfen? Sind die Widerstände zu evtl. zu groß?
Oder muss ich diesen Demo Mode irgendwie anders beenden?

Danke und Gruß,
 Marco

von Marco D. (iben)


Lesenswert?

Weitere neue Erkenntnis:

Info zur wire Library:

...Wire library will enable ATMEL internal Pullup's. So using additional 
pullup's with a short bus may not be required, for example interface 
only a single nearby EEPROM...

Also Widerstände wieder raus und den Pin 13 Dpom habe ich auch auf GND 
gelegt (disable PowerOnMacro), jedoch blinkt der Cursor nur und es wird 
nichts angezeigt.

von Helge T. (htefs)


Lesenswert?

Schonmal einen Oszi rangehängt und geschaut, was da vom Host gesendet 
wird? Antwortet das Display überhaupt auf Deinen I2C-Code? Wenn die 
Adresse stimmt, solltest Du wenigstens das ACK des Displays sehen. Ist 
Dein Bus vielleicht zu schnell (laut Datenblatt maximal 100kHz, bei 
langen Pausen bis 400kHz)?
Wieso nimmst Du in Deinem Programm die Summe eigentlich Modulo 0x400? 
Wäre nicht 0x100 (256) richtig? Achja, und Dein Kommentar für den 
Ascii-Code von "L" stimmt nicht, aber das ist ja nebensächlich...
Gruß, Helge

von Marco D. (iben)


Lesenswert?

Hi,
leider habe ich keine Oszi, nein das Display antwortet nicht auf den I2C 
Code, so als würde es nichts erhalten.
Der Bus ist 100kHz schnell, delays zwischen den sendenden Bytes hilft 
auch nichts, ein anderes Board habe ich auch schon versucht.
Mit den 0x400 upps, das ist der oct Wert, du hast recht. Der Testmodus 
des TFTs gibt mir auch die korrekte Adresse 0xDE und das es auf i2c 
kommunikation eingestellt ist.
So langsam bin ich ratlos.

Gruß,
 Marco

von Marco D. (iben)


Lesenswert?

Problem gelöst, ich schreibe morgen etwas dazu.
Ich danke euch.

von Marco D. (iben)


Lesenswert?

Es lag an der i2c 8bit Adresse und zwar am r/w Bit. Die wire lib hängt 
das r/w Bit selbständig an, je nach ob gelesen oder geschrieben werden 
soll. Somit ist
1
 #define  i2c_eaDIP  0xDE
keine gültige Adresse, da 8Bit deshalb muss das r/w Bit weggelassen 
werden:
1
 #define ( i2c_eaDIP  0xDE >> 1 )
.

Danke an Claus aus dem arduino.cc forum.

von Helge T. (htefs)


Lesenswert?

Hallo Marco!
Danke für die Info, vielleicht hat ja irgendwann noch jemand anderes das 
gleiche Problem.
Mich würde nur mal interessieren, was sich der Programmierer der Lib 
dabei gedacht hat. Die Adresse je nach Bedarf "or 0x01" zu nehmen (oder 
eben nicht) sollte doch eigentlich nicht so schwer sein. Stattdessen 
muss man eine "unvollständige" Adresse angeben. :(
OK, man umgeht vielleicht eine Fehlerquelle, wenn die Anwender z.B. eine 
Adresse mit gesetztem Lese-Bit verwenden, aber dafür werden die gleichen 
Anwender, wenn sie denn mal den I2C außerhalb des Arduino programmieren 
müssen, wieder umdenken oder mit einer falschen (weil unvollständigen) 
Adresse kämpfen.
Gruß, Helge

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.