PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF8574p macht Probleme



oderlachs
08.03.2014, 09:32
Bei meinen ersten Gehversuchen mit einem I2C Portexpander(PE)PCF8574p habe ich arge Probleme.

Ich steuer den PE über I2C an ..es wird eine Schlefe gebildet die ein Byte von 0 bis255 zählt und wieder herrunter...dieses Byte wird jeweils zum PE gesendet..soweit so gut.

An den 8 Ausgangsports des PCF8574p sind über Vorwiderstand(330 Ohm) 8 LEDs gegen +5V. Liegt alles im Bereich mit Strom und Spannung lt. Datenblatt des 8574.

Nun ist aber folgendes Rätsel, die Ausgänge werden nur hoch oder runter "gezählt" das heist die LED leuchten in richtiger Weise nur,
wenn ich nach dem Reset oder Start, nochmals die +5V von den LED kurz unterbreche.:confused:

Ich werde heute nochmals Transistortreiber vorschalten , mal sehen was dann passiert, aber komisch kommt mir das ganze doch vor.

Weiss jemand einen Rat oder Hinweis ??

Gruss und Dank

Gerhard

fredred
08.03.2014, 10:06
Hallo.

Ich bin es wieder mal.
Schau doch mal in die Antwort Funkbrücke in der .BAS Zentrale dort sind auch Gosubs für I2C enthalten. Bin aber gerade dabei einen Artikel(I²C-Bus AVR) zu schreiben mit Beispiele für Eeprom, Analog, Digitalpoti und auch für PCF8574. Hard- Software natürlich alles getestet.

So nun muss ich in den Garten. Der große Teich hat nun nach 18 Jahren ein Leck. Oh Oh.
Gruß
Fred

oderlachs
08.03.2014, 11:19
Danke Fred !
Das Portexpander-Problem ist fast gelöst. Es lag an dem Gesamtstrom der 8LED wohl, mit den Transistorteibern geht es,
nur bekomme ich keine definierte Startbedingung hin. Etwar alles LOW oder alles HIGH...
Es bleibt der letzte Zustand erhalten....komisch ??

Gerhard

Achim S.
08.03.2014, 12:42
Hallo Gerhard
Der PCF 8574 soll beim Start eigentlich alle Ausgänge auf high haben. Daher ist mit der jetzige Stand eigentlich nicht klar.
Hast du dein RTC mit I2C in den Griff bekommen? Arbeite selber gerade am I2C Bus. Hast du schon was mit dem PCF8591 (ana) und der Ausgabe I2C --> LCd gemacht?
achim

fredred
08.03.2014, 13:01
Hallo Gerhard,

kann ich ohne Code nicht nachvollziehen.
In der Annahme du hast alle Port’s als Byte festgelegt zB. [Dim Digital As Byte], kannst du doch als Startbedingung Digital = 0 oder Digital ist gleich 255 senden.
Ist doch gut wenn sich die Register des IC die letzte Aktion „merkt“, wenn er vom Bus getrennt wird, um zB. einen anderen IC anzusprechen.
Für ein Modelbahnbauer habe schon mal 8 PCF 8574AP = Fam &H70 und 4 PCF 8574P = Fam &H40 am Bus geknallt. Projekt währ gescheitert wenn ein IC nach Busfreigabe die letzte Aktion „vergessen“ würde.
Ein LED –Treiber nachzuschalten wundert mich, wenn du 0 anlegst kann jedes Pin locker 10 mA ziehen. Eine 1 = H natürlich nur ca. 1mA schieben. Somit sollte das gemeinsame Potential aller LED’s immer H sein.

PS. Sein Vorname ist auch Gerhard, deshalb nicht wundern wenn in .BAS Zentrale Name erscheint, war auch für ihn.

Gruß
Fred

- - - Aktualisiert - - -

