Theorie:
Technische VoraussetzungenFunktionen:
Allgemeine Funktionen (für alle Sensoren):
rw_frame()
ssa()
ssg()
Funktion für T-23-100, ADC-10, PIO-4 und PPIO-4:
rwport()
Funktion für T-23-100:
stemp()
Funktion für LCD-2x8:
wlcd()
Funktionen übernommen und adaptiert aus "twbus.c2" von Conrad:
Funktion für ADC-10:
get_volts()
Funktionen für IR-RMT:
rc5_mode()
rec80_mode()
get_ir_data()
send_ir_data()
Funktionen für F/E-CNT:
get_freq()
get_events()
Funktionen für T-23-100, ADC 10, und PIO 4:
PIO_init()
PIO_on()
PIO_off()
PIO_in()
Beschreibung Nach oben
Das Modul twbs.c2 ist ein Treiber für alle Sensoren am 2W - Bus
Einfügen als System-Modul
Nach oben
Die Datei twbs.c2 in das Verzeichnis .\CControl2\Lib
kopieren und in der Datei modules.txt
die Zeile twbs.c2 unterhalb von mem.c2, str.c2 und twb.c2 einfügen.
Ein zusätzliches Ausrufezeichen unmittelbar nach einem Modulnamen in modules.txt
bestimmt,
daß das Modul in jedem neuen Projekt von Anfang an aktiviert wird.
Technische Voraussetzungen: Nach oben
*) Jeder Sensor hat am Bus seine eigene Adresse, die nur einmal vergeben werden darf.
*) Die Adresse 32 (hex 0x20) ist in "twbs.c2" für das 2WB-Modem reserviert,
natürlich darf deshalb kein Sensor mit dieser Adresse versehen werden.
*) Die Adresse 85 (hex 0x55) ist für Sensoren mit gestecktem Jumper vorgesehen,
kann also nicht eingesetzt werden, wenn mehr als ein Sensor am Bus benutzt wird.
*) Zur Adress-Programmierung eines Sensors muss an diesem der Jumper gesetzt werden,
einmal die Funktion "twbs.ssa(adr)" mit der gewünschten Sensoradresse aufgerufen werden,
dann wird der Jumper entfernt.
Und dann wird (OHNE JUMPER) derselbe Aufruf von "twbs.ssa(adr)" nochmals wiederholt,
denn erst danach behält der Sensor seine Adresse.
Ein Entfernen des Sensors vom Bus ist bei dieser Vorgehensweise nicht nötig !
*) Hat man mehrere Sensoren am Bus zu programmieren, steckt man auf ALLE den Jumper,
entfernt ihn aber NUR AUF DEM, der die gesendete Adresse kriegen soll.
Dann wird der Aufruf ein zweites mal wiederholt, wie oben beschrieben.
Danach kann der nächste Sensor programmiert werden, usw., bis alle fertig sind.
*) Ein Kommando an einen Sensor wird im Treiber nicht direkt auf Gültigkeit geprüft,
dies muss innerhalb des Programmes geschehen.
Dazu dient der Aufruf der Funktion "twbs.ssg(adr)", um die Sensorgruppe zu ermitteln.
Jede Sensorgruppe hat auch spezielle Kommandos, die andere nicht haben.
Es gibt aber auch gemeinsame Kommandos wie zum Beispiel "Send Sensor Group" oder
"Set Sensor Adress".
Ein Aufruf eines falschen Kommandos führt zu unvorhersehbaren Ergebnissen.
Ein PIO-4-Sensor kann zB. keine Temperatur zurückmelden...
*) Fehler am 2W-Bus melden die Treiberfunktionen mit Rückgabewerten oberhalb von 2000:
2001 ... Timeout (wahrscheinlich kein Sensor mit der Adresse vorhanden)
2002 ... Fehlerhafter Antwortstring
2003 ... falsche Modemadresse
2004 ... falsche Sensoradresse
2005 ... falsche Prüfsumme
*) Fehler kommen immer wieder vor, sie bedeuten aber nicht unbedingt, dass ein Defekt
vorliegt. Besonders bei längeren Leitungen kann es immer wieder zu Einstreuungen
kommen. Wenn zB. eine Neonleuchte in der Nähe eingeschaltet wird, oder andere
Verbraucher, die an der gleichen Stromversorgung wie die CC2 hängen.
Ein gutes Programm handelt diese Fehler korrekt ab, und liest den Sensor später
eben nochmals aus.
Funktionen:
rw_frame Nach oben
function rw_frame(byte ID, byte ADR, byte D2, byte D1, byte D0) returns int
Die Funktion rw_frame() sendet ein Datenframe, empfängt die Antwort und prüft auf Fehler.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
Alle anderen Funktionen rufen diese zur eigentlichen Kommunikation auf.
ID | Kommando an den Sensor |
ADR | Adresse des Sensors |
D2 | Datenbyte 2 |
D1 | Datenbyte 1 |
D0 | Datenbyte 0 |
ssa() Nach oben
function ssa(byte ADR) returns int
Mit Set Sensor Adresse ssa() wird dem Sensor mit dem Jumper eine neue
Adresse zugewiesen.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des Sensors |
ssg() Nach oben
function ssg(byte ADR) returns int
Die Funktion Send Sensor Group ssg() liest die Sensor-Gruppe und gibt
diese zurück.
Der Antwortwert bei Fehlern ist ein Wert über 2000.
ADR | Adresse des Sensors |
rwport() Nach oben
function rwport(byte ADR, bate MASK, byte DATA) returns int
Die Funktion Read Write Port rwport() liest und schreibt die
Digitalports der Sensoren.
Die Antwort ist der Eingangswert, bei Fehlern aber ein Wert über 2000.
ADR | Adresse des Sensors |
MASK | Bitmaske, 0 = Eingang, 1 = Ausgang (Bei PPIO muss dieser Wert immer 0x0F sein !) |
DATA | Ausgangswert, 0 = Low, 1 = High |
stemp()
Nach oben
function stemp(byte ADR) returns int
Die Funktion Send Temp Data stemp() liest Die Temperatur in
Zehntelgraden aus.
Die Antwort ist die Temperatur, bei Fehlern aber ein Wert über 2000.
ADR | Adresse des Sensors |
wlcd()
Nach oben
function wlcd(byte ADR, byte D2, byte D1, byte D0) returns int
Die Funktion Write LCD wlcd() überträgt bis zu zwei Zeichen ins LCD
des 2W-Displays.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des 2W-Displays |
D2 | Subcommand (Details siehe ab Seite 11 der Beschreibung des 2W-Displays) |
D1 | Datenbyte 1 |
D0 | Datenbyte 0 |
get_volts()
Nach oben
function get_volts(byte ADR) returns int
Die Funktion get_volts() liest den Spannungswert des Sensors aus.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
Die Übergabe des Spannungswertes erfolgt in der globalen Variable twbs.value !
ADR | Adresse des Sensors |
rc5_mode()
Nach oben
function rc5_mode(byte ADR) returns int
Die Funktion rc5_mode() aktiviert für den IR-RMT den RC5 - Modus.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des IR-RMT |
rec80_mode()
Nach oben
function rec80_mode(byte ADR) returns int
Die Funktion rec80_mode() aktiviert für den IR-RMT den REC80 - Modus.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des IR-RMT |
get_ir_data()
Nach oben
function get_ir_data(byte ADR) returns int
Die Funktion get_ir_data() liest empfagne IR - Daten vom IR-RMT aus.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
Die Übergabe der IR - Daten erfolgt in der globalen Variable twbs.value !
ADR | Adresse des IR-RMT |
send_ir_data()
Nach oben
function send_ir_data(byte ADR, byte IRADR, byte IRCMD) returns int
Die Funktion send_ir_data() übergibt zu sendende IR - Daten an den IR-RMT.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
Die Übergabe der IR - Daten erfolgt in der globalen Variable twbs.value !
ADR | Adresse des IR-RMT |
IRADR | Daten für IR-ADR (Details siehe ab Seite 11 der Beschreibung des IR-RMT) |
IRCMD | Daten für IR-CMD |
get_freq()
Nach oben
function get_freq(byte ADR) returns int
Die Funktion get_freq() liest den Frequenzwert in Hz aus dem F/E-CNT Sensor.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
Die Übergabe des Frequenzwertes erfolgt in der globalen Variable twbs.value !
ADR | Adresse des Sensors |
get_events()
Nach oben
function get_events(byte ADR) returns int
Die Funktion get_events() liest die Impulszahl aus dem F/E-CNT Sensor.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
Die Übergabe des Impulszahl erfolgt in der globalen Variable twbs.value !
ADR | Adresse des Sensors |
PIO_init()
Nach oben
function PIO_init(byte ADR) returns int
Die Funktion PIO_init() setzt alle Ports des Sensors auf Eingänge.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des Sensors |
PIO_on()
Nach oben
function PIO_on(byte ADR, byte PORT, byte PDATA, byte PDIR) returns int
Die Funktion PIO_on() setzt einen speziellen Port des Sensors auf High.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des Sensors |
PIO_off()
Nach oben
function PIO_off(byte ADR, byte PORT, byte PDATA, byte PDIR) returns int
Die Funktion PIO_off() setzt einen speziellen Port des Sensors auf Low.
Antwortwert ist 0x00 oder bei Fehler ein Wert über 2000.
ADR | Adresse des Sensors |
PIO_in()
Nach oben
function PIO_in(byte ADR, byte PORT, byte PDATA, byte PDIR) returns int
Die Funktion PIO_in() setzt einen speziellen Port des Sensors auf Input und liest
ihn aus.
Antwortwert ist der Portwert oder bei Fehler ein Wert über 2000.
ADR | Adresse des Sensors |
Autor: Martin Binder
Mail: martin.binder@nusurf.at
Erstellt: 09.05.2004