-
I²C: PCF 8574
Hallo,
ich habe den PCF 8574 P (von reichelt).
Mein Problem ist, dass er nicht reagiert.
Ich benutze einen ATMEGA32, 16Mhz.
Das ist mein code:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Config Scl = Portc.0
Config Sda = Portc.1
Config I2cdelay = 10
Const Adresswrite = &H4E 'Slaveadresse
Config Porta = Output
Dim X As Byte
Dim Wert As Byte
Declare Function Pcfwrite(byval Adress As Byte , Wert As Byte) As Byte
I2cinit
X = 1
Wert = &B01010101
Print "Atmega32 I2C Master"
Waitms 1000
Print "Motoren anschalten"
Waitms 1000
X = Pcfwrite(adresswrite , Wert)
Do
If X <> 0 Then
Print "I2C Fehler"
Else
Print "Übertragung erfolgreich"
End If
Waitms 500
Loop
End
Function Pcfwrite(byval Adresswrite As Byte , Wert As Byte) As Byte
I2cstart
I2cwbyte Adresswrite
I2cwbyte Wert
I2cstop
Pcfwrite = 0
End Function
Ich habe die Pins A0-A2 alle auf vcc, habe vorher 10K Pull-ups drangehabt, dann habe ich allerdings gehört da müssten keine dran.
Ich komme dann auf die Adresse:
01001110 oder auch 4E.
Trotzdem funktioniert das ganze nicht.
Vielleicht kann mir ja jemand helfen.
Mfg
Nils
-
Ich hab jetzt keine Ahnung von Bascom, aber Pullups sollten schon rein. Üblicherweise 10K. Ob die internen Innenwiderstände in der Betriebsart TWI funktionieren weiß ich nicht. Diese sind aber mindestens doppelt so hoch.
Hast du ein Oszilloskop zur Verfügung?
-
Hallo,
Versuche mal den folgenden Code, ist allerdings für einen Mega8
der mit 4MHz läuft:
$regfile = "m8def.dat"
$crystal = 4000000
Config Sda = Portc.4
Config Scl = Portc.5
Config I2cdelay = 10
'Config Pind.6 = Output
Const Pcf8574write = &H4E
Const Pcf8574read = &H4F
'Set Portd.6
'Waitms 1000
'Reset Portd.6
'Waitms 1000
Do
I2cstart
I2cwbyte Pcf8574write
I2cwbyte &B00000001
I2cstop
Waitms 250
I2cstart
I2cwbyte Pcf8574write
I2cwbyte &B00000010
I2cstop
Waitms 250
loop
end
Ich hoffe das dir das etwa weiterhilft....
Gruß
Neutro
-
@pacer_one: Also an Sda und Scl habe ich 4,7K Pull-Ups dran.
Nur an den Datenleitungen A0-A2 eine mehr, hat mir jemand gesagt die sollten weg.
@Neutro: Mhm, der code ist nicht wirklich anders als meiner oder?
Trotzdem danke.
-
Hallo noch mal,
ich hab den Fehler gefunden, es war eine Lötbrücke auf der Platine die ich übersehen habe. Das mit den Pull-Up Widerständen vor den Adresspins würde mich schon mal interressieren.
Mfg Nils
Ach ja Oszi, davon kann ich mom. nur träumen... (Bin noch Schüler)
-
meistens haben die Bausteine einen Open-Kollector Ausgang.
Damit die Leitung im Ruhezustand auf high gehen kann, benötigt man Pullups.
Der Widerstand darf allerdings nicht zu klein sein, sonst fließt ein zu hoher Strom durch die OC-Transistoren. Was allerdings passiert wenn man den Widerstand zu 'hoch' wählt, weiß ich auch nicht.
Eine Drahtbrücke war übrigens auch bei mir der Fehler, leider will mein Temperatursensor aber immer nocht nicht :-(
Sorry, da hab ich mich wohl verlesen. Bei den Adresspins wird meines Wissens nach kein Pullup benötigt. Manche vergessen ihn aber auf Takt- und Datenleitung.
-
Die Adresspins kannst du direkt an +5V oder GND legen.
An SDA und SCL brauchst du die Pullups.
Zum ansprechen des PCF8574 reich aber auch schon der I2CSEND bzw. der I2CRECEIVE Befehl.
Schau mal in die Help nach.