' ********************************************************************** ' * File: gmbi2c.bas - Rel. 1.1 con Bascom AVR IDE e LIB 1.11.7.4 * ' * Schede: GMB HR168 + GMM AM128 * ' * 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 * ' * by Graziano Gaiba del 16.06.05 * ' ********************************************************************** ' ' 16.06.05 - Rel 1.1 By Graziano Gaiba ' Questo demo permette di comunicare con disposivi I2C BUS collegati a CN8. ' In accordo con il Mini Modulo utilizzato, 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. ' ' ' !!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Nel menu Options | Compiler | Chip, impostare: ' ' Chip: M128 ' HW Stack: almeno 64 ' Soft Stack: almeno 32 ' Framesize: almeno 64 ' ' '****************** Direttive del compilatore ************************** ' $regfile = "m128def.dat" $crystal = 7372800 $baud = 19200 ' '****************** Dichiarazione delle costanti *********************** ' Const Bel = 7 Const Cret = 13 Const Clrscr = 12 ' codice di clear screen ' Time out in caso una operazione TWI non riceva risposta Const Ee_timeout = 50000 ' '****************** Dichiarazione delle variabili ********************** ' ' Nessuna variabile globale ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Init() ' Inizializzazione Declare Sub Clrscr() ' Pulisce lo schermo Declare Sub Errore() ' Messaggio di errore Declare Function Leggi_char() As Byte ' Legge un carattere (sospensiva) Declare Sub Demo_twi() ' Invia un comando all'interfaccia TWI, attende che completi e restituisce lo stato Declare Function Twi_cmd(byval Cmd As Byte) As Byte Declare Sub Check_ready() Declare Function Check_ready_2() As Byte ' '************************* Programma main ****************************** ' Main: Call Init() ' Inzializza il modulo ' Spegne i relays Portf.4 = 1 Portf.5 = 1 Portf.6 = 1 Portf.7 = 1 Portb.3 = 1 Portb.2 = 1 Portb.1 = 1 Porte.2 = 1 Print Chr(clrscr); ' Pulisce lo schermo Print "Demo 1.1 per GMM AM128 + GMB HR168" Print Call Check_ready() ' Verifica scheda pronta Do Call Demo_twi() Loop Do Loop End ' '************************ Fine del programma *************************** ' ' ' '****************************************************************************** '* Procedure di gestione degli I/O della GMB HR168 * '****************************************************************************** ' ' ' ' Inizializza il demo ' Sub Init() ' Inizializza la direzionalita' dei port che pilotano gli ingressi optoisolati ' e le uscite a rele': ' IN1-1 - Portb.7 ' IN2-1 - Portb.6 ' IN3-1 - Porte.4 ' IN4-1 - Porte.5 ' IN5-1 - Portd.7 ' IN6-1 - Porte.6 ' IN7-1 - Portb.4 ' IN8-1 - Portb.0 Ddrb.7 = 0 Ddrb.6 = 0 Ddre.4 = 0 Ddre.5 = 0 Ddrd.7 = 0 Ddre.6 = 0 Ddrb.4 = 0 Ddrb.0 = 0 ' IN1-2 - Portc.0 ' IN2-2 - Portc.1 ' IN3-2 - Portc.2 ' IN4-2 - Portc.3 ' IN5-2 - Portc.4 ' IN6-2 - Portc.5 ' IN7-2 - Portc.6 ' IN8-2 - Portc.7 Ddrc = 0 ' OUT A1 - Portf.4 ' OUT A2 - Portf.5 ' OUT B1 - Portf.6 ' OUT B2 - Portf.7 ' OUT C1 - Portb.3 ' OUT C2 - Portb.2 ' OUT D1 - Portb.1 ' OUT D2 - Porte.2 (di default, ovvero con J10 in 3-4) Ddrf.4 = 1 Ddrf.5 = 1 Ddrf.6 = 1 Ddrf.7 = 1 Ddrb.3 = 1 Ddrb.2 = 1 Ddrb.1 = 1 Ddre.2 = 1 End Sub ' '****************************************************************************** '* Procedure di gestione dell'I2C BUS hardware * '****************************************************************************** ' ' ' Scrive il comando passato nel parametro cmd nel registro di conrollo TWI e ' attende il completamento dell'operazione impostata per poi leggere lo stato ' dello stesso controllore e restituirlo. ' Function Twi_cmd(byval Cmd As Byte) As Byte Local Time_out As Word , I As Byte Twcr = Cmd ' Fornisce comando passato Time_out = 0 ' Contatore timeout Do Incr Time_out ' Incrementa contatore Loop Until Twcr.twint = 1 Or Time_out = Ee_timeout ' Legge stato attuale e mantiene bit significativi I = Twsr I = I And &HF8 Twi_cmd = I End Function ' ' ' Dimostrativo dell'utilizzo dell'interfaccia seriale a due fili (TWI). ' Sub Demo_twi() Local S_addr As Word , Time_out As Word Local Dato As Byte , Char As Byte Ddrc.0 = 0 Ddrc.1 = 0 Portc.0 = 1 Portc.1 = 1 'Ddrc = Ddrc And &HCF 'Portc = Portc Or &H30 ' Attiva pull-up Twsr = Twsr And &HFC ' Prescaler tace Twbr = 72 ' Clock rate 46080 Hz Time_out = 0 ' Time-out per stop Print "Demo TWI" Print Print "Azioni:" Print Do Print "A) Scrivere" Print "B) Leggere" Print "C) Fine" Print Print "Scelta: "; Char = Leggi_char() If Char <> "C" Then Print Inputhex "Slave address e indirizzo in hex (Es. A804): " , S_addr Select Case Char Case "A" : Inputhex "Dato in hex (Es. 01): " , Dato Print If Twi_cmd(&Ha4) = &H08 Then ' Start Twdr = High(s_addr) ' Scrive SLA+W If Twi_cmd(&H84) = &H18 Then Twdr = Low(s_addr) ' Scrive indirizzo If Twi_cmd(&H84) = &H28 Then Twdr = Dato ' Scrive dato If Twi_cmd(&H84) = &H28 Then Twcr = &H94 ' Stop ' Attende che lo stop Do ' sia completato o che Incr Time_out ' scada il Time Out Loop Until Twcr.twsto = 0 Or Time_out = Ee_timeout Else Call Errore() Print "dato" End If Else Call Errore() Print "address" End If Else Call Errore() Print "SLA+W" End If Else Call Errore() Print "start" End If Case "B" : If Twi_cmd(&Ha4) = &H08 Then ' Start Twdr = High(s_addr) ' Scrive SLA+W If Twi_cmd(&H84) = &H18 Then Twdr = Low(s_addr) ' Scrive indirizzo If Twi_cmd(&H84) = &H28 Then If Twi_cmd(&Ha4) = &H10 Then ' Ripete start Twdr = High(s_addr) Or 1 ' Scrive SLA+R If Twi_cmd(&H84) = &H40 Then ' Usare Twi_cmd(&HC4) per effettuare piu' letture consecutive ' Intercettare il codice &H50 se la lettura effettuata non ' e' l'ultima della sequenza, altrimenti usare il codice ' qui sotto. If Twi_cmd(&H84) = &H58 Then ' Legge il dato Dato = Twdr Twcr = &H94 ' Stop ' Attende che lo stop Do ' sia completato o che Incr Time_out ' scada il Time Out Loop Until Twcr.twsto = 0 Or Time_out = Ee_timeout Print "Dato letto: " ; Hex(dato) Print Else Call Errore() Print "dato" End If Else Call Errore() Print "SLA+R" End If Else Call Errore() Print "start" End If Else Call Errore() Print "address" End If Else Call Errore() Print "SLA+W" End If Else Call Errore() Print "start" End If End Select Twcr.twen = 0 ' Spegne la periferica TWI End If Loop Until Char = "C" End Sub ' '****************************************************************************** '* Procedure di uso generico * '****************************************************************************** ' ' '**************************** Procedure ******************************** ' ' ********************** Trasmette 25 Line Feed ************************ ' Effettua la funzione di clear screen per una generica console. ' Parametri: ' Ingresso : nulla ' Uscita : nulla ' ************************************************************************ ' Sub Clrscr Local I As Byte For I = 1 To 25 Print Next I End Sub ' ' ' Stampa il messaggio "Errore: " ' Sub Errore() Print "Errore: "; End Sub ' ' ' Legge un carattere dalla seriale in maniera sospensiva, lo stampa e lo ' converte in maiuscolo. ' Function Leggi_char() As Byte Local C As Byte C = Waitkey() Print Chr(c) C = C And &HDF ' Converte un carattere ASCII in maiuscolo Leggi_char = C End Function ' ' ' Funzione di supporto della Check_ready(). ' Function Check_ready_2() As Byte Local Time_out As Word , I As Byte Time_out = 0 ' Contatore timeout Do Incr Time_out ' Incrementa contatore Loop Until Twcr.twint = 1 Or Time_out = Ee_timeout I = Twsr I = I And &HF8 Check_ready_2 = I End Function ' ' ' Controlla che la scheda sia pronta ' Sub Check_ready() Local Check As Byte , Test As Byte Do ' Ciclo attesa scheda pronta Twsr = Twsr And &HFC Check = Twdr Or &HF4 Test.4 = Not Check.3 Twbr = 72 Twcr = &HA4 Check = Check_ready_2() Test = Check Or Twcr If Check = &H09 Then Test = &H67 Else Test.1 = Not Test.1 End If Twdr = &HA0 Twcr = &H84 Check = Check_ready_2() Twcr = &H94 Waitms 27 Loop Until Check = &H18 Or Test <> 1 Twcr.twen = 0 End Sub