' ********************************************************************** ' ** Programma: g51TERMO.BAS - Versione : 1.3 - 16 aprile 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, ' DS1621, attraverso il modulo mini-BLOCK GMB HR84 ed un mini modulo grifo(r). ' Il Ds1621 e' un termometro digitale programmabile, con risoluzione di mezzo ' grado Celsius, tutte le operazioni di programmazione e acquisizione della ' temperatura avvengono tramite l'interfaccia seriale sincrona I2C BUS. ' Il demo mostra sui display a 7 segmenti della K51-AVR la temperatura misurata. ' ' Prima di compilare selezionare nel menu Option/Compiler/Misc/ : ' Byte End 5F. ' ' ' ' 05.06.2000 by Adriano Pedrielli (per la sola K51) ' ' 16.04.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 ' ***************** Elenco indirizzi per Saa1064 *********************** 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 Ds1621 As Const &H4C ' Slave address DS1621 Dim Wds1621 As Const &H99 ' Slave address DS1621 in Write Dim Rds1621 As Const &H98 ' Slave address DS1621 in Read ' ***************** Elenco comandi per DS1621 ************************** Dim Cfg As Const &HAC ' R/W Reg. Config per DS1621 Dim Rtemp As Const &HAA ' Leggi temperatura 2 bytes Dim Strct As Const &HEE ' Start conversione temperatura Dim Stpct As Const &H22 ' Stop conversione temperatura ' '****************** Dichiarazione delle variabili ********************** ' Dim Valore As Byte ' valore da scrivere o leggere su I2CBUS ecc. Dim Dig As Byte ' numero in formato 7 seg Dim Th As Byte ' byte alto di temperatura Dim Tl As Byte ' byte basso di temperatura Dim Cifc As Byte ' cifra delle centinaia Dim Cifd As Byte ' cifra delle decine Dim Cifu As Byte ' cifra delle unita Dim Getdati(2) As Byte ' vettore di 3 byte ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Iniz ' Inizializzazione periferiche Declare Sub Temperatura ' leggo la temperatura Declare Sub Cifre(valore As Byte , Cifc As Byte , Cifd As Byte , Cifu As Byte) ' Converte TH in gradi a cifre Declare Sub Digit(dig As Byte ) ' Converte un numero da 0-9 in 7 segmenti Declare Sub Vis_temp(th As Byte , Tl As Byte) ' visualizza la temperatura ' '************************* 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 Do Call Temperatura ' lettura temperatura Th = Getdati(0) ' prelevo il byte alto Tl = Getdati(1) ' prelevo il byte basso Call Vis_temp(th , Tl) ' visualizzo la temperatura 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 0 ' scrive DY1 off I2cwbyte 0 ' scrive DY2 off I2cwbyte 0 ' scrive DY3 off I2cwbyte 0 ' scrive DY4 off I2cstop I2csend Wds1621 , Cfg ' chiedo, il Reg. di Config. I2creceive Rds1621 , Valore ' leggo il Reg. di Config. Valore = Valore And 1 ' Elimino tutti i bit tranne Bit 0 If Valore = 1 Then ' risulta non attiva la conversione ' di temperatura I2cstart ' sequenza di Start per I2CBUS I2cwbyte Wds1621 ' comunico lo Slave address I2cwbyte Cfg ' chiedo, il Reg. di Config. I2cwbyte &B00001010 ' Scrivo il Reg. di Config. ' bit1= 1 polarita "1" ' bit0= 0 conversione continua I2cstop Waitms 50 ' ritardo End If I2csend Wds1621 , Strct ' start conversione Temperatura End Sub ' ' ********************** Leggo la temperatura **************************** ' Questa procedura legge il valore di temperatura ' Parametri: ' Ingresso : nulla ' Uscita : Getdati(0), contiene TH, byte alto temperatura ' Getdati(1), contiene TL, byte basso temperatura ' ************************************************************************ ' Sub Temperatura ' leggo la temperatura I2csend Wds1621 , Rtemp ' chiedo, lettura temperatura I2creceive Rds1621 , Getdati(1) , 0 , 2 ' leggo TH e TL End Sub ' ' ***************** Converte un numero da 0 a 9 in 7 segmenti *********** ' Questa procedura converte una cifra da 0 a 9 nel formato 7 segmenti, se ' il valore e maggiore = 11 il display risulta spento, se = 10 viene ' rappresentato il segno negativo. ' Parametri: ' Ingresso : dig as byte, valore da 0 a 9 ' 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 < 10 Then ' il numero risulta minore di 16 Dig = Lookup(dig , Tab_7seg) ' leggo in tabella il valore Else If Dig > 10 Then ' se vera spengo il dispaly Dig = 0 Else ' risulta essere = 10 Dig = 64 ' visualizzo il segno "-" End If End If End Sub ' ' ***************** Converte 1 byte in due cifre temperaturav ************* ' Questa procedura converte 1 byte da 0 a 255 in temperatura dove da ' 0 a 125 sono gradi centigradi positivi (+0..+125), mentre da 255 a 201 sono ' gradi centigradi negativi (-0...-55), in pratica il bit7 indica il segno, ' i gradi negativi si ottengono con il complemento. Es: Not 255=0, Not 201=54 ' Parametri: ' Ingresso : Valore as byte, valore da 0 a 255 ' Uscita : ' ************************************************************************ ' Sub Cifre(valore As Byte , Cifh As Byte , Cifl As Byte , Cifu As Byte) If Valore > 127 Then ' la temperatura risulta negativa Cifc = 10 ' attivo il segno meno Valore = Not Valore ' complemento il valore Else If Valore > 99 Then ' se positiva, supera 99 Cifc = 1 ' attivo il numero 1 delle centinaia Valore = Valore - 100 ' sottraggo 100 Else Cifc = 11 ' non supera 99, spengo la cigra ' delle centinaia End If End If If Valore > 9 Then ' supera 9 Cifd = Valore / 10 ' ricavo la cifra delle decine Cifu = Cifd * 10 ' ricavo la cifra delle unita Valore = Valore - Cifu Cifu = Valore Else If Cifc = 11 Then ' minore di 9 e cifra centinaia spenta Cifd = 11 ' spengo la cifra delle decine Else If Cifc = 10 Then ' minore di nove, e temp. negativa Cifd = 11 ' spengo la cifra delle decine Else Cifd = 0 ' minore di 9 e cifra centinaia attiva ' visualizzo uno zero End If End If Cifu = Valore ' salvo il valore delle unita End If End Sub ' ' *********************** Visualizza la temperatura *********************** ' Questa procedura permette di visualizzare la temperatura indicata da 2 byte ' TH byte alto e TL byte basso. ' TL indica il mezzo grado 0 o 128 (0 .. 0.5). ' TH indica i gradi 0 a 125 (+0..+125), e 255 a 21 ( -0..-54). ' Parametri: ' Ingresso : TH as byte, valore byte alto ' TL as byte, valore byte basso ' Uscita : nulla ' ************************************************************************ ' Sub Vis_temp(th As Byte , Tl As Byte) ' visualizza la temperatura I2cstart ' sequenza di START I2cwbyte Wsaa1064 ' slave address I2cwbyte Dig1 ' punto al diplay 1 (DY1) Call Cifre(th , Cifc , Cifd , Cifu) ' converto in 3 cifre Call Digit(cifc) ' converto la cifra centinaia in 7 seg. I2cwbyte Dig ' scrivo il primo display Call Digit(cifd) ' converto la cifra decine in 7 seg. I2cwbyte Dig Call Digit(cifu) ' converto la cifra unita in 7 seg. Dig = Dig Or 128 ' attivo il decimal point I2cwbyte Dig ' scrivo il terzo display If Tl = &H80 Then ' visualizzo il mezzo grado Call Digit(5) ' converto la cifra unita in 7 seg. Else Call Digit(0) ' converto la cifra unita in 7 seg. End If I2cwbyte Dig ' scrivo il quarto display I2cstop ' sequenza di stop End Sub ' ' ************* Tabella conversione per cifra a 7 segmenti ***************** Tab_7seg: ' num. 0 1 2 3 4 5 6 7 8 9 Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F ' ************************************************************************** '