pcf8574P Problem

fofi1

Mitglied
09. Jan. 2010
116
1
18
Sprachen
Hallo,

ich habe mal vor kurzem meinen pcf8574P aus der Bastelkiste hervorgekramt um mal wieder ein bisschen mit dem I2C Bus zu experimentieren. Leider habe ich grad das Problem, dass der Chip fast keine Spannung am Ausgang hat. Zum Testen habe ich an die Ausgänge Low Current Leds angeschlossen. Alle Leds wollen nur leicht "glimmen". Hab ich was falsch gemacht oder ist der Chip kaputt.

Code:
$regfile = "M168def.dat"                                    ' the used chip
$crystal = 8000000                                          ' frequency used
$baud = 19200

'I²C
Config Scl = Portc.5                                        ' Ports fuer IIC-Bus, nicht Standard !
Config Sda = Portc.4



'Variablen
Const Pcf_write = 64                                        ' Slaveadresse
Const Pcf_read = &H41
Dim Ledsteuerung As Byte


I2cinit




Do

Incr Ledsteuerung

I2cstart
I2cwbyte Pcf_write
I2cwbyte Ledsteuerung
I2cstop


If Ledsteuerung = 8 Then
Ledsteuerung = 0
End If

Loop

End
 
Hallo!

Hast du dir zu dem Thema schon mal DIESEN BEITRAG durchgelesen?

OK, ich habe die "A"-Type mit I2C-Adresse=&H70 verwendet.... aber ansonsten sind die gleich.

Wenn ich das Datenblatt richtig verstanden habe, dann kann der PCF8574 kaum Strom liefern..... aber entgegen nehmen.
HIGH-Level Output Current hat er nur bis max. 300µA. Das dürfte selbst Low-Current-LED`s zu wenig sein.
LOW-Level Output Current verträgt er aber bis 25mA.

Hast du auch die LED`s als "gemeinsame" Anode beschaltet, so das der PCF8574 gegen GND schalten muss?
Ansonsten würde ich die Ausgänge mit einem ULN2803 verstärken!


Das du im Code zwar die Hardware-Pins für den I2C benutzt ist zwar OK, aber du solltest dann auch $lib "i2c_twi.lbx" einfügen... sonst wird I2C nur emuliert!

Allerdings ändert das bei dir nun nichts an der Funktion des Programms.

Grüße,
Cassio
 
Code:
Do

Incr Ledsteuerung

I2cstart
I2cwbyte Pcf_write
I2cwbyte Ledsteuerung
I2cstop


If Ledsteuerung = 8 Then
Ledsteuerung = 0
End If

Loop


Hallo!

Sorry... was mir eben beim drüber schauen noch mal aufgefallen ist....
Kannst du in die Do-Loop Schleife mal eine Pause einbringen?
Ich würde mal ein "Wait 1" kurz vor Loop einsetzen.

Wenn dein I2C-Bus mit vollen 400k den PCF befeuert, dann könnte der Zustandswechsel doch ziemlich schnell sein.

Du kannst den I2C-BUS auch mit
Code:
Config Twi = 100000                                         '100k BUS-Takt

begrenzen.... falls die 400k dem PCF zu viel sein sollten.


Grüße,
Cassio


PS:
Ach so....
Das deine 0-8 nur die ersten 4 LED`s leuchten lassen ist dir doch klar, oder?
dezimal 8 = binär:1000 ;)
 
Danke dir. Ich hab natürlich wieder nur die Ausgangsspannung angeschaut aber ned den Strom:flute: . Ich hoffe man lernt wirklich aus seinen Fehlern:p .

Deinen Beitrag den du verlinkt hast habe ich leider auf Anhieb nicht gefunden gehabt, aber da steht alles drin. Super erklärt:) .

Leds waren mit gemeinsamer Kathode geschalten, folglich ists klar dass die nur glimmen:rolleyes: .

Mfg,
Florian
 
Hallo Florian!

Und was ist nun?
Läuft dein PCF8574, oder nicht? :hmmmm:


Mit den kleinen PCF8574 kannst du auch mehr machen, als nur LED`s schalten.....
Schau mal HIER ! ;)
Oder auch HIER !
Auf diese Weise kannst du sogar LCD`s und Matrixtastaturen mit dem AVR verbinden.... und das alles nur mit zwei Pins am Controller. :)


Grüße,
Cassio
 
Morgen Cassio!

Der PCF8574 läuft jetzt, da er einen ULN2003 spendiert bekommen hat:p . Ich habe mit dem PCF8574 schon einmal ein 16x4 Zeichen LCD angesteuert. Leider "blinkte" das LCD wenn ich z.B eine Variable hochzählen lies. Ich vermute mal dass dafür der I2C Bus zu langsam war:confused: .

Eine RFID Anlage reizt mich jetzt schon länger. Sowas muss ich irgendwann mal in Angriff nehmen. Speziell denke ich da an unsere Garage. Andauernd vergisst man diesen Funkschalter mitzunehmen:D . Mit nem RFID Chip im Geldbeutel sollte das schon komfortabler gehen:)

Mfg,
Flo
 
Hallo Flo!

Freut mich, dass es doch funktioniert und die IC`s noch in Ordnung sind!


