5. Softwarebausteine Teil 2 (Stand: 7.12.2010)
zurück zu Teil_1
I2C_an_Station V1.1 an Ports unveränderte Station
Port-Erweiterung mit I2C der Station,
Relais schalten, Taster, LED (in Basic)
LCD_an_Station ,
Temperatur-Sensor DS 1631, I2C-Bausteine (Assembler) NEU
Suchprogramm I2C-Adressen der angeschlossenen Geräte
Weiter zu Softwarebausteine_Teil_3
Variable_in_RAM-Zelle freie Bytes nutzen NEU mit
RANDOMIZE
EEPROM_Variable Werte speichern, voll remanent
Schieberegister, Abschaltungen und Fehler speichern
Betriebsstunden je Tag, je Woche oder je Monat
Daten_komprimieren
Weiter zu Softwarebausteine_Teil_4
Tastatatur mit LED-Quittung der Station,
LED und LCD –Anzeigen des IO-Terminals
Einbindung Treiber IO-Teminal
Tastatur Applikationsboard, Methode der Fehleranalyse und Fehlerbeseitigung
LCD-Anzeige Applikationsboard mit Software Tastatur-Test und LCD
Fertige Programme: Tastatur, Zeichenvorrat LCD, byte , word, HEX-Zahl, ASCII ,
Relais schalten, Schrittsteuerung mit Wartezeit, Text- und Zahlenausgabe
5.2.1) Unveränderte
Station V1.1 mit I2C-Bus
Bei der Station ist der I2C-Bus nicht herausgeführt, deshalb wird an zwei Ports ein separater I2C-Bus aufgebaut, der in Basic und auch in Assembler betrieben werden kann.
Relais-Erweiterung und Taster-Abfrage mit I2C-Bus ist im Teil „Port-Erweiterung in Basic“ beschrieben. In Basic ergibt sich zwangsläufig ein langsames Verhalten.
Schneller und komfortabler ist es mit Treibern zu arbeiten. Als „Bremse“ enthalten die Treiber (Assembler) eine Verzögerungsschleife im Millisekunden-Bereich, weil die Station V1.1 Kondensatoren an den Ports enthält. Trotzdem kann man LCD-Anzeigen betreiben und innerhalb 0,5 Sekunden das Display beschreiben. Darüber hinaus ist der lesende Zugriff auf den I2C-Bus in Assembler für Temperatur-Sensoren und Schalter möglich.
Das Zeitverhalten des separaten I2C-Bus (Basic) wird folgend mit einem Oszillographen untersucht.
Die Zeitmarkierung zeigt, dass für ein Bit 7,76 ms gebraucht werden. Diese Zeit ist abhängig vom Umfang des Basic-Programms, weil hier die Ports mit Basic geschaltet werden. Die folgenden Messungen zeigen die Anstiegs- und Abfallzeit, die entscheidend sind für den I2C-Bus, der mit Assembler betrieben wird.
Die Zeitmarkierung zeigt die Anstiegszeit 40 us bei schreibendem Betrieb.
Die Zeitmarkierung zeigt die Abfallzeit 16 us bei schreibendem Betrieb.
Beim Schreiben wird der Port der Station aktiv sowohl von 0 auf 1 wie auch von 1auf 0 gesteuert. Die Verzögerung in einem Assembler-Programm muss also mindestens 56 us (40+16) beim Schreiben betragen d.h. zur Sicherheit 0,1 ms. Ein Byte benötigt dann ca. 1 ms bzw. es sind 10 000 Bit je Sekunde.
Beim Lesen ist die Zeit leider länger. Hat das Empfangsbit 0-Signal ist die Zeit zwar kurz, weil der Kondensator der Station über einen kleinen Widerstandswert entladen wird. Aber bei Empfangsbit 1-Signal bestimmt der Port dieses Signal mit dem Pullup-Widerstand 10 kOhm und dem Kondensator 100 nF. Die Zeitkonstante (Mutiplikation) beträgt 1 ms. Ein Byte benötigt also 10 ms. Die Lese-Verzögerung nach dem Clock-Signal muss 10-fach sein im Vergleich mit der Schreib-Verzögerung.
Mit dem folgenden Beispiel mit Basic-Bausteinen ohne Assembler kann man testen und auch bei „langsamen“ Anwendungen wie Heizungen Anlagen betreiben.
5.2.2)
Port-Erweiterung mit I2C-Bus (Basic ohne Assembler)
Die grundsätzliche Funktion vom I2C-Bus kann man bei der Basic-Version erkennen. Besser in der Anwendung ist die Version mit Assembler wie sie im nächsten Abschnitt beschrieben ist, besonders wenn viele I2C-Geräte wie LCD, Temperatursensoren und Relaisbausteine angeschlossen werden sollen.
Im folgenden Beispiel ohne Assembler ist an die Station über den separaten I2C-Bus eine Relaiskarte von cc-Tools angeschlossen. Die Relaiskarte wurde in ein Hutschienengehäuse eingebaut und direkt neben der Station angeordnet. Es werden die unveränderten Ports der Station und Basic verwendet. Wie sie sich an einem längeren Buskabel verhält, wurde nicht getestet.
Die Basic-Bausteine für I2C stammen von „Starbearer“ (siehe Linkliste) und wurden für diese Anwendung modifiziert.
Das Programm ist zum Testen eines angeschlossenen Bus-Teilnehmers geeignet z.B. durch langsamen Test-Takt von Hand und Beobachten der Antwortsignale.
Bei der Anwendung ist zu beachten, dass die Aktualisierung mit Basic nur etwa einmal je Sekunde je nach Programmumfang erfolgt.
Für langsame Anwendungen wie Relais schalten und Temperatur messen z.B. bei einer Heizung reicht das aus.
Die Relaiskarte enthält 5 Relais. Die freien Bits werden als Eingänge benutzt.
Erläuterung der Baustein-Adresse 01AAxxxR . Die Softwarebausteine wickeln Senden, Empfangen und die Adressierung ab.
Der Baustein PCF 8574 hat als Grund-Adresse 64 (0100) und 112 (0111) bei Typ PCF 8574A. Bei beiden Bausteintypen kann die Adresse um 2 bis 14 (xxx) erhöht werden.
Lesen bedeutet Daten vom Baustein holen, dafür wird Bit 0 (R) auf 1 (ON) gesetzt und diese Adresse auf den Bus gesetzt. Der angesprochenen Baustein sendet seine Daten z.B. Schaltersignale oder Temperaturen.
Schreiben bedeutet Daten an den Baustein senden. Dafür wird Bit 0 (R) auf 0 (OFF) gesetzt (Lesen = AUS bedeutet also Schreiben). Die Daten übernimmt der durch die Adresse angesprochene Baustein und dadurch werden z.B. Relais oder LED geschaltet.
define SCL port [1] ' Clock (ist nicht interner I2C)
define SDA port [2] ' Data (ist nicht interner I2C)
define AdresseRelaisKarte1 &B01001110 '= 78 'Adresse PCF8574 01001110
define
PAE byte [2] ' Prozess-Abbild
Eingänge
'für bit-Handling des byte PAE (Zwischenspeicher)
define PAEBit0 Bit[9]
define PAEBit1 Bit[10]
define PAEBit2 Bit[11]
define PAEBit3 Bit[12]
define PAEBit4 Bit[13]
define PAEBit5 Bit[14] ' Schalter
define PAEBit6 Bit[15] ' Schalter
define PAEBit7 Bit[16] ' Schalter
define
PAA byte [3] ' Prozess-Abbild
Ausgänge
'für bit-Handling des byte PAA (Zwischenspeicher)
define PAABit0 Bit[17] ' Relais 1
define PAABit1 Bit[18] ' Relais 2
define PAABit2 Bit[19] ' Relais 3
define PAABit3 Bit[20] ' Relais 4
define PAABit4 Bit[21] ' Relais 5
define PAABit5 Bit[22]
define PAABit6 Bit[23]
define PAABit7 Bit[24]
define Wert12 word[4] ' = Byte 7,8 Zwischenspeicher
define wert1 byte [7] ' Zwischenspeicher
define wert2 byte [8] ' Zwischenspeicher
define wert3 .....
weitere Definitionen wie in anderen Softwareteilen.
PAA = 255 ' Vorbesetzung Prozess-Abbild Ausgänge
#loop ' Programmanfang
(1) Abfrage der Eingänge erledigen die folgenden Routinen:
'Prozessabbild Eingänge setzen
wert2 = AdresseRelaisKarte1 'Adresse übergeben
gosub I2C_ReadModul '
Daten holen, Ablegen in Byte wert1
PAE = wert1 'Daten von Byte wert1 übernehmen
Achtung: Bei gemischter Verwendung von Eingängen und Ausgängen an einem Baustein, müssen im Prozess-Abbild PAA die Eingänge mit 1 gesetzt werden. Nur so kann der offene Taster ON melden und bei Schließen (gegen Ground) OFF melden.
PAAbit5 = ON : PAAbit6 = ON : PAAbit7 = ON ' Belegt mit Eingängen (für Abfrage ON setzen)
(2) Programm Beispiele für den Anwender
Im Kapitel Stolpersteine wird beschrieben wie ON in AUS und OFF in EIN gedreht wird.
(2.1) Taster an der Port-Erweiterung
LED1 = PAEbit5 ' mit Taster (gegen Ground) wird geschaltet
(2.2) Relais der Port-Erweiterung
PAAbit0 = (Temperatur > Grenzwert) 'Relais 1 schalten
PAAbit2 = ON 'Relais 3 schalten
(2.3) Taster an der Port-Erweiterung schaltet Relais der Port-Erweiterung
PAAbit1 = PAEbit6 'Relais 2 mit Taster (gegen Ground) schalten
(2.4) Das rückgemeldete Bit schaltet eigenen Port Ein und Aus
PAAbit7 = not PAEbit7 'Erzeugt Blinken einer LED an der Port-Erweiterung
(3) Schalten der Ausgänge erledigen die folgenden Routinen:
'Prozessabbild Ausgänge schreiben
wert2 = AdresseRelaisKarte1 'Adresse übergeben
wert1 = PAA 'Daten in wert
1 übergeben
gosub I2C_WriteModul '
Daten senden
Goto Loop ' zurück zum Anfang
(4) Unterprogramme ' I2C
#I2C_writeModul 'Schreiben PCF8574
gosub I2C_start
' Vor dem Aufruf wurde Adresse des Bausteins in Wert2
übergeben
wert2 = wert2 and &HFE ' bit0 = 0 bedeutet schreiben
gosub I2C_schreiben
' Vor dem Aufruf wurden Daten in Wert1 übergeben
wert2 = wert1
gosub I2C_schreiben
gosub I2C_stop
return
#I2C_readModul 'Lesen PCF8574
gosub I2C_start
' Vor dem Aufruf wurde Adresse des Bausteins in Wert2
übergeben
wert2
= wert2 or &H01 ' bit0 = ON bedeutet lesen
gosub I2C_schreiben
gosub I2C_lesen
'Die geholten Daten stehen nun in Byte wert1
gosub NoAcknowledgment
gosub I2C_stop
return
'--------------------------------------------------------------------
'I2C Subroutines
#I2C_start
SDA = OFF : SCL = OFF : return
#I2C_stop
SDA = OFF : SCL = ON :
SDA = ON : return
#I2C_schreiben
for wert3 = 1 to 8
SDA = OFF 'Vorbesetzung Bitwert = 0
if (wert2 AND 128) = 128 then SDA = ON ' Bitwert setzen
pulse SCL ' Clock-Impuls setzen
wert2 = wert2 shl 1 '1 Bit nach links schieben
next
pulse SCL ' 9. Impuls
return
#I2C_lesen
wert1 = 0 'Vorbesetzung
deact SDA ' SDA wird Eingang
for wert3 = 1 to 8 ' nacheinander Bit 7 bis 0 lesen
wert1 = wert1 shl 1 '1 Bit nach links schieben
SCL = ON ' Clocksignal
if SDA then wert1 = wert1 + 1 ' aktuelles Bit übernehmen
SCL = OFF ' Clocksignal für nächstes Bit
next
return
#acknowledge
SDA = 0 : pulse SCL : return
#NoAcknowledgment
SDA = 1 : pulse SCL : return
5.2.3)
Port-Erweiterung mit I2C-Bus (Assembler) LCD
Die Anwender der kostengünstigen Station wünschen eine große LCD statt des i/o-Terminals anzuschließen ohne Eingriff in das Gerät (Garantie). Dieser Betrieb ist mit verzögertem Assembler möglich. Bei späterem Wechsel des Systems können die Baugruppen mit I2C-Bus weiter verwendet werden.
Das folgende Programm ist getestet mit einem LCD von ccTools Artikel-Nr.1002 und einem Temperatur-Sensor DS1631. Beides ist an die unveränderte Station V1.1 mit I2C-Bus an Port 1 und 2 angeschlossen.
Zur Fernbedienung über I2C-Bus kann die separate LCD mit einigen Tasten und LEDs in ein flaches Gehäuse eingebaut werden. Hierfür gibt es den Terminalbaustein (1042 von ccTools) sogar mit Interrupt-Ausgang zur Meldung einer Tastenbetätigung an einen Eingang der c-control. Die blaue LCD kann wegen ihres geringeren Strombedarfs eventuell direkt von der Station versorgt werden.
Selbstverständlich können auch andere I2C-Geräte z.B. Dimmer betrieben werden. Die übrigen Ports (Digital und Analog) stehen weiterhin zur Verfügung.
Das folgende Programm holt die Temperatur und zeigt sie auf dem Display zusammen mit Text und Uhrzeit. Die Geschwindigkeit zeigt die Anzeige jeder Sekunde.
Außerdem enthält der Assembler ein Suchprogramm der Geräteadressen. Das Programm gibt auf den PC-Bildschirm nacheinander die Adressen aus mit Angabe, ob ein I2C-Gerät geantwortet hat. Bei einer Fehleranalyse kann man damit sofort feststellen, ob die eingestellte Adresse der Hardware oder Software richtig ist.
Ein weiterer Vorteil des externen separaten I2C-Bus besteht darin, dass der interne I2C-Bus nicht gestört wird und die c-control dadurch nicht in Stopp geht. Der externe I2C-Bus arbeitet weiter (wie bei dem Suchprogramm) und man kann z.B. die Fehlermeldung „Sensor xyz gestört“ ausgeben.
(1) Suchprogramm für Fehleranalyse
define i2cAnfAdr 60 'Anfangs-Adresse Beispiel dezimal
define i2cEndAdr &H94 '=dez 148, Beispiel Hex
gosub
Scan 'Meldung der Adressen der I2C-Bausteine
' 255 = Gerät nicht vorhanden, 0 = Gerät antwortet
(2) LCD Text und Werte ausgeben,
Temperatur-Sensor lesen
sys
I2C_WriteAdr,AdresseLCD 'I2C-Adresse LCD
gosub setline1' Start Zeile 1
gosub space 'Beispiel Sonderzeichen, Buchstaben, usw.
sys LCD_PRINT,&H0D:print "Hallo! "; 'Textausgabe
'Beispiel Temperatur lesen vom I2C-Temperatur-Sensor
gosub
ReadTemp1631 'Temperatur holen nach wert1, wert2
'Fortsetzung LCD-Ausgabe
sys I2C_WriteAdr,AdresseLCD 'I2C-Adresse LCD
sys LCD_PRINT,&H0D:print "T=";
'Temperatur aus Zwischenspeicher ausgeben
gosub Zahl2pm 'zweistellige +- Zahl Byte wert1 ausgeben
'Kommastelle halbe Grad als Text ausgeben
If wert2=0 then goto xxx 'Kommastelle
sys LCD_PRINT,&H0D:print ".5";:goto xxx1
#xxx
sys LCD_PRINT,&H0D:print ".0";
#xxx1
gosub Gradzeichen ' Beispiel Sonderzeichen
'LCD Zeile 2 schreiben
gosub setline2 ' Start Zeile 2
sys
LCD_PRINT,&H0D:print "Zeile2: "; 'Text
wert1= hour : gosub Zahl2 'Uhrzeit ausgeben
gosub Doppelpunkt
wert1= minute : gosub Zahl2
gosub Doppelpunkt
wert1= second : gosub Zahl2
sys I2C_STOP
' Ende LCD
#ReadTemp1631 'Temperatur
holen nach wert1, wert2
sys I2C_WriteAdr,AdresseTemp1 'Temperatur-Sensor 1
'print "ack",wert3 'für Testzwecke aktivieren,
ack = 0 bedeutet ohne Fehler
I2CByte=&HAA ' Befehl Temperatur bereitstellen
sys
I2C_WRITE ' Befehl geben
sys
I2C_GETACK ' Befehl ausgeführt
'sys I2C_STOP 'für Testzwecke aktivieren
sys I2C_WriteAdr,AdresseTemp or
&H01
'print "ack",wert3 'für Testzwecke aktivieren,
ack = 0 bedeutet ohne Fehler
sys I2C_READ ' Temperatur (Vorkomma) holen
sys
I2C_SENDACK ' Befehl, 2.Wert bereit stellen
(Nachkomma)
wert1=I2CByte ' Temperatur
(Vorkomma) speichern
sys
I2C_READ '
Temperatur (Nachkomma) holen
sys
I2C_SENDNACK ' Befehl, weiteren Wert nicht bereit
stellen (fertig)
wert2=I2CByte ' Temperatur (Nachkomma) speichern
sys I2C_STOP
'Print "wert 1=";wert1," wert
2=";wert2;" wert 12=";wert12;" " 'für Testzwecke aktivieren
return
Die weiteren Bausteine siehe vollständiges Programm (siehe 4).
(3) Belegung (Schaltung)
Hardware: Anschluss des I2C-Bus an Station V1.1
SCL an P1 = port [1] SDA an P2 = port [2]
(Versorgung +5 V) und Ground
Die I2C-Geräte haben ebenfalls lediglich diese 4 Anschlüsse.
Geräte mit höherem Stromverbrauch z.B. LCD müssen eine eigene Versorgung mit +5 V erhalten.
Ground ist das gemeinsame Bezugspotential für SCL und SDA.
Software: Variable Byte 23 und 24 belegt der Assembler
Der Assembler ist verzögert wegen der Kondensatoren an den Ports.
Die Schreibgeschwindigkeit für ein LCD 2x16 Zeichen ist kleiner als 0,5 Sekunden.
Die Lesegeschwindigkeit ist stärker verzögert auf kleiner 0,3 Sekunden je Byte.
(4) Programm und Assembler zum Download
(4.1) Sys-Treiber holen und in PC speichern
Sys Treiber mit verzögertem I2C-Bus an Port 1 und Port 2
für unveränderte
Station (ohne Auslöten der Kondensatoren)
i2cLCD4.s19
(4.2) Hilfsprogramm holen und in PC speichern
Dieses
Hilfsprogramm vorab in c-control laden Vorab_Sys_laden.bas und danach eines der folgenden Programme
(4.3) LCD 2x16,
Temperatur-Sensor DS 1631, Suchprogramm I2C-Adressen StationV1.1.bas
(4.4) Das folgende Programm enthält Testfunktion für 2
Relaisbausteine von ccTools (Artikel 1805),
zusätzlich Datum und Uhr stellen, Wochentag ohne Funkuhr,
Berechnung Ostern, Rosenmontag, Buß- und Bettag
LCD 2x16, Relaisbaustein, Suchprogramm I2C-Adressen StationV1.1Relaisbaustein.bas
Andere Vorgehensweise beim Laden und Auskommentieren
(einmaliges Übertragen) des Treibers (Assembler) siehe Teil 4.
'------ Ende
LCD I2C-Bus -----------------------------------------
------------------------------------- ENDE Softwarebausteine Teil 2 ------------ nach_oben
zurück zu Softwarebausteine_Teil_1 weiter zu Teil_3 Teil_4 Startseite