Version 0.1 , Ingo Gerlach , DH1AAD , 20.02.2001 , IngoGerlach@welfen-netz.com
Folgende Funktionen sind sowohl für das serielle- als auch den paralellen I2C Adapter verfügbar.
Funktionen für das universelle Parport Interface (Elektor 10/2000).
Funktionen zum direkten Ansteuern eines LC Display's
Legen Sie als erstes einen neuen Ordner I2C an. Kopieren Sie nun die Datei i2c-01.zip in diesen Ordner und enpacken sie dort. Die DLL's befinden sich im Verzeichnis \LIB. Um sie einsetzen zu können, ist es erforderlich das die DLL's auch zur Laufzeit gefunden werden. Kopieren Sie daher die DLL's in das Windows System Verzeichnis.
Die DLL's wurden mit Microsoft Visual C 4.2 erstellt. Die entsprechenden Workspaces sind unter \LIB\i2c_ser und \LIB\i2c_par zu finden. Die Quellen dazu unter \i2c_ser , \i2c_par, \src , \lcd und \pcf8574.
Legen Sie als erstes einen neuen Ordner /opt/i2c an. Kopieren Sie nun die Datei i2c-0.1.tar.gz in diesen Ordner und enpacken sie dort folgendermassen:
gzip -d i2c-0.1.tar.gz
tar -xvf i2c-0.1.tar
Anschliessend noch INSTALL eingeben um die Sourcen zu kompilieren und die Perl-Module zu erstellen. Die man-Pages zu den Perl-Modulen können mit "man i2c_ser" bzw. "man i2c_par" angezeigt werden. Sollte ein anderes Verzeichnis als /opt/i2c verwendet werden, ist es erforderlich den Eintrag "HDIR= /opt/i2c/" im Makefile unter /src anzupassen. Ein funktionsfähiges Perl muss allerdings auf dem Rechner installiert sein !
Binden Sie die include Dateien, aus dem Verzeichnis i2c_ser (i2c_ser.h) bzw. i2c_par (i2c_lpt.h) für den paralell Port, in Ihr eigenes Projekt mit ein. z.B.
#include "../i2c_ser/i2c_ser.h" // i2c Funktionen für ser. Schnittstelle #include "../lcd/lcd.h" // LCD Funktionen #include "../pcf8574/pcf8574.h" // PCF8574 Funktionen
Da die Funktionen in einer DLL enthalten sind, muss bei VB ein Modul mit den entsprechnenden Definitionen angelegt werden. Die Module sind unter VB\I2C_SER.BAS bzw. VB\I2C_PAR.BAS zu finden. Eingebunden wird das entsprechende Modul unter VB mit "Projekt / Modul hinzufügen ".
Um unter Perl die Funktionen zu nutzen, muss lediglich am Anfang die Definition "use i2c_ser; bzw use i2c_lpt;" eingfügt werden. z.B.
use i2c_ser; # Serielles Interface my $port = i2c_ser::init_iic(0); # Interface automatisch suchen ...
Setzt die Wartezeit (delay) für Portzugriffe. Günstige Werte liegen im Bereich von 2-10. Rückgabe delay. Diese Funktion muss vor dem initialiseren aufgerufen werden. Sh. Beispiel init_iic.
Initialisert den Port (seriell oder paralell ) für die Ein/Ausgabe und überprüft ob ein I2C Interface angeschlossen ist. Gibt 0 zurück falls das Interface nicht gefunden wird. Bei Portnr = 0 wird automatisch gesucht. Zurückgegeben wird die Adresse (dezimal) bei vorhandensein eines Interfaces ansonsten 0.
C
#include "i2c_lpt.h" // i2c Funktionen für par. Schnittstelle
int LPT = 0;
set_port_delay(5); // Portdelay 1-25 25 ..langsam
iport = init_iic(LPT); // Init ii2c , Interface automatisch suchen an LPTx
if (iport>0)
{
printf(" gefunden an Port 0x%03xh! \n",iport);
} else {
printf("Interface nicht gefunden.\n");
exit (2);
}
....
Visual Basic Private Sub Init_Click() Dim Port As Integer set_port_delay (5) Port = init_iic(0) End Sub
Perl
use i2c_lpt;
i2c_lpt::set_port_delay(5);
# Interface automatisch suchen
my $iport = i2c_lpt::init_iic(0);
print "Suche Interface...\n";
if ($iport > 0) {
print "I2C-Interface gefunden an $iport \n\n";
} else {
print "I2C-Interface nicht gefunden. \n";
exit 1;
}
....
Port wieder schliessen. Rückgabe immer 0.
Startbit senden. Rückgabe immer 0.
Stopbit senden. Rückgabe immer 0.
Es wird das Byte sbyte über den IIC-Bus gesendet. Rückgabe 1 wenn ein ACK vom Slave kam, sonst 0.
... initialisierung sh. init_iic..
C
int ret;
iic_start();
ret = iic_send_byte(114); # Adresse I2C
if (ret)
{
ret = iic_send_byte(data); # Daten ausgeben
if (ret) iic_stop();
}
Visual Basic
Call iic_start temp = iic_send_byte(114) temp = iic_send_byte(8) Call iic_stop
Perl
i2c_ser::iic_start() i2c_ser::send_byte(114) i2c_ser::send_byte(8) i2c_ser::iic_stop()
Es wird ein Byte über den IIC-Bus eingelesen. Rückgabe empfangenes Byte. Wenn ack = 1 wird abschliessend ein ACK gesendet.
... initialisierung sh. init_iic..
C
int ret;
iic_start();
ret = iic_send_byte(115); # Adresse I2C
if (ret)
{
*data = iic_read_byte(0); # Daten einlesen
} else *data = 0;
iic_stop();
Visual Basic
Call iic_start temp = iic_send_byte(115) data = iic_read_byte(1) Call iic_stop
Perl
i2c_ser::iic_start() i2c_ser::send_byte(115) data = i2c_ser::read_byte(1) i2c_ser::iic_stop()
Achtung ! Nur für den paralell Port I2C-Adapter verfügbar.
Schaltet den 8 Bit I/O Modus ein.
Schaltet den 8 Bit I/O Modus aus.
Setz den Strobe Ausgang ( Pin 1 , Ausgangsbuchse) . Rückgabe strobe.
Liest den Statusport des paralell Port. Rückgabe status.
Liest ein Byte über den 8 Bit I/O Adapter. Rückgabe eingelesenes Byte.
Gibt das Byte sbyte über den 8 Bit I/O Adapter aus. Rückgabe sbyte.
... initialisierung sh. init_iic..
C
io_enable(); set_strobe(0); MessWert = byte_in(0); io_disable(); set_strobe(1);
Visual Basic
Call io_enable set_strobe (0) MessWert = byte_in(0) Call io_disable set_strobe (1)
Perl
i2c_lpt::io_enable() i2c_lpt::set_strobe(0) MessWert = i2c_lpt::byte_in(0) i2c_lpt::io_disable() i2c_lpt::set_strobe(1)
Initialisiert Display , 2 Zeilen 4-BIT-Modus ( default) . Auch hier muss vor der eigentlichen Verwendung, der I2C Adapter initialisiert werden. sh init_iic. Die folgenden Konstanten sind in der C-Lib definiert.
/* LCD Konstanten */ #define LCD_IR 0x00 // Instruction Register #define LCD_DR 0x01 // Data Register #define LCD_BL 0x08 // Backlight #define LCD_COF 0x0C // Cursor Off #define LCD_CON 0x0E // Cursor On #define LCD_CBL 0x0F // Cursor Blink #define LCD_CHM 0x02 // Cursor Home #define LCD_CLR 0x01 // Display Clear #define LCD_OFF 0x08 // Display Off #define LCD_ADR 0x80 // Adresse setzen
C
test=lcd_init();
lcd_backlight(0); // Ausschalten (gibt 1 zurück wenn, OK)
// Text Schreiben
lcd_wchar('H');
lcd_wchar('a');
lcd_wchar('l');
lcd_wchar('l');
lcd_wchar('o');
// 2. Zeile
lcd_instr(LCD_ADR+64);
lcd_wchar('H');
lcd_wchar('a');
lcd_wchar('l');
lcd_wchar('l');
lcd_wchar('o');
printf("\n\nDisplay wird gelöscht....(Enter)\n");
lcd_instr(LCD_CLR);
lcd_write_str("Hallo DISPLAY!!");
Visual Basic
Call lcd_init
lcd_backlight (1)
lcd_write_str ("Hallo LCD!")
txt = Space(25)
temp = lcd_read_str(10, 0, txt)
Perl
print "LCD : Display Initialisieren..\n";
i2c_ser::lcd_init();
$licht = i2c_ser::lcd_backlight(1);
print "LCD : Licht an \n";
i2c_ser::lcd_instr(0x0c);
print "LCD : Cursor Off \n";
$lcdadr=i2c_ser::lcd_get_adress();
print "LCD : Der Cursor ist jetzt an Adresse $lcdadr \n";
i2c_ser::lcd_wchar(ord(H));
i2c_ser::lcd_wchar(ord(a));
i2c_ser::lcd_wchar(ord(l));
i2c_ser::lcd_wchar(ord(l));
i2c_ser::lcd_wchar(ord(o));
$lcdadr=i2c_ser::lcd_get_adress();
print "LCD : Der Cursor ist jetzt an Adresse $lcdadr \n";
i2c_ser::lcd_instr(0x01);
i2c_ser::lcd_write_str("Hallo Display");
print "LCD : Ausgabe mit lcd_write_str \n";
Sendet das Kommando cmd an das Display.
C
#define LCD_CLR 0x01 // Display Clear lcd_instr(LCD_CLR);
Visual Basic
lcd_instr(1) ' Display löschen
Perl
i2c_ser::lcd_instr(0x01);
Sendet das Zeichen cchar an das Display. Siehe lcd_init .
Liest ein Zeichen cchar vom Display von Adresse adr.
C
lcd_rchar(&cchar,0);
Visual Basic
lcd_rchar(cchar,0)
Perl (andere Aufrufkonvention!)
my $rchar=chr(i2c_ser::lcd_rchar(0));
Schreibt einen String *lstr auf das LCD
C
lcd_write_str("Hallo DISPLAY!!");
Visual Basic
lcd_write_str ("Hallo LCD!")
Perl
i2c_ser::lcd_write_str("Hallo Display");
Liest einen String in lstr, von Adresse adr, mit len Anzahl Zeichen vom Display.
C
printf("String : %s \n",lcd_read_str(10,0));
Visual Basic (andere Aufrufkonvention!)
Dim txt As String txt = Space(25) temp = lcd_read_str(10, 0, txt)
Perl
my $rstr=i2c_ser::lcd_read_str(15,0);
Schaltet, sofern vorhanden, die LCD Beleuchtung ein odder aus . 0 Licht aus, 1 Licht an
Liest die aktuelle Adresse aus dem Display. Rückgabe, aktuelle Cursor-Adresse.
Sendet das Byte data an einen PCF8574, mit der Adresse adr. Per default wird hier die Startadresse 112 verwendet , ist der PCF auf z.B. 114 adressiert, muss adr = 2 sein.
C
iic_tx_pcf8574(15,0);
Visual Basic iic_tx_pcf8574(15,0)
Perl
# Ein Byte senden, (Adresse = 0, dh. 112) $r=i2c_ser::iic_tx_pcf8574(12,0); print "PCF8574: Sende #12 an (pcf8574) \n";
Empfängt ein Byte data von einen PCF8574, mit der Adresse adr. Per default wird hier die Startadresse 112 verwendet , ist der PCF auf 114 adressiert, muss adr = 2 sein.
C
iic_rx_pcf8574(&data,0);
Visual Basic n = iic_rx_pcf8574(0) (Adresse)
Perl
# Ein Byte einlesen $r=i2c_ser::iic_rx_pcf8574(0); print "PCF8574: Empfangenes Byte $r \n";
I2C LC Display (Nach Elektor, I2C Bus angewandt, S. 117, aber andere Anschlussbelegung !)
