Einfügen als System-Modul
Konstanten
Funktionen: |
System-Funktionen: _setReg _getReg _setRate _put _get _rxd _ready _print _printa _send _senda _receive _receivea |
Beschreibung Nach oben
Mit Hilfe des Moduls i2ccom.c2 wird der Baustein I2C-COM von
CCTools
angesteuert, welcher das Betreiben von vollwertigen seriellen Schnittstellen
(RS232)
am I²C-Bus erlaubt.
Dieses Modul basiert auf dem ASM-Treiber i2ccom.hex welcher in Segment 3
geladen werden muß.
Alle Funktionen von i2ccom.c2 sind über das neue, eigene I²C-Capture
des Moduls
i2c.c2 ab V1.2 gecaptured. Dies geschieht teilweise im ASM-Treiber i2ccom.hex
und im Modul selbst.
Für dieses Capture sind die aktuelle Version von i2c.c2 ab V1.2 und der
dazugehörige
ASM-Treiber capture.hex nötig, welcher auch vom Modul cap.c2
genutzt wird
Einfügen als System-Modul Nach oben
Die Datei i2ccom.c2 in das Verzeichnis .\CControl2\Lib
und in der Datei modules.txt
die Zeile i2ccom.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.
Außerdem muß die Datei i2ccom.hex mit den nötigen Systemroutinen mit dem Downloadtool
in die C-Control II
geladen werden.
Der Systemtreiber i2ccom.hex belegt den Adressbereich 0xD1B0 bis 0xD533
im Segment 3 des Flash. (900 Byte)
Funktionen:
Daten PCF festlegen Nach oben
function setDataPCF(byte device)
Mit dieser Funktion wird die Adresse des PCF8574 festgelegt,
der den Daten-Bus für I2C-COM stellt. Werden mehrere I2C-COM betrieben,
muß auf jedem Baustein die selbe Adresse für den Daten-PCF eingestellt
werden.
device | Daten-PCF-Adresse 0-7 = PCF8574, 8-15 = PCF8574A |
Schnittstelle definieren Nach oben
function defineCOM(byte Port, byte Ctrl, byte Sub)
Mit defineCOM() werden die Schnittstellen definiert. Es kann so
unabhängig
von den Bus-Adressen jedem I2C-COM-Baustein eine Portnummer zugewiesenwerden.
Es können bis zu 30 Schnittstellen definiert werden
Port | Portnummer, unter der die Schnittstelle angesprochen werden soll (1 bis 30) |
Ctrl | Kontroll-PCF-Adresse 0-7 = PCF8574, 8-15 = PCF8574A |
Sub | Sub-Adresse (Jumper SUB) 0 = Stellung 1-2 , 1 = Stellung 2-3 |
Schnittstelle initialisieren Nach oben
function initCOM(byte Port, byte autoflow) returns int
Mit der Funktion initCOM() wird die angegebene Schnittstelle
initialisiert.
Standardformat ist dabei 8N1. Andere Formate können mit setFormat()
eingestellt werden. Die Baudrate ist undefiniert und muß setBaudRate()
oder setspeed()
festgelegt werden.
Beim init kann noch festgelegt werden, ob die Automatische Flußkontrolle
verwendet
werden soll. Dies ist, wenn das an I2C-COM angeschlossene Gerät HW-Handshake
unterstützt(z.B. Modem, PC etc.), sehr zu empfehlen.
Es wird außerdem standardmäßig die Interrupt-Kontrolle so eingestellt, daß
bei
jedem empfangenen Zeichen ein Interrupt von I2C-COM ausgelöst wird.
Dieser kann z.B. mit Hilfe eines I/O-Ports ausgewertet werden, damit der
Baustein nicht
ständig mit rxd() abgefragt werden muß. Dies spart Traffic auf dem I²C-Bus.
Weitere Interruptereignisse können über das Register IER (setIER())
festgelegt werden.
Dazu sind jedoch näherer Kenntnisse des FIFO-Bausteins TL16C550C
von Texas-Instruments nötig. (Datenblatt)
Die Funktion gibt True(-1) zurück, wenn ein I2C-COM an der definierten
Schnittstelle
erkannt wurde, und False(0), wenn sich an dieser keines befindet.
Port | Portnummer der Schnittstelle (1 bis 30) |
autoflow | Automatisches Handshake 0 = deaktiviert, 1 = aktiviert |
Datenformat festlegen Nach oben
function setFormat(byte Port, byte format)
Mit dieser Funktion kann das Datenformat festgelegt werden mit welcher
die angegeben Schnittstelle arbeiten soll.
Im Modul i2ccom.c2 stehen eine Auswahl an vordefinierten Konstanten
zur Verfügung. Das Konfigurationbyte wird direkt in
das LCR-Register(Line-Control-Register) geschrieben.
Die genaue Bedeutung der einzelnen Bits kann dem Datenblatt zum
TL16C550C von Texas-Instruments nötig entnommen werden.
Port | Portnummer der Schnittstelle (1 bis 30) |
format | Konfiguration-Byte der Schnittstellenparameter |
Übertragunsrate festlegen Nach oben
function setBaudRate(byte Port, long speed)
function setspeed(byte Port, int speed)
Mit diesen beiden Funktionen kann die Übertragungsrate der RS232 festgelegt
werden.
Bei setBaudRate kann die Übertragungsrate direkt als numerischer Wert angegeben
werden, wobei bei setspeed ein Wert für die entsprechende Geschwindigeit
wie in hwcom.c2 und swcom.c2 angeben wird.
Wert | Baudrate | Wert | Baudrate | |
0 | 300 | 9 | 115200 | |
1 | 600 | 10 | 230400 | |
2 | 1200 | 11 | 460800 | |
3 | 2400 | 12 | 50 | |
4 | 4800 | 13 | 75 | |
5 | 9600 | 14 | 110 | |
6 | 19200 | 15 | 150 | |
7 | 38400 | 16 | 7200 | |
8 | 57600 | 17 | 28800 |
Port | Portnummer der Schnittstelle (1 bis 30) |
speed | Baudrate, je nach Funktion Wert oder direkte Baudrate |
Register Lesen Nach oben
function getIIR(byte
Port) returns byte |
//
Interrupt Identification Register // Interrupt Enable Register // Line Status Register // Modem Status Register // angegebenes Register Reg |
Port | Portnummer der Schnittstelle (1 bis 30) |
Reg | Register 0 bis 7 (siehe Datenblatt TL16C550C) |
Anmerkungen zu den Registern:
IIR - Interrupt Identification Register:
Anders als im Datenblatt angegeben wird Bit 0 invertiert
Register
setzen Nach oben
function setIER(byte
Port, byte Data) |
// Interrupt Enable Register // angegebenes Register Reg |
Port | Portnummer der Schnittstelle (1 bis 30) |
Reg | Register 0 bis 7 (siehe Datenblatt TL16C550C) |
Data | zu schreibendes Daten Byte (Bitmuster) |
Anmerkungen zu den Registern:
IER - Interrupt Enable Register:
Bit 2 muß immer gesetzt sein, da ansonsten der Datenempfang
nicht mehr funktioniert !
FCR - FIFO Control Register:
Bit 0 muß immer gesetzt sein, da sonst der FIFO deaktiviert wird und das
Senden und Empfangen nicht korrekt funktionieren kann!
Bit 3 muß ebenfalls gesetzt sein.
Bit 6 und 7 dürfen nicht gesetzt sein.
MCR - Modem Control Register:
Bei AutoFlow müssen Bit 1 und Bit 5 muß immer gesetzt sein,
da es ansonsten zu einem Pufferüberlauf kommen kann.
Bit 0 (DTR) muß bei einem Betrieb mit Modems gesetzt sein, da sonst
nicht gewählt werden kann oder nicht abgehoben wird.
Es ist so auch mit den meisten Modems möglich eine Verbindung
Hardwareseitung durch löschen des DTR-bits möglich.
Für DTR sollte jedoch die Funktion DTRenable() benutzt werden
LSR - Line Status Register:
MSR - Modem Status Register:
Diese Register sollten nicht beschrieben werden!
SCR - Scratch Register:
Dieses Register kann frei als Speicher benutzt werden.
Es wird während dem Init benutzt, um zu prüfen, ob sich ein
I2C-COM an der definierten Schnittstelle befindet.
DTRenable Nach oben
function DTRenable(byte Port, byte state)
Mit dieser Funktion kann die Modem-Steuerleitung DTR (Data-Terminal-Ready)
geschalten werden.
Diese Leitung wird für Modems als Freigabe benötigt.
Ist DTR low, hebt ein Modem nicht ab und es kannauch nicht gewählt werden.
Mit DTR kann auch ei Modem zum auflegen gezwungen werden, wenn es z.B.
nicht reagieren sollte.
Port | Portnummer der Schnittstelle (1 bis 30) |
state | True(ungleich 0) oder False(0) |
RTSenable Nach oben
function RTSenable(byte Port, byte state)
Mit dieser Funktion kann die Hardware Handshake Leitung RTS (Request-to-Send)
geschalten werden.
Ist AutoFlow aktiviert, wird so besimmt, ob das Automatische
Handshake nur für das Senden(RTS=low) oder für Senden und Empfangen(RTS=high)
gelten soll.
Port | Portnummer der Schnittstelle (1 bis 30) |
state | True(ungleich 0) oder False(0) |
AutoFlow
enable Nach oben
function AFenable(byte Port, byte state)
Mit AFenable() wird das Automatische Handshake aktiviert, welches
dafür
sorgt, daß die FIFO-Puffer nicht überlaufen.
Port | Portnummer der Schnittstelle (1 bis 30) |
state | True(ungleich 0) oder False(0) |
CTS
abfragen Nach oben
function getCTS(byte Port) returns int
Mit getCTS() wird die Handshakeleitung CTS(Clear-to-Send) abgefragt.
Es wird True(-1) zurückgegeben, wenn das angeschlossene Gerät bereit ist
Daten zu empfangen, und False(0) wenn dieses nicht brereit ist.
Ist AutoFlow aktiviert, wird automatisch erst gesendet, wenn über CTS
eine Freigabe vom angeschlossenen Gerät erfolgt.
Port | Portnummer der Schnittstelle (1 bis 30) |
Modem-Status-Leitungen
abfragen Nach oben
function getDSR(byte Port) returns int
function getDCD(byte Port) returns int
function getRI(byte Port) returns int
Mit diesen Funktionen können die Modem-Status-Leitungen DSR(Data-Set-Ready),
DCD(Data-Carrier-Detect) und RI(Ring-Indicator) abgefragt werden.
Es wird entweder True(-1) oder False(0) zurückgegeben.
Port | Portnummer der Schnittstelle (1 bis 30) |
Trailing
Edge Ring Indicator Nach oben
function getTERI(byte Port) returns int
Mit dieser Funktion kann erkannt werden, ob sich der Pegel
der Ring-Indicaor Leitung von low auf high geändert hat.
Dieses Bit wird nach dem Abfragen gelöscht. Es können so z.B.
Klingelzeichen gezählt werden.
Die Funktion gibt True(-1) zurück, wenn sich der Pegel geändert hat,
andernfalls False(0).
Port | Portnummer der Schnittstelle (1 bis 30) |
Sendebereitschaft prüfen Nach oben
function ready(byte Port) returns int
Mit ready() wird auf Sendebereitschaft geprüft.
Es wird True(-1) zurückgegeben, wenn der Sende-FIFO leer ist,
andernfalls False(0).
Alle Funktionen, die Daten senden, prüfen selbständig auf Sendebereitschaft
und warten ggf. solange bis gesendet werden kann.
Port | Portnummer der Schnittstelle (1 bis 30) |
Einzelnes Datenbyte senden Nach oben
function put(byte Port, byte Data)
Mit put() wird ein einzelnes Datenbyte/Zeichen gesendet.
Die Funktion wartet ggf. auf Sendebereitschaft.
Port | Portnummer der Schnittstelle (1 bis 30) |
Data | Datenbyte (0-255) |
Zeichenkette senden #1 Nach oben
function print(byte Port, string s)
Mit print() wird der Inhalt eines Strings gesendet.(Max. 30
Zeichen)
Die Funktion wartet ggf. auf Sendebereitschaft.
Port | Portnummer der Schnittstelle (1 bis 30) |
s | Zeichenkette |
Zeichenkette senden #2 Nach oben
function print2(byte Port, byte s[])
Mit print2() wird der Inhalt eines Strings oder einer
Bytepuffervariable gesendet.
Es sind somit möglich beliebig lange Strings gesendet.
Es wird bis zum ersten vorkommen des Wertes NULL(ASCII-Code 0) gesendet.
Der ASCII-Code 0 wird nicht gesendet.
Die Funktion wartet ggf. auf Sendebereitschaft.
Port | Portnummer der Schnittstelle (1 bis 30) |
s | Zeichenkette oder Byte-Puffer |
Byte-Puffer senden
Nach oben
function send(byte Port, byte buf[], int len)
Mit send() wird die angegebene Anzahl an Bytes einer
Bytepuffervariable gesendet.
Die Funktion wartet ggf. auf Sendebereitschaft.
Port | Portnummer der Schnittstelle (1 bis 30) |
buf[] | Byte-Puffer |
len | Anzahl der zu sendenden Bytes |
Steuerzeichen
Nach oben
function
ret(byte Port) |
// CR+LF senden (Enter/Return) // Tab senden // Clear Screen senden |
Mit diesen Funktionen können die Steuerzeichen CR+LF für einen
Zeilenvorschub(ASCII 13+10),
Tabulator (ASCII 9) und Clear Screen (ASCII 12) für Terminalprogramme gesendet
werden.
Diese Funktion warten ggf. auf Sendebereitschaft.
Port | Portnummer der Schnittstelle (1 bis 30) |
Auf Empfang prüfen
Nach oben
function rxd(byte Port) returns int
Mit rxd() wird geprüft, ob sich Daten im Empfangs-FIFO befinden.
Es wird True(-1) zurückgegeben, wenn sich Daten im FIFO befinden,
andernfalls False(0).
Port | Portnummer der Schnittstelle (1 bis 30) |
Empfangspuffer löschen
Nach oben
function flush(byte Port)
Mit flush() werden alle sich im Empfangs-FIFO befindenden Daten gelöscht.
Port | Portnummer der Schnittstelle (1 bis 30) |
Einzenes Byte empfangen
Nach oben
function get(byte Port) returns int
Mit get() wird ein einzelnes Byte aus dem Empfangs-FIFO ausgelesen
und zurückgegeben.
Stehen keine Daten an, so wird solange gewartet, bis mindestens ein Byte
empfangen wurde.
Port | Portnummer der Schnittstelle (1 bis 30) |
Empfang von Datenrahmen
Nach oben
function receive(byte Port, byte buf[], int len, long timeout) returns int
Die Funktion receive() empfängt eine angebebene Anzahl an datenbytes
und
speichert diese in den angegebenen Byte-Puffer.
Werden für länger als das angegebene Timeout keine weiteren Daten
empfangen, so bricht die Funktion vorzeitig ab und gibt die Anzahl
der tatsächlich empfangenen Bytes zurück.
Port | Portnummer der Schnittstelle (1 bis 30) |
buf[] | Byte-Puffer für die zu empfangenen Daten |
len | Anzahl der zu empfangenen Bytes |
timeout | Zeit in ms, die auf Daten gewartet werden
soll, bis abgeprochen wird. |
Input - Eingabe von Zahlenwerten Nach oben
function input(byte Port, byte echo) returns int
Mit dieser Funktion können z.B. uber ein Terminal-Programm Zahleneingaben
als ASCII-Zeichenfolge gemacht werden. Die eingebene Zahl muß mit CR+LF (ASCII
13+10)
abgeschlossen werden.
Die Zahl wird anschließend als Integer-Zahl zurückgegeben.
Mit dem Parameter echo kann bestimmt werden, ob während der Eingabe
ein Echo zurückgegeben werden soll.
Port | Portnummer der Schnittstelle (1 bis 30) |
echo | Echo zurückgeben |
Inputstr - Eingabe von Zeichenketten Nach oben
function input(byte Port, byte s[], byte echo) returns int
Mit dieser Funktion können z.B. uber ein Terminal-Programm Zeichenketten
eingeben werden. Die eingebene Zeichenkette muß mit CR+LF (ASCII 13+10)
abgeschlossen werden.
Die Zeichenkette wird in der agegebenen Stringvariable gespeichert.
Mit dem Parameter echo kann bestimmt werden, ob während der Eingabe
ein Echo zurückgegeben werden soll.
Port | Portnummer der Schnittstelle (1 bis 30) |
s[] | String-Variable |
echo | Echo zurückgeben |
Ports setzen Nach oben
function setPort(byte COMPort, byte Port, byte state)
Mit dieser Funktion können die zwei frei verwendbaren Ausgänge
OUT1 und OUT2 des I2C-COM geschalten werden.
Diese Ports können z.B. zum Anzeigen von Stausmeldungen über LEDs benutzt
werden.
COMPort | Portnummer der Schnittstelle (1 bis 30) |
Port | Port 0 bis 1 (=OUT1 bis OUT2) |
state | Schaltzustand |
Ports abfragen Nach oben
function getPort(byte COMPort, byte Port) returns int
Mit dieser Funktion können die Schaltzustände der zwei frei verwendbaren
Ausgänge
OUT1 und OUT2 des I2C-COM abgefragt werden.
Der Schaltzustand wird als True(-1) oder False(0) zurückgegeben.
COMPort | Portnummer der Schnittstelle (1 bis 30) |
Port | Port 0 bis 1 (=OUT1 bis OUT2) |
Konstanten Nach oben
_BAUDRATE _SETREG _GETREG _PUT _GET _RXD _READY _PRINT _SEND _SENDA _RECEIVE _RECEIVEA |
Dies sind die Konstanten für die Einsprungadressen des Systemtreibers i2ccom.hex |
Rate[] | Hier sind die Baudraten für die Funktion setspeed() abgelegt |
set8N1 set8E1 set8O1 set8N2 set8E2 set8O2 set7N1 set7E1 set7O1 set7N2 set7E2 set7O2 set6N1 set6E1 set6O1 set6N2 set6E2 set6O2 set5N1 set5E1 set5O1 set5N2 set5E2 set5O2 |
Dies sind vordefinierte Datenformate für die Funktion setFormat() |
set8Bit set7Bit set6Bit set5Bit set1Stopt set2Stop setP_no setP_even setP_odd setP_stick |
Dies sind Konstanten, um sich selbst
Datenformate defnieren zu können. Die Parameter werden einfach mit "or" verknüpft. |
IER IIR (readonly) FCR (writeonly) LCR MCR LSR MSR SCR |
Dies sind Konstanten für die einzelnen
Register des FIFO-Bausteins. Sie werden zusammen mit getReg() und setReg() benötigt |
inline function _setReg(int
data, int reg, byte comport, int com[]) returns int
inline function _getReg(int reg, byte comport, int com[]) returns int
inline function _setRate(int data, byte comport,int com[]) returns int
inline function _put(byte data, byte comport,int com[]) returns int
inline function _get(byte comport,int com[]) returns int
inline function _rxd(byte comport,int com[]) returns int
inline function _ready(byte comport,int com[]) returns int
inline function _print(byte data[],byte comport,int com[]) returns int
inline function _printa(int addr,byte comport,int com[]) returns int
inline function _send(byte data[],int len,byte comport,int com[]) returns int
inline function _senda(int pos,byte data[],int len,byte comport,int com[]) returns int
inline function _receive(byte data[],int len,byte comport,int com[]) returns int
inline function _receivea(byte pos, byte data[],int len,byte comport,int com[]) returns int
Diese Funktionen werden zum Aufruf des Systemtreibers i2ccom.hex benutzt.
Sie sollten ohne genauere Kenntnisse über die Funktion des Systemtreibers
nicht direkt genutzt werden !!
Autor: André Helbig Mail: andre.h@cc2net.de
Erstellt: 18.05.2003