Hallo,schau auch mal hier im Forum mehrere Sensoren per Funk abfragen (https://www.roboternetz.de/community/threads/64406-mehrere-Sensoren-per-Funk-abfragen) .
in der Bas Zentrale, dort wird auch ein 4*20 LCD über I2C angesteuert.Gruß
Fred

Achim S.
08.03.2014, 14:24
Hallo Gerhard
habe es an meiner Platine getestet. Liegt der Bus an und der Prz bringt sein Programm. Lasse ich die Spannung an der Platine weiter anstehen und trenne nur den Bus ab, bleibt die letzte LED an. Komisch, unklar.
Falls du Sorgen mit Platinen hasst, musst du nur sagen was du brauchst. Kann es bei der nächsten Bestellung mit reinschieben
achim

oderlachs
08.03.2014, 15:40
Hallo Fred der Code ist in Arduino C geschrieben:


/* ================================================== ======================== */
/* */
/* i2c_expander.c */
/* (c) 2013 Gerhard Hinze */
/* */
/* Description */
/* */
/* ================================================== ======================== */
#ifndef F_CPU
//#define F_CPU 3686400UL // STK500
#define F_CPU 16000000UL // Arduino UNO...etc
#endif
/* ================================================== ======================== */
/* */
/* */
/* */
/* ================================================== ======================== */
#include <avr/io.h>
#include <util/delay.h>
#include <Wire.h>
/* ================================================== ======================== */
/* */
/* */
/* */
/* */
/* ================================================== ======================== */



#define expander 0x20
byte wert= 0xff ;
void setup()
{
Wire.begin(); //Initialisieren der I2C Verbindung.
}

void loop()
{
Wire.beginTransmission(expander); //Öffnen I2C Verbindung
Wire.send(wert); //Schreiben des Bytes.
Wire.endTransmission(); //Schliessen I2C Verbindung
delay(100);
if (wert==0)
{
wert =0xff;
}
else
{
wert = wert--;
}
}
/* ================================================== ======================== */

Was meinst Du eigendlich mit der ".bas - Zentrale" da sehe ich nicht ganz durch...

Ich kann zwar , bzw. besitze Bascom, aber ic h habe mich wegen AVR-Studio und Arduino auf C "spezialisiert"..

@Achim bei mir bleibt der Zustand auch nach Trennung von +Ub vom Expander bis zum neuen Betrieb bestehen.
darum setze ich alles auf High, also senden von 0xff beim Start..aber so richtig will das noch nicht gehen...

Gerhard

Achim S.
08.03.2014, 16:16
Hallo gerhard
scheinen beide das gleiche Problem zu haben. Auf einer andeen Seite wurde mr gesagt, das beim Anlegen der Spannung (nur der Spannung) alle Ausgänge einschalten, sorry das wort dafür vergessen.
achim

fredred
08.03.2014, 17:23
Hallo Gerhard,
möchte nochmals auf meine Hinweise für Antwort von RFM12 mit Pollin Anfrage hinweisen.
Die Programmieren in Assembler oder C ist das Effektivste, sagen die Experten, aber nach meiner Meinung ist der Binärcode nach wie vor Entscheidend. Somit bin ich auf BASECOM umgestiegen. Für meine vielen Anwendungen benötige ich ja nicht unbedingt „Echtzeiten“(ist ja auch technisch mit den Atmega’s kaum möglich)
Der BASCOM- Compiler macht dies schon sehr gut und vor allen Dingen die vielen Lib’s die zu Verfügung stehen, erleichtern schon erheblich den Programmieraufwand. Auch die Lesbarkeit und Syntaxprüfungen finde ich sehr hilfreich in dieser Ebene.
Diese BAS können mit Editor gut gelesen werden und somit sind diese auch für C Anwender mit Erfahrung gut umsetzbar aber nicht umgekehrt für C- Unerfahrene.
Auch die nach Compile erzeugten Bin- Hexdateien können sogar in SPI- Industrieanwendungen übernommen werden.
Schaut man sich die vielen BASCOM Lib’s an erkennt man schon, BASCOM ist nicht das alte „lahme“ Basic.
Aber jeder soll sein „Ding“ machen wie er es als gut empfindet.
Denn nur der Erfolg zählt.

Gruß
Fred

Achim S.
08.03.2014, 17:40
Hallo fredred
das mit echtzeit ist so eine Sache, es ist relativ möglich. Habe einen längeren teil mit dem 128 geschrieben. Dabei war der Prz dabei mehrere Timer und Ausgänge fast gleichzeitig zu machen. Fast bedeutet dabei, er konnte z.B. mehere LED fast gleichzeitig schalten, dabei auch noch eingänge abfragen und einiges mehr. Die Zeiten lagen dabei für einen kompletten Durchlauf bei 1 bis 5 ms, teilweise auf 100us. Wichtig dabei ist auch, das kein extra RS oder so geladen werden muss. Sonst besteht die Gefahr das neben dem RS noch 10 Befehle Platz haben. Ist ein Multitasking.
achim

fredred
08.03.2014, 18:14
Hallo Achim,

ist völlig OK. „ Ist ein Multitasking“
Aber hast du schon mal versucht viele Funksignale, DCF- Signal, 1wirte- Bus und ca. 10 I²C Busteilnehmer in Echt abzufragen. Natürlich auch auswerden und auf LCD anzuzeigen.
Dies alles in ca. 100 µs. Währe schon sehr Interesand für mich, wie du es erfolgreich, umsetzen kannst.

Gruß
Fred

Achim S.
08.03.2014, 18:25
Hallo Fredred
bin gerade am I2C dran und versuche mein Glück. Das Multi.. habe ich nicht vergessen. Werde auch versuchen es dort einzusetzen. Aber erst mal den Bus begreiffen und alles in c
achim
PS. Bei dir steht Lutherstadt, komme aus BBG

oderlachs
08.03.2014, 18:53
Hallo Fred !
Ich sage jeder sollte damit programmieren, womit er am besten vorankommt, was ihm liegt und was den Anforderungen genügt!
Das ist wie beim Autokauf jeder mag nicht immer ne andere Automarke und hat Negatives zu berichten, aber er mag die Marke seines eigenen Autos oft als Beste darzustellen... :)

