Funktionen:
Konfiguration:
setDDRw()
setDDRb()
setDDRn()
setDDR()
getDDRw()
getDDRb()
getDDRn()
getDDR()
setPIw()
setPIb()
setPIn()
setPI()
getPIw()
getPIb()
getPIn()
getPI()
setReg()
getReg()
Ports Schreiben:
setw()
setb()
setn()
set()
toggle()
pulse()
Ports Lesen (Ausgänge):
getOutw()
getOutb()
getOutn()
getOut()
Ports Lesen (Eingänge):
getw()
getb()
getn()
get()
Beschreibung Nach oben
Das Modul max7311.c2 ist ein Treiber für den 16Bit-I²C-Bus-Portexpander
MAX7311 und damit auch für den CCTools
Baustein I2C-Port-16-HS
Einfügen als Systemmodul
Nach oben
Die Datei max7311.c2 in das Verzeichnis .\CControl2\Lib
der IDE
kopieren und in der Datei modules.txt die Zeile max7311.c2
unterhalb von i2c.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.
Konstanten Nach oben
//-- Busadressen ---------------------------------------------------------------
const Addr[] =0x20,0x22,0x24,0x26,0x28,0x2A,0x2C,0x2E,//A0:GND/V+,A1:SCL/SDA,A2:GND/V+
0x30,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3E,//A0:GND/V+,A1:SCL/SDA,A2:SCL/SDA
0x40,0x42,0x44,0x46,0x48,0x4A,0x4C,0x4E,//A0:GND/V+,A1:GND/V+,A2:GND/V+
0x50,0x52,0x54,0x56,0x58,0x5A,0x5C,0x5E,//A0:GND/V+,A1:GND/V+,A2:SCL/SDA
0xA0,0xA2,0xA4,0xA6,0xA8,0xAA,0xAC,0xAE,//A0:SCL/SDA,A1:SCL/SDA,A2:GND/V+
0xB0,0xB2,0xB4,0xB6,0xB8,0xBA,0xBC,0xBE,//A0:SCL/SDA,A1:SCL/SDA,A2:SCL/SDA
0xC0,0xC2,0xC4,0xC6,0xC8,0xCA,0xCC,0xCE,//A0:SCL/SDA,A1:GND/V+,A2:GND/V+
0xD0,0xD2,0xD4,0xD6,0xD8,0xDA,0xDC,0xDE;//A0:SCL/SDA,A1:GND/V+,A2:SCL/SDA
const AddrR[]=0x21,0x23,0x25,0x27,0x29,0x2B,0x2D,0x2F,//A0:GND/V+,A1:SCL/SDA,A2:GND/V+
0x31,0x33,0x35,0x37,0x39,0x3B,0x3D,0x3F,//A0:GND/V+,A1:SCL/SDA,A2:SCL/SDA
0x41,0x43,0x45,0x47,0x49,0x4B,0x4D,0x4F,//A0:GND/V+,A1:GND/V+,A2:GND/V+
0x51,0x53,0x55,0x57,0x59,0x5B,0x5D,0x5F,//A0:GND/V+,A1:GND/V+,A2:SCL/SDA
0xA1,0xA3,0xA5,0xA7,0xA9,0xAB,0xAD,0xAF,//A0:SCL/SDA,A1:SCL/SDA,A2:GND/V+
0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,//A0:SCL/SDA,A1:SCL/SDA,A2:SCL/SDA
0xC1,0xC3,0xC5,0xC7,0xC9,0xCB,0xCD,0xCF,//A0:SCL/SDA,A1:GND/V+,A2:GND/V+
0xD1,0xD3,0xD5,0xD7,0xD9,0xDB,0xDD,0xDF;//A0:SCL/SDA,A1:GND/V+,A2:SCL/SDA
Dies sind die Schreib-und Leseadressen des MAX7311.
Diese werden über die drei Adressleitung AD0, AD1, AD2 am MAX7311 eingestellt.
Dabei gibt es vier verschiedene Zustände an einem Adresseingang. (Quads)
Somit sind 4³ = 64 Adressen möglich.
Die Adressen lassen sich in 8 Gruppen unterteilen:
Adressbereich | Int.Addr. | AD0 Low | AD0 High | AD1 Low | AD1 High | AD2 Low | AD2 High |
0x20 - 0x2F | 0 - 7 | GND | V+ | SCL | SDA | GND | V+ |
0x30 - 0x3F | 8 - 15 | GND | V+ | SCL | SDA | SCL | SDA |
0x40 - 0x4F | 16 - 23 | GND | V+ | GND | V+ | GND | V+ |
0x50 - 0x5F | 24 - 31 | GND | V+ | GND | V+ | SCL | SDA |
0xA0 - 0xAF | 32 - 39 | SCL | SDA | SCL | SDA | GND | V+ |
0xB0 - 0xBF | 40 - 47 | SCL | SDA | SCL | SDA | SCL | SDA |
0xC0 - 0xCF | 48 - 55 | SCL | SDA | GND | V+ | GND | V+ |
0xD0 - 0xDF | 56 - 63 | SCL | SDA | GND | V+ | SCL | SDA |
Bei den Funktionen wird lediglich die interne Adresse des Moduls (0-63)
übergeben.
Bei der Wahl der Adresse ist zu beachten, daß sich viele Adressbereiche mit
anderen I²C-Bus-Bausteinen
überschneiden.
Beispielsweise benutzt der Baustein PCF8574 ohne A den Bereich 0x40 bis 0x4F,
oder serielle EEProms und Uhrenbausteine den Bereich 0xA0 bis 0xAF
(Uhrenbausteine nur bis 0xA3)
//-- Register ------------------------------------------------------------------
const InL = 0x0;//Input-Port-Register
Port 0 bis 7
const InH = 0x1;//Input-Port-Register
Port 8 bis 15
const OutL = 0x2;//Ausgangs-Register
Port 0 bis 7
const OutH = 0x3;//Ausgangs-Register
Port 8 bis 15
const PolInvL = 0x4;//Port-Invertierungs-Register
für Eingänge Port 0 bis 7
const PolInvH = 0x5;//Port-Invertierungs-Register
für Eingänge Port 8 bis 15
const DDR_L = 0x6;//Data-Direction-Register
Port 0 bis 7 (Datenrichtung)
const DDR_H = 0x7;//Data-Direction-Register
Port 8 bis 15 (Datenrichtung)
const TO_Reg = 0x8;//Timeout-Register
Dies sind die Registeradressen für die internen Register des MAX7311.
Funktionen:
DDR - Data Direction Register setzen Nach oben
function setDDRw(byte addr, int DDR) returns int
function setDDRb(byte addr, byte Port, byte DDR) returns int
function setDDRn(byte addr, byte Port, byte DDR) returns int
function setDDR(byte addr, byte Port, int DDR) returns int
Mit diesen Funktionen kann die Datenrichtung (Eingang oder Ausgang) der Ports
bestimmt werden. Dies kann wordportweise (setDDRw()), byteportweise (setDDRb()),
nibbleportweise (setDDRn()) oder einzelportweise (setDDR()) geschehen.
Bevor ein Port als Ein- oder Ausgang benutzt werden kann, muß dieser mit einer
dieser
Funktionen als solcher gesetzt werden.
Nach Power On sind alle Ports des MAX7311 als Eingänge konfiguriert.
Die Funktion gibt True(-1) zurück, wenn sich an der angegebenen Adresse ein
Baustein befindet, andernfalls False(0).
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
Port | Portnummer: setDDRb: 0 oder 1 für Ports 0-7 oder 8-15 setDDRn: 0 bis 3 für Ports 0-3, 4-7, 8-11 oder 12-15 setDDR: 0 bis 15 für Ports 0 bis 15 |
DDR | Bitmuster für DDR-Register. High-Bit=Eingang,
Low-Bit=Ausgang Bei setDDR() 0=Ausgang, ungleich 0 =Eingang |
DDR - Data Direction
Register lesen Nach oben
function getDDRw(byte addr) returns int
function getDDRb(byte addr, byte Port) returns byte
function getDDRn(byte addr, byte Port) returns byte
function getDDR(byte addr, byte Port) returns int
Mit diesen Funktionen kann die konfigurierte Datenrichtung (Eingang oder Ausgang)
der Ports ausgelesen werden. Dies kann wordportweise (getDDRw()),
byteportweise (getDDRb()),
nibbleportweise (getDDRn()) oder
einzelportweise (getDDR()) geschehen.
Das Bitmuster wird als Rückgabewert zurückgegeben. Bei getDDR() wird
True(-1) oder False(0) zurückgegeben.
Ein High-Bit bedeutet Eingang, ein Low-Bit Ausgang.
addr | Baustein: 0-63 (siehe Tabelle bei den Konstanten) |
Port | Portnummer: setDDRb: 0 oder 1 für Ports 0-7 oder 8-15 setDDRn: 0 bis 3 für Ports 0-3, 4-7, 8-11 oder 12-15 setDDR: 0 bis 15 für Ports 0 bis 15 |
Polarity Inversion Register setzen Nach oben
function setPIw(byte addr, int PI) returns int
function setPIb(byte addr, byte Port, byte PI) returns int
function setPIn(byte addr, byte Port, byte PI) returns int
function setPI(byte addr, byte Port, int PI) returns int
Mit diesen Funktionen kann die Polarität der Einzlnen Ports, sofern diese
als
Eingang definiert sind, invertiert werden. Dies ist z.B. sinnvoll, wenn
ein Low-Pegel an einem Eingang als True gewertet werden soll.
(z.B. Taster oder Schalter gegen GND)
Dies kann wordportweise (setDDRw()), byteportweise (setDDRb()),
nibbleportweise (setDDRn()) oder einzelportweise (setDDR()) konfiguriert werden.
Ist ein Port als Ausgang konfiguriert, so hat das PI-Register keinerlei Einfluß
auf diesen.
Die Funktion gibt True(-1) zurück, wenn sich an der angegebenen Adresse ein
Baustein befindet, andernfalls False(0).
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
Port | Portnummer: setPIb: 0 oder 1 für Ports 0-7 oder 8-15 setPIn: 0 bis 3 für Ports 0-3, 4-7, 8-11 oder 12-15 setPI: 0 bis 15 für Ports 0 bis 15 |
PI | Bitmuster für PI-Register. High-Bit=Invertiert,
Low-Bit=Normal Bei setPI() 0=Normal, ungleich 0 =Invertiert |
Polarity
Inversion Register lesen Nach oben
function getPIw(byte addr) returns int
function getPIb(byte addr, byte Port) returns byte
function getPIn(byte addr, byte Port) returns byte
function getPI(byte addr, byte Port) returns int
Mit diesen Funktionen kann das PI-Register augelesen werden.
Dies kann wordportweise (setDDRw()), byteportweise (setDDRb()),
nibbleportweise (setDDRn()) oder einzelportweise (setDDR()) geschehen.
Das Bitmuster wird als Rückgabewert zurückgegeben. Bei getPI() wird
True(-1) oder False(0) zurückgegeben.
Ein High-Bit bedeutet Invertiert, ein Low-Bit Normal.
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
Port | Portnummer: getPIb: 0 oder 1 für Ports 0-7 oder 8-15 getPIn: 0 bis 3 für Ports 0-3, 4-7, 8-11 oder 12-15 getPI: 0 bis 15 für Ports 0 bis 15 |
Register setzen Nach oben
function setReg(byte addr, byte Reg, byte data) returns int
Mit setReg() kann jedes Register des MAX7311 gesetzt werden.
Die Funktionen der einzlenen Register können aus dem Datenblatt des MAX7311
entnommen werden.
Die Funktion gibt True(-1) zurück, wenn sich an der angegebenen Adresse ein
Baustein befindet, andernfalls False(0).
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
Reg | Register 0 bis 8 |
data | Datenbyte mit Bitmuster des Registers |
Register lesen Nach oben
function getReg(byte addr, byte Reg) returns byte
Mit getReg() kann jedes Register des MAX7311 ausgelesen werden.
Die Funktionen der einzlenen Register können aus dem Datenblatt des MAX7311
entnommen werden.
Das Bitmuster des zu lesenden Registers wird als Bytewert zurückgegeben.
Ein High-Bit bedeutet Invertiert, ein Low-Bit Normal.
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
Reg | Register 0 bis 8 |
Setzen von
Ports
Nach oben
function setw(byte addr, int state) returns int
function setb(byte addr, byte port, byte state) returns int
function setn(byte addr, byte port, byte state) returns int
function set(byte addr, byte port, int state) returns int
Mit diesen Funktionen wird der Schaltzustand der einzelnen Ports bestimmt.
Es können Word-, Byte-, Nibble- oder Einzelports gesetzt werden.
Bevor ein Port als Ausgang verwendet werden kann, muß dieser mit einer
setDDR-Funktion einmal als solcher definiert werden.
Die Funktion gibt True(-1) zurück, wenn sich ein Baustein unter der angegebenen
Adresse befindet, ansonsten False(0).
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
port | setb(): Port 0 bis 1 setn(): Port 0 bis 3 set(): Port 0 bis 15 |
state | Schaltzustand bei setw(), setb() und setn(): Bitmuster bei set() 0=low, !=0 = high |
toggle()
Nach oben
function toggle(byte addr, byte port) returns int
Mit der Funktion toggle() wird der Pegel des angegeben Ports,
sofern dieser als Ausgang
konfiguriert ist, invertiert.
Die Funktion gibt True(-1) zurück, wenn sich ein Baustein unter der angegebenen
Adresse befindet, ansonsten False(0).
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
port | Port 0 bis 15 |
function pulse(byte addr, byte port) returns int
Mit der Funktion pulse() wird am angegebenen Port, sofern dieser
als Ausgang
konfiguriert ist, ein kurzer Nadelimpuls ausgegeben.(zweimaliges invertieren).
Die Funktion gibt True(-1) zurück, wenn sich ein Baustein unter der angegebenen
Adresse befindet, ansonsten False(0).
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
port | Port 0 bis 15 |
function getOutw(byte
addr) returns int
function getOutb(byte addr, byte port) returns int
function getOutn(byte addr, byte port) returns int
function getOut(byte addr, byte port) returns int
Mit diesen Funktionen können die Schaltzustände der Ausgänge (bzw.
Ausgangsregister)
eingelesen werden. Es wird das Bitmuster bei getOutw(), getOutb()
und getOutn() bzw.
True(-1) für high
und False(0) für low bei getOut() zurückgegeben.
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
port | setb(): Port 0 bis 1 setn(): Port 0 bis 3 set(): Port 0 bis 15 |
Eingänge einlesen
Nach oben
function getw(byte addr) returns int
function getb(byte addr, byte port) returns int
function getn(byte addr, byte port) returns int
function get(byte addr, byte port) returns int
Mit diesen Funktionen können die Pegel Eingänge eingelesen werden.
Es wird das Bitmuster bei getw(), getb()
und getn() bzw.
True(-1) für high
und False(0) für low bei get() zurückgegeben.
Bevor ein Port als Eingang verwendet werden kann, muß dieser als solcher
definiert sein. (setDDR)
Nach Power On sind alle Ports des MAX7311 als Eingänge konfiguriert.
addr | Bausteinadresse 0-63 (siehe Tabelle bei den Konstanten) |
port | setb(): Port 0 bis 1 setn(): Port 0 bis 3 set(): Port 0 bis 15 |
Anders als bei der C-Control II, werden die Ports des MAX7311 nicht
automatisch als Ausgang gesetzt, wenn auf diese geschrieben wird.
Das konfigurieren der Ports als Ausgänge muß mit einer der setDDR-Funktionen
erfolgen.
Open-Drain-Ports:
Standardmäßig bietet der MAX7311 keine Opendrain-Ports. Jedoch lässt sich
dies sehr einfach bewerkstelligen, indem man den Port wechselweise als
Eingang und Ausgang schaltet. Dabei müssen zuvor einmalig die Ports,
die als Open-Drain-Ports verwendet werden sollen, mit einem Low-Pegel
beschrieben werden.
Anschließend kann man mit dem wechselweisen konfigurieren der Ports
als Eingänge und Ausgänge diese als Open-Drain-Ports verwenden.
Ist der Port als Eingang definiert, so entspricht dies einem High-Pegel.
Ist der Port als Ausgang definiert, so entspricht dies einem Low-Pegel.
Autor: André Helbig Mail: andre.h@cc2net.de
Erstellt: 13.9.2003