PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF8574 macht Schwierigkeiten !



oderlachs
08.09.2017, 17:28
Hallo Freunde

Ich habe Probleme mit einem I2C Portexpander PCF8574 P ich kann diesen nicht "programmieren/nutzen" was kann man denn in der An-/Beschaltung falsch machen ? Eine andere Platine(Industrielle) mit PCF8574 geht wunderbar mit dem Programm.

Hier mal meine Schaltung:


Bitte Beachtet nicht zu sehr meine Zeichenkünste, das erste Projekt mit KiCad, nie wiiieeder !!!

Als Adresse habe ich 0x40 Hex eingestellt. oder ich verstehe das Datenblatt falsch, habe A0,1,2 auf GND also LOW gelegt. es gibt auch keine Fehlermeldung(LEDs) bei TWI-Start, Init usw...
Wenn ich richtig verstanden habe soll nur der PCF8574A von dieser I2C Adresse abweichen, aber den habe ich ja nicht.
Muss warten bis die Lieferung mit den anderen Chips kommt , kann deshalb den chip nicht tauschen, kann ja sein der hat ne Macke ;)

Nun ja vielleicht kann wer erfahrender User mal helfen.

Gruss und Dank
Gerhard
Nachtrag die LEDs sind verkehrt gezeichnet, natürlich gehen die Anoden an +5V und die Kathoden zum Chip

Siro
08.09.2017, 20:07
Guten Abend Gerhard:

Deine beiden Pullupwiderstände
sind die 7K... das kann ich nicht richtig erkennen, das ist zu hoch.
Mach die mal auf 1,5K

und die Adresse müste meiner Meinung nach 0x20 Hex sein.
Bit 0 ist ja das Read Write Bit

Siro

oderlachs
09.09.2017, 08:47
Hallo Siro,

habe von 1,5K....7,15K mal durchprobiert...nicht anders.
Weiss auch nicht wo sich da der Fehler verkriecht.
Werde heute mal noch einen anderen Aufbau auf dem Steckbrett probieren.

Gruss und Dank

Gerhard

oberallgeier
09.09.2017, 09:16
Grüß Dich Gerhard,

keine Ahnung obs hilft, aber ich finde diesen Ratgeber (http://www.ti.com/lit/an/slva689/slva689.pdf) ziemlich gut. Hat mir vor kurzem s..viel geholfen.

HaWe
09.09.2017, 09:56
Guten Abend Gerhard:

Deine beiden Pullupwiderstände
sind die 7K... das kann ich nicht richtig erkennen, das ist zu hoch.
Mach die mal auf 1,5K

und die Adresse müste meiner Meinung nach 0x20 Hex sein.
Bit 0 ist ja das Read Write Bit

Siro

lass mal mit deinem µC einen i2c-Scanner laufen.
Ich denke übrigens, 7k müsste gehen, ich habe schon alles an Pullups zwischen 1,8k und 10k damit an meinen Arduinos verwendet. Es wird wohl eher wie Siro schrieb die i2c Adresse sein (0x20), aber das wird dir der Scanner schon zeigen. Hast du auch einen Arduino?

oderlachs
09.09.2017, 10:03
Hallo !
Nun bin ich sprachloser als vorher, folgendes Testergebnis habe:

Steckplatte mit LEDs und PCF8574 geht mit Arduino, nur mit ATMega32/STK500 nicht :confused:
Industriell gefertigte Platine mit PCF8574 geht mit Arduino und ATMega32/STK500 ...:o
Also kann das Programm vom ATMega auch nicht fehlerhaft sein....:)

Nun bin ich aber am Raten.... die Pullups an SCL und SDA sind bei den 20cm Leitung vom Chip zum ATMega eigentlich Wurscht, der Test mit dem Arduino ging auch ohne Pullup R's.

Na werder schon rausfinden was es ist.....

Gerhard
@ Oberall : Danke für den Link, kannte ich noch nicht das Dokument.....

..oh das ging ja schnell hier.... der Scanner zeigt 0x20 ganz eindeutig

HaWe
09.09.2017, 10:10
mit welcher i2c Adresse?
manche i2c libs verwenden übrigens die 7-bit Adresse (u.a. Arduino), manche die 8-bit Adresse.

für Arduino:



// --------------------------------------
// i2c_scanner
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>

#define ESP_SDA 4 //GPIO4=D2 SDA ESP8266 default
#define ESP_SCL 5 //GPIO5=D1 SCL ESP8266 default

byte error, address;
int nDevices;

void setup()
{
// Wire.begin(ESP_SDA,ESP_SCL); // only for ESP8266 if not default

Wire.begin(); // AVR, ARM, ESP8266 default

Serial.begin(115200);
while (!Serial); // Leonardo: wait for serial monitor

Serial.println("\nI2C Scanner");
Serial.println("\nScanning...");
}


