I2C Perl Modul (seriell)


use i2c_ser;
  
  *** Allgemeine I²C-Routinen ***
  
  i2c_ser::init_iic(int PortNr)	
  i2c_ser::deinit_iic(void)			
  i2c_ser::set_port_delay(int delay)	  
  i2c_ser::read_sda(void)	
  i2c_ser::read_scl(void)	
  i2c_ser::iic_start(void)
  i2c_ser::iic_stop(void)	
  i2c_ser::send_byte(int byte)
  i2c_ser::read_byte(int ack)


  ***    PCF8574    ***

  i2c_ser::pcf8574_const()
  i2c_ser::iic_tx_pcf8574(int Data, int Adress_Offset) 
  i2c_ser::iic_rx_pcf8574(int Adress_Offset) 	

  ***    PCF8591    ***

  i2c_ser::pcf8591_const()
  i2c_ser::create8591()
  i2c_ser::pcf8591_init($ptr,$pcf8591_mode,$pcf8591_ref_UB,adr_of)
  i2c_ser::pcf8591_readchan($ptr,$Kanal,adr_of)
  i2c_ser::pcf8591_read4chan($ptr,adr_of);
  i2c_ser::pcf8591_aout($ptr,$Kanal)
  i2c_ser::pcf8591_setda($ptr,$ubval,adr_of);
  i2c_ser::delete8591($ptr)


  ***    SDA3302 (Phillips Tuner)   ***

  i2c_ser::sda3302_const()
  i2c_ser::create3302()
  i2c_ser::sda3302_init($ptr3302,$sda3302_mode)
  i2c_ser::sda3302_calc($ptr3302,$frequenz,$dstep)
  i2c_ser::sda3302_send($ptr3302,$sda3302_adr_off)
  i2c_ser::delete3302($ptr3302)

  ***    TSA5523 (Temic Tuner) ***

  i2c_ser::tsa5523_const()
  i2c_ser::create5523()
  i2c_ser::tsa5523_init($ptr5523,$sda5523_mode)
  i2c_ser::tsa5523_calc($ptr5523,$frequenz,$double_step)
  i2c_ser::tsa5523_send($ptr5523,$sda5523_adr_off)
  i2c_ser::tsa5523_read($sda5523_adr_off)
  i2c_ser::delete5523($ptr5523)

  ***    TSA5511 (nur PLL) ***

  i2c_ser::tsa5511_const()
  i2c_ser::create5511()
  i2c_ser::tsa5511_init($ptr5511,$tsa5511_mode,$Quarz)
  i2c_ser::tsa5511_calc($ptr5511,$frequenz,$double_step)
  i2c_ser::tsa5511_send($ptr5511,$tsa5511_adr_off)
  i2c_ser::delete5511($ptr5511)
  i2c_ser::tsa5511_read($tsa5511_adr_off) 

  ***    TSA6057    ***

  i2c_ser::tsa6057_const()
  i2c_ser::tsa6057()
  i2c_ser::tsa6057_init($ptr,$Raster,$Mode)
  i2c_ser::tsa6057_calc($ptr,$frequenz,$Raster)
  i2c_ser::tsa6057_send($ptr,$adr_off)
  i2c_ser::delete6057($ptr)

  ***  LCD-Funktionen (PCF8574)  ***
  i2c_ser::lcd_init($Adress_Offset)
  i2c_ser::lcd_backlight($On_Off,$Adress_Offset)
  i2c_ser::lcd_instr($Kommando,$Adress_Offset)
  i2c_ser::lcd_get_adress($Adress_Offset)
  i2c_ser::lcd_wchar(ord(H),$Adress_Offset)
  i2c_ser::lcd_write_str($string,$Adress_Offset)
  i2c_ser::lcd_rchar($ram_adresse,$Adress_Offset)
  i2c_ser::lcd_read_str($len,$ram_adresse,$Adress_Offset)
  
   *** Allgemeine I²C-Routinen ***
  
	$ret=i2c_ser::init_iic(int PortNr)
	ret gibt Portnummer (dezimal z.B. 888) zurück, wenn Interface gefunden wird.
	PortNr = 0 , es wird automatisch gesucht
	PortNr 1-3 , es wird nur an dem angegebenen Port gesucht.
	
        i2c_ser::deinit_iic(void)			
        Der mit init_iic() geöffnete Port wird wieder geschlossen.

	i2c_ser::set_port_delay(int delay)
	Setzt eine gewisse Verzoegerung für die Portzugriffe.
	Der Wert 'delay' muss groesser 0 sein. 
	Sinnvolle Werte liegen zwischen 5 - 25 .

	i2c_ser::read_sda(void)	
	Gibt den Status high/low der SDA-Leitung zurueck.

	i2c_ser::read_scl(void)	
	Gibt den Status high/low der SCL-Leitung zurueck.

	i2c_ser::iic_start(void)
	Initiert den I2C-Bus

	i2c_ser::iic_stop(void)	
	Schickt Stop-Bedingung auf den Bus.

	i2c_ser::send_byte(int byte)
	Sendet das Byte 'byte'

	i2c_ser::read_byte(int ack)
	Lies ein Byte , gibt , wenn 'ack' <> 0 ist, ein ACK aus.


  *** 8 BIT I/O - Routinen ***

	i2c_ser::set_strobe(int status)
	Setz die Strobleitung auf Status (0|1)

	i2c_ser::byte_out(int byte_out)
	Gibt das Byte byte_out aus.

	i2c_ser::byte_in(int byte_in)
	Liest das Byte byte_in

	i2c_ser::get_status(int status)

	i2c_ser::io_disable(void)

	i2c_ser::io_enable(void)


  *** PCF8574 - Routinen ***

       ($tx_8574,$rx_8574) = i2c_ser::pcf8574_const();
	Gibt die def. Konstanten zurück. 

	i2c_ser::iic_tx_pcf8574(int Data, int Adress_Offset) 
	Sendet das Byte 'Data' zum PCF8574.
	Ist die Adresse <> 112 , muss Adresss_Offste entsprechend gesetz werden.
	Sonst Adress_Offset=0.

	i2c_ser::iic_rx_pcf8574(int Adress_Offset) 	
	Liest den Eingang aus.
	# Ein Byte einlesen
	$r=i2c_ser::iic_rx_pcf8574(0);
	print "PCF8574: Value $r \n\n";
	Ist die Adresse <> 113 , muss Adresss_Offste entsprechend gesetz werden.
	Sonst Adress_Offset=0.

  ***    PCF8591  AD/DA Wandler   ***

	i2c_ser::pcf8591_const()
       ($pcf8591_adr,
	$pcf8591_rx,
	$pcf8591_c4s,
	$pcf8591_c3d,
	$pcf8591_c2s, 
	$pcf8591_c2d) = i2c_ser::pcf8591_const();
	Gibt die def. Konstanten zurück. 

	i2c_ser::create8591()
	Erzeugt einen Pointer auf Datenstruktur.
	$ptr =i2c_ser::create8591();

        i2c_ser::pcf8591_init($ptr,$pcf8591_mode,$pcf8591_ref_UB);
	Initialisiert den Wandler.
        Mode : 0 = 4x Eing. , 16 3x Dif, 32 2 xSE 2xDif, 48 2x Dif
	
	i2c_ser::pcf8591_readchan($ptr,$Kanal,$adr_of)
	$chan = i2c_ser::pcf8591_readchan($ptr,$Kanal);
	Liest den Wert des $Kanal aus.

	@Kanaele = i2c_ser::pcf8591_read4chan($ptr,adr_of);
	Liest Alle 4 Kanaele aus. Rueckgabe Array.

	$chan = i2c_ser::pcf8591_aout($ptr,$Kanal)
	Berechnet für den $Kanal den Wert in Volt.

	i2c_ser::pcf8591_setda($ptr,$ubval,adr_of);
	Setzt den Ausgang des DA Wandlers auf $ubval.

	i2c_ser::delete8591($ptr)
	Loescht den Pointer.


  *** SDA3302 - Routinen ***

	i2c_ser::sda3302_const()
        ($sda3302_adr,
	$sda3302_step,
	$sda3302_zf,
	$sda3302_PLL,
	$sda3302_DIV) = i2c_ser::sda3302_const();
	Gibt die def. Konstanten zurück. 

	i2c_ser::create3302()
	Erzeugt einen Pointer auf Datenstruktur.
	$ptr3302=i2c_ser::create3302();

	i2c_ser::sda3302_init($ptr3302,$sda3302_mode)
	Initialisiert die PLL.
	'mode' legt Fest, ob der SDA3302 als Teiler (238)
	oder als PLL (206) arbeitet.

	i2c_ser::sda3302_calc($ptr3302,$frequenz,$dstep)
	Berechnet fuer $frequenz die Teiler.
	Wenn dstep = 1 , Schrittweite 125KHz

	i2c_ser::sda3302_send($ptr3302,$adr_offset)
	Sendet die Teiler zur PLL.

	i2c_ser::delete3302($ptr3302)
	Loescht den Pointer.


  *** TSA5511 - Routinen ***

	i2c_lpt::tsa5511_const()
       ($tsa5511_adr,
	$tsa5511_step,
	$tsa5511_PLL,
	$tsa5511_DIV) = i2c_lpt::sda5511_const();
	Gibt die def. Konstanten zurück. 

	i2c_lpt::create5511()
	Erzeugt einen Pointer auf Datenstruktur.
	$ptr5511=i2c_lpt::create5511();

	i2c_lpt::tsa5511_init($ptr5511,$tsa5511_mode,$Quarz)
	Initialisiert die PLL.
	'mode' PLL (206).
	ist $Quarz = 0 , wird def. 4,00 Mhz sonst $Quarz

	i2c_lpt::tsa5511_calc($ptr5511,$frequenz,$double_step)
	Berechnet fuer $frequenz die Teiler.
	Bei $double_step = 1 , Schrittweite 125KHz (bei 4 MHz Quarz)

	i2c_lpt::tsa5511_send($ptr5511,$adr_offset)
	Sendet die Teiler zur PLL.

	i2c_lpt::delete5511($ptr5511)
	Loescht den Pointer.

	i2c_lpt::read5511($adr_offset)
	Liest PLL, Rückgabe Statusbyte . Bit 6 gesetzt = PLL locked.

  *** TBB200 ****

	(@const) = i2c_ser::tbb200_const();
	$ptr=i2c_ser::create_tbb200();
	i2c_ser::tbb200_init($ptr,$Mode,$RefQ,$Prescale);
	i2c_ser::tbb200_calc($ptr,$Step,$Freq);
	i2c_ser::tbb200_send_status($ptr,$Status); 
	i2c_ser::tbb200_send_r_cnt($ptr);
	i2c_ser::tbb200_send_n_cnt($ptr);
	i2c_ser::tbb200_delete($ptr);

  *** TSA5523 - Routinen ***

	i2c_ser::tsa5523_const()
       ($tsa5523_adr,
	$tsa5523_step,
	$tsa5523_step,
	$tsa5523_PLL,
	$tsa5523_DIV) = i2c_ser::sda5523_const();
	Gibt die def. Konstanten zurück. 

	i2c_ser::create5523()
	Erzeugt einen Pointer auf Datenstruktur.
	$ptr5523=i2c_ser::create5523();

	i2c_ser::tsa5523_init($ptr5523,$tsa5523_mode)
	Initialisiert die PLL.
	'mode' PLL (200).

	i2c_ser::tsa5523_calc($ptr5523,$frequenz,$double_step)
	Berechnet fuer $frequenz die Teiler.
	Bei $double_step = 1 , Schrittweite 100KHz

	i2c_ser::tsa5523_send($ptr5523,$adr_offset)
	Sendet die Teiler zur PLL.

	i2c_ser::delete5523($ptr5523)
	Loescht den Pointer.

	i2c_ser::tsa5523_read($adr_offset)
	Liest PLL, Rückgabe Statusbyte . Bit 6 gesetzt = PLL locked.


  *** TSA6057 - Routinen ***

	i2c_ser::tsa6057_const()
	($tsa6057_adr,
	$tsa6057_am,
	$tsa6057_fm,
	$tsa6057_R01,
	$tsa6057_R10,
	$tsa6057_R25) = i2c_ser::tsa6057_const();
	Gibt die def. Konstanten zurück. 

	i2c_ser::create6057()
	Erzeugt einen Pointer auf Datenstruktur.
	$ptr=i2c_ser::create6057();

	i2c_ser::tsa6057_init($ptr,$RASTER,$MODE);
	Initialisiert die PLL.
	Raster legt das Ratser Fest. Mode AM | FM.

	$teiler = i2c_ser::tsa6057_calc($ptr,$frequenz,$RASTER);
	Berechnet fuer $frequenz die Teiler.

	i2c_ser::tsa6057_send($ptr,$adr_offset);
	Sendet die Teiler zur PLL.
	adr_offset 0 | 2

	i2c_ser::delete6057($ptr)
	Loescht den Pointer.

  ***  LCD-Funktionen (PCF8574)  ***
	LCD Befehle 
	Cursor Off 	= 0x0c
	Cursor On 	= 0x0e
	Cursor home 	= 0x02
	Cursor blink 	= 0x0f
	Display Clear	= 0x01
	Display Off	= 0x08
	Adresse setz.	= 0x80

	i2c_ser::lcd_init($Adress_Offset) );
	Initialisiert das Display. 

	$bl = i2c_ser::lcd_backlight($on_off,$Adress_Offset);
	Schaltet, sofern vorhanden, die Beleuchtung des Displays ein.
	$on_off = 1 -> Licht an.
	$on_off = 0 -> Licht aus.

	i2c_ser::lcd_instr($cmd,$Adress_Offset);
	Schickt das Kommando $cmd an das Display.
	Display Off	= 0x08
	i2c_ser::lcd_instr(0x08,$Adress_Offset);
	

	$lcdadr=i2c_ser::lcd_get_adress($Adress_Offset);
	Liest die Adresse Cursorposition.	

	i2c_ser::lcd_wchar(ord(H),$Adress_Offset);
	Schreibt ein einzelnes Zeichen an die aktuelle Adresse.

	i2c_ser::lcd_write_str("Hallo Display",$Adress_Offset);
	Schreibt einen String in das Display.

	$rchar=chr(i2c_ser::lcd_rchar($Adresse),$Adress_Offset);
	Liest das Zeichen an $Adresse.

	$rchar=i2c_ser::lcd_read_str($len,$adr,$Adress_Offset);
	Liest einen String mit Länge $len ab Position
	$Adresse aus dem Display.

© Ingo Gerlach, DH1AAD, 24.05.2002
E-Mail bitte an:IngoGerlach@welfen-netz.com