Ich habe am C64 mit Basi und ASM angefangen und durfte beruflich über Pascal, C,C++, Java, Delphi und was weiss ich noch alles gehen...nun nutze ich das mit was ich gut klar komme : "C" und gut ist's ..

Der eine hat Bascom, der andere C oder ASM..schliesslich machen die Compiler sowieso Maschienencode daraus..

Wenn man Bascom versteht kann man auch von Bascom vieles umschreiben in C,
Bascom erleichter aber hin und wieder viel Tipparbeit, so hat alles Vor- und Nachteile.

Aber trotzdem weiss ich immer noch nicht was ich mir in sachen BAS da ansehen soll..hab irgendwie heut Brett vorm Kopp ;)

Gerhard

RoboHolIC
09.03.2014, 01:45
Lasse ich die Spannung an der Platine weiter anstehen und trenne nur den Bus ab, . . .
Was ist mit "trenne nur den Bus ab" gemeint? Ein (reguläres) beenden der Buskommunikation? Dann darf sich an den Ausgängen nichts mehr verändern. Oder ist Busstecker-ziehen gemeint? In dem Falle muss man mit Signalprellen rechnen und dann ist alles möglich.

fredred
09.03.2014, 09:37
Guten Tag Gerhard,

wollte doch auf keinen Fall, irgend eine Programmiersprache, als gut oder schlecht beurteilen.
In meiner Antwort wollte ich nur beschreiben warum ich BASCOM nutze.

Hatte mein Code Zentrale_Test.bas ungekürzt veröffentlicht, da auch Lösungen für ( DCF77, 1wire,Touch, 2Controller mit Uart verbinden und Lösungen für I2C –Bus auch eine LCD hängt daran) als eigenständige Gosubs. Wie zum Beispiel 2 PCF8574 der eine als Eingang der andere in Abhängigkeit als Ausgang.

Hier ein Ausschnitt:

