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.

nach_oben

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)

nach_oben

(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

nach_oben

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 

Kostenlose Zähler und Statistiken für Ihre Website bei www.motigo.com