Mit dem 16x4 LCD hatte ich ja auch schon experimentiert.... aber ein Blinken konnte ich da nicht feststellen. :hmmmm:
Kommt natürlich auch immer drauf an, wie oft man das LCD über den I2C-BUS mit Daten befeuert.
Man muss sich da schon etwas mehr Zeit lassen und die Programme optimieren.... also nicht den AVR mit 16MHz takten und bei jedem Schleifendurchlauf die Daten raushauen. ;)


Mit den RFID-Anlagen habe ich hier inzwischen einige Türen bestückt.
Die Garage kommt dann auch noch dran. ;)
Meistens ist aber das Installieren der Türöffner und Anlageneinheiten viel Aufwändiger als die Platinen zu erstellen oder das Programm anzupassen. Schließlich soll man von Außen nichts sehen können und von Innen muss es für mich auch so aussehen, als wäre es schon immer da gewesen. ;)
Mal sehen, wann ich hier noch mein "A1"-System einstelle......


Grüße,
Cassio
 
Hallo Flo!

Ach so....
ich habe inzwischen meine erste "ISE" auch fertig.

Funktioniert bestens und ich weiß gar nicht, wie ich das früher ohne gemacht habe. ;)

Ich arbeite nebenbei an zwei weiteren Einheiten.
Einmal wieder mit 16x2LCD, mehr Tasten und optische schöner.....
und einmal mit 16x4LCD und eigener Logik.
Mal sehen, wann ich damit weiter komme.


Grüße,
Cassio
 
Der Thread ist zwar etwas länger her, aber vielleicht schaut noch jemand vorbei.

Ich habe ebenfalls einen PCF8574P, die ansteuerung des LCD Displays klappt - daher nehme ich an, die I2C-Schnittstelle passt. Jedoch empfange ich nichts von dem IC, wenn ich ihn abfrage.

Mein
Code:
$crystal = 8000000
Declare Sub Key

Ddrb = &B00000001
Ddrd = &B11011111                                           'taster an d5, led an b.0
Portd.5 = 1

Config Sda = Portc.4
Config Scl = Portc.5
I2cinit

Dim X As Byte , Slave As Byte


Do
Debounce Pind.5 , 0 , Key , Sub
Config Twi = 100000
I2cstart
I2cwbyte &H41
I2crbyte X , Nack
Waitms 500
I2cstop

If X < 1 Then
Portb.0 = 1
End If

End
Wait 1
Loop

Sub Key
Portb.0 = Not Portb.0
End Sub
End


Kann mir jemand helfen, Die Adresspins, A2-A0 sind auf GND gezogen, die Taster schalten auf GND.
Die Displaysteuerung befindet sich in einem anderem Programm. Ich will insgesamt meine Zimmersteuerung erweitern, diese wertet bisher nur RC5 aus, es funktioniert daher nur I2C, da alle anderen Ports Belegt sind.

Ich hoffe jemand weiß, welchen Fehler ich gemacht hab.
 
Hallo likevista !

Willkommen im AVR-Praxis Forum! :ciao:


Ich habe mir deinen Programmcode mal angesehen und frage mich gerade, ob das nur ein Auszug aus einem Programm ist.

Zum Einen fehlt die Controllerangabe und zum Anderen sind einige "Merkwürdigkeiten" vorhanden. :wink:
Da gehe ich aber nun mal von aus, dass du die hier nur beim Kopieren vergessen hast.
Auf Grund der Angaben PORTC.4 und PORTC.5 wird es sich wohl um einen Mega8 handeln.

Du solltest allerdings noch $lib "i2c_twi.lbx" einfügen, damit auch die "eingebaute" TWI-Hardware im AVR verwendet wird.
Fehlt diese Angabe, dann wird TWI nur per Software emuliert.

Wenn ich das richtig interpretiere, dann möchtest du mit dem Taster an PIND.5 deine LED an PORTB.0 gern wieder ausschalten..... wenn sie vorher geleuchtet hat.
Dies könntest du allerdings auf eine andere Art und Weise erledigen.
Ich finden deinen Ansatz dafür nicht so gelungen.

Nun schauen wir aber mal auf die DO-LOOP Schleife:
Code:
Do
Debounce Pind.5 , 0 , Key , Sub
Config Twi = 100000
I2cstart
I2cwbyte &H41
I2crbyte X , Nack
Waitms 500
I2cstop