'Slaveadressen für Porterweiterung LCD
Const Pcf8574_lcd = &H70 '&B01110000 Dez = 112
'Slaveadressen für Porterweiterung D1
Const Bus_d1 = &H72 '&B01110010 Dez = 114
'Slaveadressen für Porterweiterung D2
Const Bus_d2 = &H74 '&B01110100 Dez = 116
'==== Adressen Variable zuweisen ====
Const Taster_schreib_adresse_t = &B01110010 ' ist IC1
Const Taster_lese_adresse_t = &B01110011
Const Led_schreib_adresse_t = &B01111000 ' ist IC3
Const Led_lese_adresse_t = &B01111001


'----- Beispiel I²C-Bus Ein-und Ausgänge für 2 ICs verknüpfen.----
' IC1 = Eingang (Taster) IC3 = Ausgang (LED)
Ibus_dig:

I2cstart
I2cwbyte Taster_schreib_adresse_t
I2cwbyte &B11111111 ‘saubere Startbedingung
I2cstop

I2cstart
I2cwbyte Taster_lese_adresse_t
'I2crbyte Tasten , Ack 'lese nochmal ist sicher aber muss nicht sein
I2crbyte Tasten , Nack
I2cstop

'### Abfrage Bit von Tasten_Byte #########
'das Toggeln ist nur für Doppelabfrage 1x drücken EIN nochml AUS
'ein Beispiel für Kontakte ist Bit7 vom Tasten-Byte.

If Tasten.0 <> Alte_tasten.0 Then
If Tasten.0 = 0 Then 'ist Bit0 vom Byte
'steigende Flanke
Toggle Leds.0
Cls 'alte Anzeige löschen
Gosub Anzeigen 'gehe zur LCD-Anzeige
Else
'fallende Flanke
End If
End If

'-- Abfrage Bit1 vom Byte Tasten ---
If Tasten.1 <> Alte_tasten.1 Then
If Tasten.1 = 1 Then
'steigende Flanke
Toggle Leds.1
Cls 'alte Anzeige löschen
Gosub Anzeigen 'gehe zur LCD-Anzeige
Else
'fallende Flanke
End If
End If

'-- Abfrage Bit2 vom Byte Tasten --
If Tasten.2 <> Alte_tasten.2 Then
If Tasten.2 = 1 Then
' steigende Flanke
Toggle Leds.2
Else
' Fallende Flanke
End If
End If

'-- Abfrage Bit3 vom Byte Tasten --
If Tasten.3 <> Alte_tasten.3 Then
If Tasten.3 = 1 Then
' steigende Flanke
Toggle Leds.3
Else
' Fallende Flanke
End If
End If

'-- Abfrage Bit4 vom Byte Tasten --
If Tasten.4 <> Alte_tasten.4 Then
If Tasten.4 = 1 Then
' steigende Flanke
Toggle Leds.4
Else
' Fallende Flanke
End If
End If

'-- Abfrage Bit5 vom Byte Tasten --
If Tasten.5 <> Alte_tasten.5 Then
If Tasten.5 = 1 Then
' steigende Flanke
Toggle Leds.5
Else
' Fallende Flanke
End If
End If

'-- Abfrage Bit6 vom Byte Tasten --
If Tasten.6 <> Alte_tasten.6 Then
If Tasten.6 = 1 Then
' steigende Flanke
Toggle Leds.6
Else
' Fallende Flanke
End If
End If

'-- Abfrage Bit7 vom Byte Tasten --
If Tasten.7 = 0 Then
Print "habe EIN geschalten" 'Pin auf GND
Else
Print "habe AUS geschalten" 'Pin auf Vcc oder offen (liegen ja int. auf H)
End If

'----------letzen Tastendruck merken----------
Alte_tasten = Tasten
'--- Tastendruck an LED weitergeben-----------
I2cstart
I2cwbyte Led_schreib_adresse_t
I2cwbyte Leds
I2cstop
'--- Tastendruck an Anzeige-Modus weitergeben--
Lcd_aktualisieren = Leds
Gosub Anzeigen
Return

