Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Samstag, 11. März 2006, 13:50

Programm 9: Der I2C-Bus

Wie angekündigt, hier das kleine Test-Programm für den I2C-Bus.

Es lässt die ersten vier LED´s am PCF8574P blinken und fragt die letzten vier Bit als Eingänge ab, also müssen die Jumper entsprechend gesteckt sein.

Außerdem wird der Status des I2C-Busses zur Laufzeit permanent überwacht, das ganze wird auf unserem Display ausgegeben.

Der I2C-Bus ist ein Master-Slave-System. Jedem Teilnehmer ist eine eindeutige Adresse zugewiesen, praktisch alle I2C-Chips haben eine feste Basis-Adresse und einen einstellbaren Bereich.

Beim PCF8574P ist die Basisadresse 64, plus dem über die Jumper adressierten Wert - siehe Schaltplan.

Viel Spaß beim Ausprobieren! Wenn Fragen sind - immer raus damit.

Viele Grüße

Torsten

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Programm 9: Der I2C-Bus
'
'Hardware:
'LCD-Display an Port B
'I2C-Bus an C.4 (SDA) und C.5 (SCL)
'PCF8574 8-Bit Port-Expander für I2C-Bus:
'-> Vier LED´s an P0 bis P3
'-> Vier Schalter an P4 bis P7
'
'11.03.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (4Mhz)
$crystal = 8000000

'Einbindung der LCD-Bibliothek für ein 2-Prozessor-Display
$lib "lcd4e2.lbx"

'Einbindung der I2C-Bibliothek
$lib "i2c_twi.lbx"

'======================================================
'Konfigurationen
'======================================================
'Angabe der Display-Größe
Config Lcd = 20 * 4

'Angabe der I2C-Bus-PIN´s (mit i2c_twi.lbx nicht veränderbar!)
Config Sda = Portc.4
Config Scl = Portc.5

'Konfiguration der Ports
Config Portd = Output

'======================================================
'Deklarationen
'======================================================
'Variable für Umschaltung der Displayhälfte - Namen so lassen!
Dim ___lcde As Byte

Dim I2c_state As Bit
Dim Portpcf_in As Byte
Dim Portpcf_out As Byte
Dim Portpcf_old As Byte

Dim N As Byte

'======================================================
'Initialisierungen
'======================================================

'Schreib-Adresse für PCF8574P - einstellbar mit Jumpern
Const Pcf_w_adr = 64

'Lese-Adresse für PCF8574P - immer Schreib-Adresse + 1
Const Pcf_r_adr = Pcf_w_adr + 1


Portd = &B11111111
Portpcf_out = &B11111010

'Anschaltung des I2C-Busses
I2cinit

'======================================================
'Aufbau der LCD-Maske
'======================================================
'Umschaltung auf die obere Hälfte
___lcde = 0

'Das Display löschen
Cls
'Text der ersten Zeile (max. 27 Zeichen!)
Locate 1 , 1
Lcd "*** AVR EINSTEIGERKURS  ***"

'Text der zweiten Zeile
Locate 2 , 1
Lcd "*****  I2C-BUS-TEST   *****"

'Den Cursor ausschalten
Cursor Off

'Umschaltung auf die untere Hälfte
___lcde = 1

Cls

Lcd "I2C-Status: "

'Den Cursor ausschalten
Cursor Off



'======================================================
'Hauptprogramm-Schleife
'======================================================

Do

If I2c_state = 1 Then
   'Eingangsbyte vom PCF8574 lesen
   I2cstart
   I2cwbyte Pcf_r_adr
   I2crbyte Portpcf_in , Nack

   'Ausgangsbyte zum PCF8574P schreiben
   I2cstart
   I2cwbyte Pcf_w_adr
   I2cwbyte Portpcf_out
End If

'Der I2C-Bus liefert ein ERR-Bit bei Schreibfehler
If Err = 1 Or I2c_state = 0 Then Gosub I2c_statecheck

'Eingangsbyte aufs Display schreiben
If Portpcf_in <> Portpcf_old Then
   Portpcf_old = Portpcf_in
   Locate 2 , 1
   Lcd Bin(portpcf_in)
End If

'Statusänderung der PCF8574-Ausgänge
For N = 0 To 3
   Toggle Portpcf_out.n
Next N

'Status-Life-Bit für Hauptprogramm
Toggle Portd.0
Waitms 500

Loop



'Programmende (nur formal)
End



'======================================================
'Subroutine: I2C-Bus prüfen
'======================================================
I2c_statecheck:
   I2cstart
   I2cwbyte Pcf_w_adr
   If Err = 1 Then
      I2c_state = 0
      Portpcf_in = 0
      Locate 1 , 13
      Lcd "FEHLER   "
   Else
      I2c_state = 1
      Locate 1 , 13
      Lcd "OK       "
   End If
Return


[SIZE=3]Topics:

- Die Adressierung des Chips ändern

- Eingänge und Ausgänge tauschen (die letzten vier LED´s blinken lassen)

[/SIZE]
[SIZE=4]www.zuendapp.net - die grösste Zündapp-Community im Internet! :ok:[/SIZE]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Torsten_G« (12. März 2006, 21:27)