If X < 1 Then
Portb.0 = 1
End If

End
Wait 1
Loop

Das "CONFIG TWI" gehört in den Rumpf des Programms...... und nicht in die Arbeitsschleife!


Dann folgt die Abfrage des PCF mit der "Leseadresse", das lokale Abspeichern des ausgelesenen Bytes und dem Hinweis dass keine weiteren Daten mehr benötigt werden (NACK) und dann.......
Dann folgt eine Pause von 500ms? :hmmmm:
Das würde ich erst einmal entfernen, denn der BUS muss nicht soooo lange auf die Stopp-Bedingung warten.

Nun folgt die Auswertung deines Byte X !
Die Auswertung finde ich auch nicht so gelungen.
Hast du die Möglichkeit dir die Variable X mal anzeigen zu lassen? Vielleicht auf einem LCD oder per RS232?


Nun folgt ein END in der Arbeitsschleife......
Das ist nicht in Ordnung!
Das END (für End Programm) kommt immer NACH dem LOOP und VOR den Subroutinen.

Apropos Subroutine....
Deine kleine Sub für den Taster kannst du auch mit einem GOSUB und RETURN realisieren.
Du musst sie also nicht extra deklarieren, als würdest du noch zusätzlich Variablen übergeben wollen.

Im Programm ändert sich bei DEBOUNCE dadurch gar nichts.
Nur das DECLARE.... im Rumpf kannst du dir sparen und die Sub sieht dann so aus:
Code:
Key:
Portb.0 = Not Portb.0
Return

Ich habe damit aber nicht gesagt, dass die Anweisungen in der Sub dadurch sinnvoller werden. :wink:


Ach so....
Die Namen "Slave" als Variable bzw. "Key" als Subroutine finde ich auch nicht gut gelungen.
Natürlich sind sie (noch) erlaubt und sind keine reservierten Wörter, aber sie ähneln sich doch ziemlich stark mit Programmbefehlen.
Allerdings hat es keinen Einfluss auf dein derzeitiges Programm.


Lange Rede kurzer Sinn....
Ändere dein Programm nach meinen Hinweisen und lass dir die Variable X mal anzeigen!
Danach kannst du deine korrekte Auswertung vornehmen und deine LED steuern. :wink:


Anschließend musst du noch dieses "Wait 1" in der Arbeitsschleife wegoptimieren.
Selbst bei einem Testprogramm kann das ziemlich nervig werden...... gerade weil du auch noch einen Tastendruck überwachen möchtest.


Grüße,
Cassio
 
Danke für die schnelle Hilfe, leider funktioniert es immer noch nicht.

Der Debounce war noch vom Testprogramm zuvor, ist jetzt aber geflogen.

Hier mein Überarbeiteter Code:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$lib "Lcd_i2c.lib"
$lib "i2c_twi.lbx"
Const Pcf8574_lcd = &H40

Ddrb = &B00000001
Ddrd = &B11011111
'Portd.5 = 1
Config Sda = Portc.4
Config Scl = Portc.5

'Config Twi = 100000     :dann funktioniert mein LCD nicht mehr
Dim _lcd_e As Byte
Dim X As Byte
Config I2cdelay = 1
Enable Interrupts
_lcd_e = 128

Do
I2cinit
I2cstart
I2cwbyte &H41
I2crbyte X , Nack
I2cstop

Waitms 100

Cls

Lcd ; X
Waitms 20

Loop

End

Das LCD gibt nur eine "1" aus, wenn ich die Varible belege ändert sich dies aber.

Sieht das Programm gut aus? Ich hab nochmal die Platine gemessen und mit der Lupe untersucht, half aber nicht.

Vielleicht sehe ich den Fehler nicht :mad:!
 
Hallo likevista!

Ehrlich gesagt weiß ich jetzt gerade nicht, was du eigentlich machen möchtest. :hmmmm:

Nur mal für mich zum Verständnis.....
Du hast ein 2x16 LCD am I2C-BUS und die Adresse des PCF8574 ist 40h (Standard-Adresse mit A0, A1 & A2 auf GND)!

Nun frage ich mich allerdings, warum möchtest du denn hinterher im Programm den PCF8574 für das Display manuell abfragen? :hmmmm:
Irgendwie ergibt das doch keinen Sinn, oder?


Ich überlege gerade, ob du vielleicht einen zweiten PCF8574 am BUS hast und du eigentlich den abfragen möchtest?
Wenn das so sein sollte, dann musst dem zweiten PCF8574 eine andere BUS-Adresse zuweisen.... also z.B. A0 auf Vcc.


Wie aber schon gesagt, momentan tappe ich etwas im Dunkeln was du eigentlich machen möchtest. :stupido2:
Scheint mir so, als bräuchte ich da noch mal ein paar Erklärungen..... oder stehe ich nur auf dem Schlauch?

Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)