I2C - Funktionsbeschreibung der Lib's

Version 0.1 , Ingo Gerlach , DH1AAD , 20.02.2001 , IngoGerlach@welfen-netz.com


Installation


Beschreibung der Funktionen

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


Installation

Windows (95/98)

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.

Linux

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 !

Einbinden in eigene Programme

C

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

Visual Basic , VBA

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 ".

Perl (nur Linux)

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 ...

Beschreibung der Funktionen

int set_port_delay (int delay)

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.

int init_iic (int Portnr)

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;
 }
....

int deinit_iic (void)

Port wieder schliessen. Rückgabe immer 0.

int iic_start (void)

Startbit senden. Rückgabe immer 0.

int iic_stop (void)

Stopbit senden. Rückgabe immer 0.

int iic_send_byte (int sbyte)

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()	

int iic_read_byte (int ack)

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.

int io_enable (void)

Schaltet den 8 Bit I/O Modus ein.

int io_disable (void)

Schaltet den 8 Bit I/O Modus aus.

int set_strobe (int strobe 1|0 )

Setz den Strobe Ausgang ( Pin 1 , Ausgangsbuchse) . Rückgabe strobe.

int get_status (int status 0)

Liest den Statusport des paralell Port. Rückgabe status.

int byte_in (int status 0)

Liest ein Byte über den 8 Bit I/O Adapter. Rückgabe eingelesenes Byte.

int byte_out (int sbyte)

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)

int lcd_init (void)

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";

int lcd_instr (int cmd)

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);

int lcd_wchar (int cchar)

Sendet das Zeichen cchar an das Display. Siehe lcd_init .

int lcd_rchar (int *cchar,int adr)

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));

 

int lcd_write_str (int *lstr)

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");

char *lcd_read_str (int len,int adr)

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);

int lcd_backlight(int cmd)

Schaltet, sofern vorhanden, die LCD Beleuchtung ein odder aus . 0 Licht aus, 1 Licht an

int lcd_get_adress(void)

Liest die aktuelle Adresse aus dem Display. Rückgabe, aktuelle Cursor-Adresse.

 

int iic_tx_pcf8574(int data,int adr)

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";

int iic_rx_pcf8574(int data,int adr)

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 !)