' ********************************************************************** ' ** Programma: g51da.BAS - Versione : 1.3 - 06 giugno 2003 ** ' ** Compilatore : BASCOM 8051 DEMO, (IDE e LIB V.2.0.11.0) ** ' ** Scheda : K51-AVR tramite GMB HR84 e GMM 5115 ** ' ** Ditta: grifo(r) ITALIAN TECHNOLOGY ** ' ** Via Dell' Artigiano 8/6 40016 San Giorgio di Piano (BO) ** ' ** Tel.+39 051 892 052 Fax +39 051 893 661 ** ' ** http://www.grifo.com http://www.grifo.it ** ' ** sales@grifo.it tech@grifo.it grifo@grifo.it ** ' ** ** ' ** Realizzato da: Graziano Gaiba ** ' ********************************************************************** ' ' ' Questo demo permette di pilotare una periferica I2C BUS a bordo della K51-AVR, ' PCF8591, attraverso il modulo mini-BLOCK GMB HR84 ed un mini modulo grifo(r). ' Il PCF891 e' dotato di una uscita analogica D/A con risoluzione ad 8 bit, ' tutte le operazioni di attivazione avvengono tramite l'interfaccia seriale ' sincrona I2C BUS. ' Il demo permette di impostare quale livello di tensione avere in uscita ' tramite la tastiera del PC, e scrive 'da' sui display a 7 segmenti della ' K51-AVR per indicare il funzionamento del demo. ' ' Prima di compilare selezionare nel menu Option/Compiler/Misc/ : ' Byte End 80. ' ' ' ' 05.06.2000 by Adriano Pedrielli (per la sola K51) ' ' 06.05.2003 by Graziano Gaiba ' '*********************************************************************** ' '****************** Direttive del compilatore ************************** ' $regfile = "grifo_mm.dat" $romstart = &H0 ' indirizzo di partenza del codice ' macchina per FLASH $ramstart = &H0 ' indirizzo di partenza della area ' dati $ramsize = &H100 ' pongo a 256 bytes la area dati $crystal = 14745600 ' frequenza di clock del microcontrollore $baud = 19200 ' velocità di comunicazione RS-232 $large ' indirizzamento a 16 bit $map Config Sda = P2.0 ' I2C serial DATA Config Scl = P2.1 ' I2C serial CLK ' '****************** Dichiarazione delle costanti *********************** ' Dim Saa1064 As Const &H38 ' Slave address SAA1064 Dim Wsaa1064 As Const &H70 ' Slave address SAA1064 in Write Dim Rsaa1064 As Const &H71 ' Slave address SAA1064 in Read Dim Ctb As Const 0 ' Ind. Control byte Dim Dig1 As Const 1 ' Ind. Digit 1 Dim Dig2 As Const 2 ' Ind. Digit 2 Dim Dig3 As Const 3 ' Ind. Digit 3 Dim Dig4 As Const 4 ' Ind. Digit 4 ' ********************************************************************** ' Dim Pcf8591 As Const &H48 ' Slave address PCF8591 Dim Wpcf8591 As Const &H90 ' Slave address PCF8591 in Write Dim Rpcf8591 As Const &H91 ' Slave address PCF8591 in Read ' '****************** Dichiarazione delle variabili ********************** ' Dim C As Byte ' Carattere in input Dim Dig As Byte ' valore di un digit Dim Cifh As Byte ' cifra 4 bit alti in HEX Dim Cifl As Byte ' cifra 4 bit bassi in HEX Dim N1 As Byte ' numero 1 byte per DY3 e DY4 Dim Valore As Byte ' numero da convertire ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Iniz ' Inizializzazione periferiche Declare Sub Dac(valore As Byte) ' Gestione del D/A converter Declare Sub Cifre(valore As Byte , Cifh As Byte , Cifl As Byte ) ' converte un numero in 2 cifre HEX Declare Sub Digit(dig As Byte ) ' Converte un numero da 0-F in 7 segmenti Declare Sub Vis_num(n1 As Byte) ' visualizza un byte in HEX Declare Sub Valore ' '************************* Programma main ****************************** ' Main: ' Ritardo Assestamento segnali Waitms 1 Print Chr(12) Print "Questo demo e' stato progettato per funzionare solo su una GMM 5115" Print "Proseguite nell'esecuzione solo se avete la scheda giusta!" Print "Se intendete proseguire, premete un tasto" Do Valore = Inkey Loop Until Valore <> 0 Call Iniz ' inizializzazioni Valore = 0 Print Print "Premere + per incrementare il livello di tensione di uscita" Print "Premere - per decrementare il livello di tensione di uscita" Print Do Call Dac(valore) ' Gestione del D/A converter Call Vis_num(valore) ' visualizzo il byte in HEX Call Valore Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' ******************* Inizializzazione delle periferiche ***************** ' Questa procedura esegue tutte le inizializzazioni del sistema. ' Parametri: ' Ingresso : nulla ' Uscita : nulla ' ************************************************************************ ' Sub Iniz ' Inizializzazione periferiche Do I2creceive Rsaa1064 , Valore ' leggo il registro di stato Loop Until Valore = 0 ' attendo accensione SAA1064 I2cstart ' sequenza di Start per I2CBUS I2cwbyte Wsaa1064 ' comunico lo Slave address I2cwbyte Ctb ' Punto al registro di controllo I2cwbyte &B00100111 ' bit0 =1 dynamic mode ' bit1 =1 digit 1+3 not blanked ' bit2 =1 digit 2+4 not blanked ' bit3 =0 no test segment ' bit4 =0 no 3mA segment current ' bit5 =1 6mA segment current ' bit6 =0 no 12mA segment current ' bit7 =0 indifferente I2cwbyte 94 ' scrive DY1 "d" I2cwbyte 119 ' scrive DY2 "A" I2cwbyte 0 ' scrive DY3 off I2cwbyte 0 ' scrive DY4 off I2cstop End Sub ' ' ***************** Gestione del D/A converter **************************** ' Questa procedura permette di settare un valore in uscita al D/A converter, ' disponibile su IC2 (PCF8591). ' Parametri: ' Ingresso : Valore as byte, valore da 0 a 255 (0v ..+Vref) ' Uscita : ' ************************************************************************ ' Sub Dac(valore As Byte) ' Gestione del D/A converter I2cstart ' sequenza di Start per I2CBUS I2cwbyte Wpcf8591 ' comunico lo Slave address I2cwbyte &H40 ' comando di attivazione D/A I2cwbyte Valore ' valore per il D/A I2cstop End Sub ' ' ***************** Converte un numero da 0 a F in 7 segmenti *********** ' Questa procedura converte una cifra da 0 a F nel formato 7 segmenti, se ' il valore e maggiore di F il display risulta spento. ' Parametri: ' Ingresso : dig as byte, valore da 0 a F ' Uscita : dig as byte, valore in formato 7 segmenti. ' ************************************************************************ ' Sub Digit(dig As Byte ) ' Converte un numero da 0-F in 7 segmenti If Dig < 16 Then ' il numero risulta minore di 16 Dig = Lookup(dig , Tab_7seg) ' leggo in tabella il valore Else Dig = 0 ' se = 10 o superiore azzero End If End Sub ' ' ***************** Converte 1 byte in due cifre HEX ******************** ' Questa procedura converte 1 byte da 0 a 255 in due cifre esadecimali a ' 4 bit. ' Parametri: ' Ingresso : Valore as byte, valore da 0 a 255 ' Uscita : Cifh as byte, cifra del nibble alto ' Cifl as byte, cifra del nibble basso ' ************************************************************************ ' Sub Cifre(valore As Byte , Cifh As Byte , Cifl As Byte ) ' converte un numero in due cifre HEX Cifh = Valore And &HF0 ' prelevo i 4 bit alti Cifh = Cifh / 16 ' sposto in basso i 4 bit alti Cifl = Valore And &H0F ' prelevo i 4 bit bassi End Sub ' ' *********************** Visualizza un byte in HEX ********************** ' Questa procedura permette di visualizzare un byte nel formato esadecimale. ' sui display DY3 e DY4. Es: 255= FFH, 32= 20H ecc. ' Parametri: ' Ingresso : N1 as byte, numero da visualizzare in HEX ' Uscita : nulla ' ************************************************************************ ' Sub Vis_num(n1 As Byte) ' visualizza un byte in HEX I2cstart ' sequenza di START I2cwbyte Wsaa1064 ' slave address I2cwbyte Dig3 ' punto al diplay 3 (DY3) Call Cifre(n1 , Cifh , Cifl) ' converto il numero1 in 2 cifre Call Digit(cifh) ' converto la cifra decine in 7 seg. I2cwbyte Dig ' scrivo il display DY3 Call Digit(cifl) ' converto la cifra unita in 7 seg. I2cwbyte Dig ' scrivo il display DY4 I2cstop ' sequenza di stop End Sub ' ' Gestione livello uscita ' Sub Valore C = Inkey If C = "+" Then Incr Valore End If If C = "-" Then Decr Valore End If End Sub ' ' ************* Tabella conversione per cifra a 7 segmenti da 0 a 15 ******* Tab_7seg: ' num. 0 1 2 3 4 5 6 7 8 9 Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F ' num. A b C d E F Data &H77 , &H7C , &H39 , &H5E , &H79 , &H71 ' ************************************************************************** '