Forum: Mikrocontroller und Digitale Elektronik Problem mit Portexpander und I²C


von Andreas H. (raucher91)


Lesenswert?

Ich hoffe ihr könnt mir helfen.

und zwar wollte Ich mit einem PCA9554AD Portexpander und einem LM75 
Arbeiten und das ganze über I²C.mein Problem es funktioniert weder der 
LM75 abzufragen noch den PCA9554AD.

Ich habe einen 4,7kOhm PullUp an SDA und an SCL. sowie einen 100n 
Kondensator an VCC/GND.

Adresse vom PCA9554AD ist 01110000
ich habe es auch mit 01000000 Probiert aber erfolglos

mein Code dazu:
1
 
2
$regfile = "m644pdef.dat"
3
$crystal = 16000000
4
'$sim                                                        'Frequenz 16MhZ
5
$baud = 2400                                                'Baudrate Com1 zum PC
6
$baud1 = 2400
7
$timeout = 20000000                                         'Timeout für Serial In 10 Sekunden
8
$hwstack = 90
9
$swstack = 64
10
$framesize = 64
11
$lib "i2c_twi.lib"
12
'##############################   1²C Bus     ##########################
13
Config Sda = Portc.1                                        'Pin23
14
Config Scl = Portc.0
15
Config Portc.1 = Output
16
Config Portc.0 = Output                                     'Pin22
17
I2cinit
18
Waitms 200
19
''''Portexpander 1 Konfigurieren
20
 I2cstart
21
 I2cwbyte &B01110000
22
 I2cwbyte 3
23
 I2cwbyte &B00000000
24
 I2cstop
25
 Waitms 25
26
If Err = 0 Then
27
Print #2 , "Port1 OK adresse 0111"
28
Else
29
Print #2 , "Port1 Fehler"
30
End If
31
32
 I2cstart
33
 I2cwbyte &B01000000
34
 I2cwbyte 3
35
 I2cwbyte &B00000000
36
 I2cstop
37
 Waitms 25
38
If Err = 0 Then
39
Print #2 , "Port1 OK adresse 0100"
40
Else
41
Print #2 , "Port1 Fehler"
42
End If
43
Const Port1_write = &B01110000
44
Const Port1_read = &B01110001
45
'############################# Anzeige Testen ########################
46
Anzeige_test:
47
Print #2 , "Anzeige Test2"
48
 Dim Z As Integer
49
 Z = 0
50
 Do
51
 I2cstart
52
 I2cwbyte Port1_write
53
 I2cwbyte 1
54
 I2cwbyte &B11111111
55
 I2cstop
56
 If Err = 0 Then
57
Print #2 , "Port1 OK"
58
Else
59
Print #2 , "Port1 Fehler"
60
End If
61
 Wait 1
62
 I2cstart
63
 I2cwbyte Port1_write
64
 I2cwbyte 1
65
 I2cwbyte &B00000000
66
 I2cstop
67
 If Err = 0 Then
68
Print #2 , "Port1 OK"
69
Else
70
Print #2 , "Port1 Fehler"
71
End If
72
 Print #2 , "Z= " ; Z
73
 Z = Z + 1
74
 Waitms 500
75
 Loop Until Z = 8
76
77
 Locate 3 , 1
78
 Lcd "Erfolgreich"
79
80
Return

von Pd G. (pdg)


Lesenswert?

Bei I2C setzt sich das Adressbyte aus der 7bit-Adresse (bit7...1) und 
dem R/_W-bit (bit0) zusammen.
Beim PCA9554A besteht die 7bit-Adresse aus den festen oberen 4bit (0100) 
und den an A2..A0 liegenden 3bit.
Bei deinem Adressbyte 01000000 mürdest du also wegen des bit0=0 in den 
PCA9554A schreiben und ihn so z.B. mit weiteren Bytes konfigurieren, 
wenn dessen pins A2=A1=A0 auf 0 liegen.
Beim LM75 ist es ähnlich, nur müssen dort die oberen 4bits mit 1001 
kodiert sein.

von Andreas H. (raucher91)


Lesenswert?

Hey Danke für die Info. Könntest du mir evtl. Sagen wie mein Code 
richtig sein muss dass Ich mit meinem Projekt weiter komme?
Wäre echt Supi

von Andreas H. (raucher91)


Lesenswert?

Also versteh ich des dann richtig dass Ich nur 7 bot senden muss oder?

von Pd G. (pdg)


Lesenswert?

Nein, du musst natürlich 8bit senden, nur setzen die sich eben aus 
Adressteil und R/W-Bit zusammen. Letztlich musst du das Timing 
nachbilden, das im Datenblatt von beiden I2C-Bausteinen genannt wird - 
also Initialisierung und/oder Programmierung und/oder Auslesen.
Alles in allem wird kein Weg an ausführlichem Lesen der Datenblätter 
vorbeiführen.

Ohne jetzt deinen Code gelesen zu haben, möchte ich dir aber auch ans 
Herz legen, gelegentlich die Suchfunktion (Sufu) zu nutzen, wo es z.B. 
für den LM75 schon Unmassen Threads gibt, z.B.:
Beitrag "LM75 mit Atmaga 8 auslesen und auf LCD ausgeben [c]"

von Andreas H. (raucher91)


Lesenswert?

Also SuFu hab ich benutzt genauso wie Google. Darum hab ich mittlerweile 
ja 4 verschiedene Codes die laut Internet Funktionieren. Und meine 8 bit 
setzten sich ja zusammen aus Adresse und read bit. Und trotzdem 
funktioniert es nicht

von Prof. Chaos (Gast)


Lesenswert?

Versuch doch mal einen Code zu verstehen statt Copy-Paste... Dann merkst 
du sicher auch was schief läuft...

von Wolfgang A. (Gast)


Lesenswert?

Andreas Hermann schrieb:
> Also versteh ich des dann richtig dass Ich nur 7 bot senden muss oder?

Du musst den Unterschied zwischen I2C-Adresse und dem Adressierungsbyte 
lernen. In IMHO jedem Datenblatt von I2C-Komponenten ist das 
detailiert dargestellt. Und du musst natürlich auch wissen, was deinen 
Library Funktionen übergeben werden muss. Das steht in der 
Funktionsbeschreibung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.