' ********************************************************************** ' * File gmbad.bas - Rel. 1.1 con Bascom 8051 IDE e LIB 2.0.11.0 * ' * 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 * ' * sales@grifo.it tech@grifo.it grifo@grifo.it * ' * by Graziano Gaiba del 11.07.03 * ' ********************************************************************** ' ' ' ' Rel. 1.1 11.07.03 - By Graziano Gaiba ' ' Una volta scelto il Mini Modulo, se la linea di ingresso analogico su CN4 e' ' disponibile, questo demo offre due operativita': calibrazione o acquisizione. ' La prima calcola un coefficiente di calibrazione grazie ad un segnale di ' riferimento esterno fornito dall'utente, e lo salva nella EEPROM interna del ' Mini Modulo. ' La seconda preleva il coefficiente di calibrazione dalla EEPROM, acquisice e ' rappresenta di continuo sulla console la combinazione dell'ingresso analogico, ' sia calibrato che non calibrato. Il demo puo' essere usato indifferentemente ' con range 0..2,5 V e 0..10 V. ' Scrive il byte fornito come secondo parametro nella EEPROM interna ' all'indirizzo fornito come primo parametro. ' Si aspetta che la EEPROM interna sia gia' abilitata. ' ' $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 ' '****************** 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 R = 1 ' valore per leggere in I2C Bus Const W = 0 ' valore per scrivere in I2C Bus Const Ee_timeout = 5000 ' Timeout programmazione EEPROM interna ' '****************** Dichiarazione delle variabili ********************** ' ' Codice della scheda sulla quale gira il demo Const Can_gm1 = "1" Const Can_gm2 = "2" Const Gmm_5115 = "3" Dim S As Byte , T As Byte , S1 As String * 1 ' uso generico ' Scheda sulla quale gira il demo Dim Scheda As Byte 'Usate dal demo A/D Dim Cmb As Long , Kcmb As Long ' Combinazione teorica e reale Dim Kcal As Long , M As Byte 'Usata per leggere e scrivere la EEPROM interna della CPU e da conversione A/D Dim Ind As Word , Id As Word ' 'Usate dalla divisione approssimata correttamente Dim Divisore As Long , Dividendo As Long Dim Q As Byte ' Quoziente ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Init() ' Inizializzazione Declare Sub Synch() ' Sincronizzazione Declare Sub Synch_0() Declare Sub Synch_1() Declare Sub Check_ready ' Attende che l'hardware pronto ' Declare Sub Demoad() ' Demo A/D converter in polling o interrupt Declare Sub Scrivi_eeprom(ind As Word , S As Byte) Declare Sub Leggi_eeprom(ind As Word) Declare Sub Adconv(m As Byte) ' Effettua una conversione A/D in polling ' Quoziente intero a 8 bit, correttamente approssimato Declare Sub Divappr(divisore As Long , Dividendo As Long) ' '************************* Programma main ****************************** ' Main: Call Init() ' Inzializza il modulo Print Chr(clrscr); ' Pulisce lo schermo Print "Questo demo funziona esclusivamente con CAN GM1" Print "Proseguire solo se si sta usando il Mini Modulo giusto!" Print "Premere un tasto per continuare..." Do S = Inkey Loop Until S <> 0 Print Print "Modulo usato:" Print "1) CAN GM1" Print "2) CAN GM2" Print Print "Scelta:"; Do Scheda = Inkey ' Attesa sospensiva di un tasto Loop Until Scheda <> 0 Print Chr(scheda) Print Call Check_ready Do Call Demoad Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' Inizializza il demo Sub Init() Disable Interrupts 'Disabilita gli interrupts Auxr = &H0C 'Seleziona Eram Su Area Dati Esterna Eecon = &H00 'Disabilita Eeprom Del Micro End Sub ' ' Procedura di calcolo del quoziente intero a 8 bit, correttamente ' approssimato tra il dividendo ed il divisore passati nei parametri, con la ' tecnica delle sottrazioni sucessive. Sub Divappr(divisore As Long , Dividendo As Long) Q = 0 While Dividendo >= Divisore Dividendo = Dividendo - Divisore Incr Q Wend Rotate Divisore , Right , 1 ' Dimezza divisore per verifica resto If Dividendo >= Divisore Then Incr Q End If End Sub Sub Scrivi_eeprom(ind As Word , S As Byte) Out Ind , S ' Scrive il dato nel latch Eecon = &H52 ' Attiva la scrittura nell'EEPROM Eecon = &HA2 Ind = 0 ' Inizia il conteggio Do Incr Id S = Eecon ' Legge il bit di EEPROM occupata S = S And &H01 ' Se il bit e' a 1 la EEPROM e' occupata Loop Until S = 0 Or Ind = Ee_timeout End Sub ' Legge il byte contenuto nella EEPROM interna all'indirizzo fornito nel ' parametro. ' Si aspetta che la EEPROM interna sia gia' abilitata. Sub Leggi_eeprom(ind As Word) S = Inp(ind) End Sub Sub Demoad Print Chr(clrscr) If Scheda = Can_gm1 Then Print "La sezione d'ingresso analogica della GMB HR84 e` basata su" Print "componenti di precisione comunque soggetti a piccole tolleranze." Print "Per compensarle e` preferibile acquisire l'ingresso" Print "analogico tramite calibrazione software." Print Do Do Print "Selezionare modalita`: Acquisizione,Calibrazione,Fine:"; S1 = Waitkey S1 = Ucase(s1 ) Loop Until S1 = "A" Or S1 = "C" Or S1 = "F" Adcf = &H01 ' Setta P1.0 come ingresso A/D Adclk = &H10 ' Setta clock A/D If S1 = "C" Then ' Gestione modalita` calibrazione Print "Collegare al pin 8 di CN4 un segnale analogico di riferimento vicino al" Print "fondo scala (2,5V se J6 in 1-2) o 10V (se J6 in 2-3) ed inserire la" Input "tensione di tale segnale, in mV (0-10000): " , Kcal Kcmb = Kcal * 1023 ' Determina combinazione teorica If Kcal > 2500 Then Kcmb = Kcmb / 10000 Else Kcmb = Kcmb / 2500 End If Cmb = 0 ' Determina combinazione reale For T = 1 To 64 ' Effettua 64 conversioni Call Adconv(0) ' Conversione ingresso 0 Cmb = Cmb + Ind Next T 'Rotate Cmb , Right , 6 ' Ottiene media delle 64 combinazioni Cmb = Cmb / 64 Kcmb = Kcmb * 10000 ' Ottiene coef. calibrazione a 4 cifre decimali Kcal = Kcmb / Cmb Print Print "Coefficiente calibrazione salvato = " ; Kcal Print Auxr = &H2E ' Deseleziona ERAM ed allunga durata MOVX Eecon = &H02 ' Seleziona EEPROM del micro su area dati esterna Call Scrivi_eeprom(&H07f9 , Low(kcal)) Call Scrivi_eeprom(&H07fa , High(kcal)) Auxr = &H0C ' Seleziona Eram Su Area Dati Esterna Eecon = &H00 ' Disabilita Eeprom Del Micro End If If S1 = "A" Then Auxr = &H2E ' Deseleziona ERAM ed allunga durata MOVX Eecon = &H02 ' Seleziona EEPROM del micro su area dati esterna Call Leggi_eeprom(&H07f9) T = S Call Leggi_eeprom(&H07fa) Kcal = Makeint(t , S) ' Legge coefficiente di calibrazione Auxr = &H0C ' Seleziona Eram Su Area Dati Esterna Eecon = &H00 ' Disabilita Eeprom Del Micro Print "Coefficiente calibrazione prelevato=" ; Kcal Print "Collegare al pin 8 di CN4 un segnale analogico compreso tra 0-2,5V (J6 in" Print "1-2) o 0-10V (J6 in 2-3) e verificare le sottostanti combinazioni. Premere" Print "un tasto per terminare" Print "CH0 acquisito CH0 calibrato" Do Print Chr(cret); Call Adconv(0) ' Converte ingresso 0 Print " " ; Ind; ' Rappresenta combinazione acquisita Kcmb = Ind * Kcal ' Determina combinazione calibrata Cmb = Kcmb / 10000 Print " " ; Cmb; ' Rappresenta comb. calibrata Waitms 300 ' Evita overflow sulla console S = Inkey Loop Until S <> 0 Print End If Adcf = &H00 ' P1 interamente come I/O digitale Loop Until S1 = "F" Else Print "A/D utilizzabile solo su CAN GM1." Do Loop End If End Sub ' Effettua la conversione di un canale dell'A/D converter in polling ' Usa le variabili globali m e ind Sub Adconv(m As Byte) Adcon = M Or &H20 ' Seleziona canale e prepara A/D Adcon = M Or &H28 ' Avvia la conversione Do ' Attende la fine della conversione M = Adcon And &H10 Loop Until M = &H10 Adcon = 0 ' Mette l'A/D in standby Ind = 0 ' Legge la conversione Ind = Addh Rotate Ind , Left , 2 M = Addl And &H03 Ind = Ind Or M End Sub Sub Richiedi_tasto() Print Print "Premere tasto per uscire" Print End Sub 'Attesa che l'hardware sia pronto Sub Check_ready Do ' Ciclo attesa scheda pronta S = P2.1 I2cstart Call Synch_1() Call Synch_0() Call Synch_1() Call Synch_0() Call Synch_0() Call Synch_0() Call Synch_0() Call Synch_0() P2.1 = 1 P2.0 = 0 Call Synch() P2.0 = 1 T = P2.1 Call Synch() P2.0 = 0 Loop Until S <> 0 And T <> 1 End Sub ' Sincronizzazione Sub Synch() nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop End Sub Sub Synch_0() P2.1 = 0 P2.0 = 0 Call Synch() P2.0 = 1 Call Synch() P2.0 = 0 End Sub Sub Synch_1() P2.1 = 1 P2.0 = 0 Call Synch() P2.0 = 1 Call Synch() P2.0 = 0 End Sub