I2CCOM.C2 V2.0 - Hilfe


Beschreibung

Einfügen als System-Modul

Konstanten

Funktionen:
Grundeinstellungen:
setDataPCF
defineCOM
initCOM
setFormat
setBaudRate
setspeed

Control/Status:
getIIR
getIER

setIER
getLSR
getMSR
getReg

setReg
DTRenable
RTSenable
AFenable
getCTS
getDSR
getDCD
getRI

getTERI
Senden:
ready
put
print
print2
send
ret
tab
clr

Empfangen:
rxd
flush
get
receive
input
inputstr
Ports:
setPort
getPort

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

Mit setBaudRate kann nahezu beliebige Baudrate angegeben werden.
Allerdings kann diese etwas abwechen.
Mögliche Abweichungen können mit Folgender Formel ermittelt werden:
prescaler = 460800 / Baudrate
Ist das Ergebnis kein Ganzzahliger Wert, so ergeben sich Abweichungen.
Wird z.B. eine Baudrate don 47000 Baud benötigt, ergibt sich ein Wert
von ca. 9,804 für den Prescaler. Dies wird, da dieser Wert nicht gerundet
wird als 9 Interpretiert und ergibt 51200 Baud. Mit einem Prescaler
von 10 ergibt sich eine Baudrate von 46080 Baud, welche ca. 2% von 
der gewünschten Geschwindigkeit abweicht.

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
    function getIER(byte Port) returns byte
    function getLSR(byte Port) returns byte
    function getMSR(byte Port) returns byte
    function getReg(byte Port, byte Reg) returns byte

// Interrupt Identification Register
// Interrupt Enable Register
// Line Status Register
// Modem Status Register
// angegebenes Register Reg

Mit diesen Funktion kann die Register des FIFO-Bausteins gelesen werden.
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)
    function setReg(byte Port, byte Reg, byte Data)

// Interrupt Enable Register
// angegebenes Register Reg

Mit diesen Funktion könen die Register des FIFO-Bausteins geschrieben werden.
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)
    function tab(byte Port)
    function clr(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


System-Funktionen:

  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