PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C: PCF 8574



fitec
22.01.2009, 15:43
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:


$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

pacer_one
22.01.2009, 16:04
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?

Neutro
22.01.2009, 16:31
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

fitec
22.01.2009, 16:47
@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.

fitec
22.01.2009, 16:58
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)

pacer_one
22.01.2009, 17:39
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.

repi64
22.01.2009, 21:25
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.