Gruß
Fred

oderlachs
09.03.2014, 09:41
Hallo ,
ich habe mir nochmals das Datenblatt des PCF8574 durchgesehen, nun ich verstehe kaum englisch, aber es sollte bei Anlegen der Betriebsspannung ein Reset statfinden, soviel habe ich verstanden. Wie sich dieser Reset auf die Pegel an den Ports auswirkt, habe ich nicht herrauslesen können, bei dem wenigen Englisch, was ich da fachlich verstehe.
Bei mir wurde nur Ub getrennt von der Last, also den 8 LEDs an den Ports, bzw die ganze Schaltung MCU und Expander, der BUS blieb immer verdrahtet.

..nun ja ich experimentiere weiter EXPander hat ja auch was mit EXPeriment gemeinsam... ;)

Gerhard

fredred
09.03.2014, 10:03
Hollo,
Völlig OK erklärt. Deshalb sind ja auch die zwei Widerstände von SCL und SDA auf H ein muss.

Gruß

- - - Aktualisiert - - -

Natürlich das wichtigste Vergessen warum BASCOM.
Im „Programmkopf“ diese Lib schreiben.
Schaust du dich diese Lib mit Editor an, wirst du mich vielleicht verstehen warum ich diese Programmiersprache bevorzuge.

'--------- I²C Bustreiber laden -----------
Enable Interrupts 'alle Interrupts sind aktiv
'für Hardware TWI interne Software einbinden
$lib "i2c_twi.lbx"
Config Twi = 100000 'Bus-Takt = 100kHz

Mit völlig OK . Ist die Antwort von Robo

oderlachs
09.03.2014, 10:33
Danke für den Nachtrag, ich glaube das ich weiter in C (um)schreibe...ich habe zwar die Bascom Demo aber die ist bei grossen Sachen nicht einsetzbar. Für das Bis'chen , was ich mal ich mal in Bascom probiere reicht es immer noch...
Ich habe auch in Bascom angefangen in Sachen AVR , nachdem ich mir das dicke bascom Buch von K.Kühnel gekauft hatte.
Seit dem Einsatz von auch Arduinos mache ich fast ausschliesslich C...

Ich denke ich werde das auch noch hinbekommen..mache erst mal in der RF Sache weiter, um den "Geist" nicht nur einspurig laufen zu lassen.. ;)

Schönen Sonntag allen

Gerhard

fredred
09.03.2014, 11:27
Hallo Gerhard,

In der Annahme unser Fachsimpeln ist dich nicht lästig noch ein paar Erfahrungen.
Dank Hilfe des Forums (auch große I2C Eeproms anzusprechen), bilde ich mich ein die vielen Möglichkeiten der Bussysteme in Griff zu haben.
Die Software ist eine Sache für sich aber die Hardware muss stimmen. Somit kann ich es nicht verstehen wenn du in deinem Projektversuch nur die Ausgänge „abnabelst“ die Register im IC Dummspielen. Es kann nur sein wenn SCL oder SDA ein Impuls bekommen, oder du trennst Softwaremäßig den Busteilnehmer nicht nach Aktion vom Bus. Währ fatal denn dies ist das A+O jedes Bussystem. DerI²C- Bus ist nur für kurze Leidungslängen gedacht ca. 200mm. Es sei denn du schaltest ein Bustreiber dazwischen. Habe ich auch schon getestet 100 m waren kein Problem.
Sehr wichtig ist ein sauberer Pegel der Busleidungen. Laut Hersteller 4,7 kOhm auf H. Die Experten sind sich da nicht einig ob Widerstände direkt am Controller oder am Teilnehmer. Da ich auch schon mal ca. 1 m Leitungslänge hatte, einfach 10 kOhm am Controller und nochmals 10 kOhm am Teilnehmer und es funktioniert zuverlässig.

Bis dann wenn noch Probleme.
Gruß Fred

