' ********************************************************************** ' * File gmbi2c.bas - Rel. 1.1 con Bascom 8051 DEMO IDE e LIB 2.0.11.0 * ' * Scheda: GMM 932 + GMB HR84 * ' * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * ' * Tel. +39 051 892052 Fax. +39 051 893661 * ' * http://www.grifo.com http://www.grifo.it * ' * grifo@grifo.it * ' * by Graziano Gaiba del 09.07.04 * ' ********************************************************************** ' ' Questo demo permette di comunicare con disposivi I2C BUS collegati a CN3. ' E' possibile leggere e scrivere byte ad un qualsiasi slave address ed address ' inseriti da console. ' In particolare, in lettura il byte ricevuto viene visualizzato, mentre in ' caso di scrittura il dato inserito viene spedito. ' ' ' 09.07.04 - Rel 1.1 By Graziano Gaiba ' ' Il file compilato non supera i 2048 bytes, quindi puo' essere ' compilato con il demo gratuito di BASCOM 8051. ' '****************** Direttive del compilatore ************************** ' 'N.B. Nella finestra Options | Compiler | Misc effettuare i seguenti ' settaggi: Register File = 89LPC932.DAT ' Byte End (Hex) = A0 ' Size warining = 7167 $regfile "89lpc932.dat" $romstart = &H0 ' Ind. inizio codice in FLASH $ramstart = &H0 ' Ind. inizio area dati in XRAM $ramsize = &H200 ' Dimensioni area dati in XRAM $crystal = 11059200 ' Massima Fclock della scheda $baud = 19200 ' Velocità comunicazione seriale $map ' Genera info per debug ' '****************** Dichiarazione delle costanti *********************** ' Const Cret = 13 ' Codice di ritorno di carrello Const Nl = 10 ' Codice nuova linea Const Clrscr = 12 ' codice di clear screen Const Bell = 7 ' codice di Bell Const Rcint = 7372800 ' Frequenza clock da RC interno Const Qz11m = 11059200 ' Frequenza clock da quarzo esterno ' ' Config Sda = P1.3 Config Scl = P1.2 ' '****************** Dichiarazione delle variabili ********************** ' ' Variabili ad uso generico Dim S0 As Bit ' Bit di uso generico Dim I As Byte , Scelta As Byte Dim Hlpb As Byte , M As Byte ' Byte ad uso generico Dim T As Byte , S As Byte , V As Byte ' Byte di uso generico Dim Hlpw As Word , Ind As Word ' Word ad uso generico Dim Hlpl As Long ' Long ad uso generico ' Variabili per gestione comunicazione seriale, clock e ritardi Dim St As Byte Dim Br As Long ' Buad Rate seriale Dim Cclk As Long ' Frequenza clock della CPU Dim R_cnt As Word , Rit1ms As Word , Rit As Word ' Gestione ritardi ' Variabili per gestione Port di I/O digitale Dim M1 As Byte , M2 As Byte ' Variabili per gestione I2C Dim I2cdato As Byte Dim I2caddr As Word , Slave_addr As Byte , Addr As Byte ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Init() ' Inizializzazione Declare Sub Ritardo(rit As Word) ' Effettua ritardo calibrato Declare Sub Iniser(br As Long , St As Byte) ' Inizializzazione seriale Declare Sub Check ' Verifica periferiche ' '************************* Programma main ****************************** ' Main: Disable Interrupts P1m1 = 0 ' Necessario per la seriale RS232 Call Get_clk ' Preleva frequenza della CPU Call Iniser(19200 , 1) ' Inizializza seriale x console ' ' ' Effettua un ritardo di circa 2 secondi in modo da assicurare la ' partenza del programma di emulazione terminale per console (es. ' HYPERTERMINAL) e contemporaneamente fa` lampeggiare il LED di ' attivita` DL1 della scheda. ' Usa la variabile generale i P0m1 = P0m1 Or &H40 ' Setta P0.6 in modo 3=OpenDrain P0m2 = P0m2 Or &H40 For I = 1 To 16 ' 16 cicli da 125 msec = 2 sec P0.6 = Not P0.6 ' Complementa LED attivita` Call Ritardo(125) ' Ritardo di circa 125 msec Next I Print Print "Demo 1.1 per GMM932 ds300803+GMBHR84 ds220503" Call Check ' Controllo interno ' ' ' Demo gestione interfaccia I2C hardware nelle modalita` Master ' transmit e Master receive ad un bit rate fisso. Consente di leggere ' e scrivere un generico dispositivo I2C, grazie alla possibilita` ' di inserire da console lo Slave addres, l'address ed il dato. ' Usa le variabili generali scelta,hlpw ' ' P1m1 = P1m1 And &HF3 ' Configura P1.2 (SCL) e P1.3 P1m2 = P1m2 And &HF3 ' (SDA) in modo quasi bidirectional P1 = P1 Or &HC0 ' in ingresso Print Print "I2C BUS" Do Print Print "L) Legge" Print "S) Scrive" Print Print "Scelta: "; Do ' Ciclo attesa scelta valida Scelta = Waitkey() Scelta = Scelta - &H20 Loop Until Scelta = "L" Or Scelta = "S" Print Chr(scelta) Print Inputhex "Indirizzo (Es. A000): " , I2caddr Slave_addr = High(i2caddr ) Addr = Low(i2caddr ) Select Case Scelta Case "S": Inputhex "Dato (Es. 0B): " , I2cdato I2cstart ' Start I2cwbyte Slave_addr ' Scrive Slave address I2cwbyte Addr ' Scrive indirizzo I2cwbyte I2cdato ' Scrive il dato all'indirizzo sopra I2cstop ' Stop Case "L": I2cstart ' Start I2cwbyte Slave_addr ' Scrive Slave address I2cwbyte Addr ' Scrive indirizzo I2cstart ' Start ripetuto Slave_addr = Slave_addr Or 1 I2cwbyte Slave_addr ' Scrive Slave address per lettura I2crbyte I2cdato , 9 ' Riceve il dato I2cstop ' Stop Printhex "Dato: " ; I2cdato End Select Loop End ' '************************ Fine del programma *************************** ' ' ' '************************ Procedure di uso generale **************************** ' Legge il byte di configurazione UCFG1 in FLASH grazie alle procedure IAP del ' Boot Rom del P89LPC932. Restituisce la variabile globale cclk settata con la ' frequenza di clock della CPU, senza controllare gli eventuali errori. Sub Get_clk mov A,#&H03 ' Usa comando Misc. Read mov R7,#&H00 ' Legge registro UCFG1 lcall &HFF00 ' Chiama proc. IAP ad ind. PGM_MTP mov A,R7 ' Salva risultato anl A,#&H07 ' Mantiene bit con clock CPU Select Case Acc Case &H00 : Cclk = Qz11m ' Frequenza clock da quarzo esterno Case &H03 : Cclk = Rcint ' Frequenza clock da RC interno End Select End Sub ' ' ' Effettua un ritardo del numero di millisecondi passato nel parametro rit, ' tenendo conto della frequenza di clock salvata nella variabile cclk senza ' usare le istruzioni BASCOM che usano un valore predefinito e costante di ' clock. Sub Ritardo(rit As Word) If Cclk = Rcint Then Rit1ms = 73 ' Valore sperimentale per 1 msec a 7 MHz Else Rit1ms = 110 ' Valore sperimentale per 1 msec a 11 MHz End If Do For R_cnt = 0 To Rit1ms ' Ciclo per ritardo di 1 msec Next R Rit = Rit - 1 Loop Until Rit = 0 End Sub ' ' '************************* Procedure gestione seriale ************************** ' Inizializza la linea seriale con: ' Bit x chr = 8 ' Stop bit = 1 o 2 a seconda del parametro ST ' Parity = None ' Baud rate = valore nel parametro BR ' usando l'apposito baud rate generator del micro e la frequenza di clock salvata ' nella variabile globale cclk. ' Usa le variabili generali hlpw,hlpl Sub Iniser(br As Long , St As Byte) Pcon = Pcon And &HBF ' Azzera bit SMOD0 x settare modo If St = 1 Then Scon = &H52 ' Modo 1 (1 stop),No multiproc,Attiva rx Else Scon = &HDA ' Modo 3 (2 stop),No multiproc,Attiva rx End If Brgcon = &H02 ' Imposta baud rate passato Hlpl = Br * 16 ' Calcola divisore per baud Hlpl = Cclk - Hlpl Hlpl = Hlpl / Br Hlpw = Loww(hlpl) Brgr0 = Low(hlpw) Brgr1 = High(hlpw) Brgcon = &H03 End Sub ' ' ' Controllo correttezza periferiche interne con eventuali ritentativi ' Usa le variabili generali st,t,m,ind,hlpw Sub Check Deecon = &H01 T = Peek(&Hff) Deeadr = &HFF T = 1 Ind = &HF7 Do M = Peek(&H07) If M.7 = 1 Then M = M And &H03 Ind = M + &HF8 T = Peek(ind) Else T = 0 End If St = Deecon And &H80 Loop Until St <> 0 St = Deedat Do S = Peek(ind) Incr Ind If Ind = &HFF Then Ind = &HF9 Do M = S If St = 0 Then Incr T End If Loop Until St.0 = 0 Or T > M Loop Until St = 0 End Sub