void loop()
{
nDevices = 0;
for(address = 0; address < 128; address++ )
{

if (address%16 == 0) {
Serial.println();
Serial.print( (address+1)/16);
Serial.print(" ");
}


if(address==0 || address==127) {
Serial.print("** ");
continue;
}

Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
if (address<16) Serial.print("0");
Serial.print(address,HEX); Serial.print(" ");
nDevices++;
}
else if (error==4)
{
Serial.print("?? ");
}
else
{
Serial.print("-- ");
}
}

Serial.println();
Serial.print("found: "); Serial.print(nDevices); Serial.print(" devices \n");
delay(10000);
}

oderlachs
09.09.2017, 11:11
Hallo HaWe !
Du hast den Nagel auf dem Kopf getroffen, die I2C-Adresse muss ja um ein Bit nach links geshiftet werden und wird dadurch 0x40 H !! Und damit geht es dann auch :)
Menno, wie kann man in den Datenblättern was von 0x20 schreiben ??????

Ich habe ja schon an mir selber gezweifelt :mad:, das ich zu blööde bin Code zu schreiben oder sonst was. Hatte auch schon zwischen den Adressen 0x20 und 0x40 gewechselt,
aber da wird wohl dann im Eifer des "Gefechtes" etwas anderes fehlerhaft gewesen sein.

Nun habe ich mir mal aus dem jetzigen (anderen) Datenblatt die Adressentabelle rauskopiert, die wird ins AVR Handbuch eingelegt !!

Ich danke Euch allen für die Mithilfe sehr herzlich

Gruss Gerhard

HaWe
09.09.2017, 12:25
Hallo HaWe !
Du hast den Nagel auf dem Kopf getroffen, die I2C-Adresse muss ja um ein Bit nach links geshiftet werden und wird dadurch 0x40 H !! Und damit geht es dann auch :)
Menno, wie kann man in den Datenblättern was von 0x20 schreiben ??????

Ich habe ja schon an mir selber gezweifelt :mad:, das ich zu blööde bin Code zu schreiben oder sonst was. Hatte auch schon zwischen den Adressen 0x20 und 0x40 gewechselt,
aber da wird wohl dann im Eifer des "Gefechtes" etwas anderes fehlerhaft gewesen sein.

Nun habe ich mir mal aus dem jetzigen (anderen) Datenblatt die Adressentabelle rauskopiert, die wird ins AVR Handbuch eingelegt !!

Ich danke Euch allen für die Mithilfe sehr herzlich

Gruss Gerhard

die 7-bit-Adresse ist eigentlich die korrekte (bits 1-7), da bit 0 nur für den Controller als Lese- oder Schreibflag verwendet wird:
8-bit
7-6-5-4-3-2-1-rw
geshiftet zu 7-bit:
6-5-4-3-2-1-0
für die reine Adresse ist das 0. bit ntl wurscht, und wie das jetzt zu handhaben ist, ist alleine von der jeweiligen i2c-Lib abhängig: das ist nirgends festgeschrieben, aber in deinem Fall wäre 0x20 absolut korrekt, was sowohl den Datenblättern als auch den Arduino-Wire-Libs entspricht. Aber direkt falsch ist deswegen 0x40 auch nicht, ist halt lib- bzw. Plattform-abhängig.

oderlachs
09.09.2017, 14:29
Hallo HaWe !
Ja ich glaube das begriffen zu haben mit den Adressen 7 oder 8 Bit. da muss ich mal mein TWi-AdressScanner umschreiben, damit der auch beide Adressen ausgibt, gut man kann sie ja einfach umrechnen.

Für denjenigen , dem mein Code interessiert hier die C-Datei auf meinem Webspace (http://oderlachs.de/code/AVR/Portexpander.html)

Ist ja nur einfach gehalten, habe mich an Inet Beispiele und den Buch AVR Mikrocontroller Programmierung in C von Heimo Gaichler gehalten.

Gerahrd

HaWe
09.09.2017, 15:18
besser vlt je 1 I2C Scanner für alle betr. Zielplattformen, sonst weißt du ja immer noch nicht, welche nun für Arduino-gcc, AVR-gcc, Bascom, Linux-gcc oder was auch immer die dann wirklich (praktisch) korrekte ist ;)

oderlachs
11.09.2017, 07:55
Ja Du hast Recht,
aber ich habe mir jetzt abgewöhnt nach irgendwelchen Angaben in Codebeispielen usw. zu gehen. Beim Puren Chip kann man ja nach dem Datenblatt gehen , bei einigen bestückten Modulen a'la China-Import weiss man es nicht so genau, zBsp I2C LCD Adapter.

Auf jedem Fall habe ich begriffen wo der "Zug" jetzt lang fährt :) Mehr Probleme habe ich jetzt noch bei dem "Abfrage-Protokoll" verschiedener I2C Chips um brauchbare Ergebnisse zu schreiben bzw. auszulesen.

Es beschäftigt mich jetzt der DS1307 RTC . Aber ich denke es wird auch noch werden.... habe zum Debuggen / Test immer UART Ausgaben eingebaut, das ich im ser. Terminal lesen kann "wo der Hase in der Falle sitzt" ;)

Gruss & Dank

Gerhard