oderlachs
09.03.2014, 11:39
Hallo Fred,
nein das Fachsimpeln macht mir keine Probleme, weder noch ist es mir lästig. Ich hatte Dich per Mail angeschrieben (nicht angekommen ??), damit nicht alles das Forum "belästigt", ich meine das Forum ist dafür da, es sollen alle daran lernen und Erfahrungen einflechten können.
Aber das manches im Forum hier übersichlicher bleibt, schreib ich gerne dann wenns zu viel wird per priv. mail oder gebe einen hier einen Link zu meiner Hompage an , wo bestimmte Daten, Fotos oder Quellcodes liegen...

Ich habe meinen I2C BUS mit max 10 Meter vorgesehen, soll noch gehen. Brauche diese Entfernung für meine Klimasensoren, die ich nicht auch noch über Funk auslesen möchte....da hier viel Funkbetrieb mit 433MHz und auch 2,4GHz betrieben wird...andere Frequenzen muss man zahlen..das muss aber nicht sein ....


Gruss Gerhard

Nachtrag : Alles ist mit Cat-6 Kabel verbunden, ich meine alles, was ausserhalb der Zentrale als Sensor/Aktor fungiert. SSR Relais schalten Aktoren an dessen Standort(Punpen, Magnetventile, Ventilatoren usw..)

Achim S.
09.03.2014, 13:05
Hallo gerhard
habe es getestet. Habe einen PCF 8574 auf einer kleinen Platine. Dazu 8 LED nach + gelegt. Beim Einschalten der Spannung ohne Bus sind alle LED dunkel. Habe auch das Datenblatt studiert und einen bekannten angemailt. Aussage dazu, beim Anlegen der Spannung sind alle Ausgänge auf H gelegt, dadurch alle LED aus. Erst wenn eine Ausgang angesteuert wird geht Transistor auf L und LED leuchtet. Die Angabe der Länge stimmt so nicht ganz. Der Hersteller gibt zwar an, das nur im Nahfeld funktioniert. Zum testen der Platinen habe ich auf meinem Tisch jetzt Längen zwischen 30 cm und 1 m. Ohne soll es ohne Probleme bis auf ca 5m bis 7 m (10m) gehen, Dann kommen erst die Verlängerungen mit IC. dort gibt es auch sehr interessante Sachen
achim

oderlachs
09.03.2014, 20:59
Danke Achim für Deine Mühen wegen miche...

Gruss Gerhard

Achim S.
09.03.2014, 21:17
Sorry, will das auch begreifen. Ausserdem kenne ich deine Gegend sehr gut.. Eberswalde
achim

fredred
10.03.2014, 13:57
Hallo Gerhard,

1.Bitte beachte ein L oder H über viele Meter per Kabel zusenden, macht kaum Probleme(wenn senden größer 100 µs ist), aber wenn eine Takt -Synchronisierung erforderlich ist, sind die Impedanzen mich zu vernachlässigen.
Bedeutet der Controller sendet erst mal ich möchte den xxxI2C Teilnehmer ansprechen(benötig schon einige Takte. Meldet er sich “hast mich gefunden“ auch ein paar Takte nötig. Nun noch einige Takte was das „Ding“ machen soll usw.
Somit habe ich in meinen Projekten den I2C Takt auf 100 kHz eingestellt ob wohl viele auch 400 kHz vertragen.
2.Funkbetrieb mit 433MHz ist wirklich nicht gut. Viele Spielzeuge Funksteckdosen usw. funken auf dieser Frequenz. Deshalb meine Variante 868 MHz RFM12 zu nutzen. In meiner RFM-Int können über 40 Kanäle ausgewählt werden. Einfach einen ungestörten Kanal wählen und alles bestens. Habe ich schon mal in deiner Anfrage Funk beschrieben wie einfach dies ist. (Nur dumm alles in BASCOM-AVR geschrieben) Könnte dies auch in C umzuschreiben. Dies mache ich aber nicht.
Begründet: Möchte nur zuverlässige und langzeitgetestete Lösungen veröffentlichen.
Gruß Fred