' ********************************************************************** ' * File gmbad.bas - Rel. 1.2 con Bascom 8051 IDE e LIB 2.0.11.0 * ' * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * ' * Scheda: GMB HR168 + GMM ACZero * ' * Tel. +39 051 892052 Fax. +39 051 893661 * ' * http://www.grifo.com http://www.grifo.it * ' * by Graziano Gaiba del 02.02.05 * ' ********************************************************************** ' ' Questo demo offre due operativita' per la linea di ingresso analogico su CN7: ' 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. ' ' ' 24.02.04 - Rel 1.1 By Graziano Gaiba ' ' 02.02.05 - Rel 1.2 By Graziano Gaiba ' ' Modificato per funzionare con GMM ACZero ' ' ' !!!!!!!!!!!!!!!!!!!!! ATTENZIONE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Nel menu Options/Compiler/Misc impostare: ' - Byte End(hex) ad almeno A0 ' ' ' '****************** Direttive del compilatore ************************** ' $regfile = "8951cc03.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 Ee_timeout = 5000 ' Timeout programmazione EEPROM interna ' ' '****************** Dichiarazione delle variabili ********************** ' ' Uso generico Dim S1 As String * 1 ' Stringa di un carattere Dim T As Byte ' Byte di uso generico Dim M As Byte Dim S As Byte Dim Id As Word 'Usate dal demo A/D Dim Cmb As Long , Kcmb As Long ' Combinazione teorica e reale Dim Kcal As Long 'Usata per leggere e scrivere la EEPROM interna della CPU e da conversione A/D Dim Ind As Word ' ' '****************** Dichiarazione delle procedure ********************** ' 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 ' '************************* Programma main ****************************** ' Main: Do Print Chr(clrscr) ' Pulisce lo schermo Print "Demo 1.2 per Modulo GMB HR168 d.s. 110104" Print Call Demoad() Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' ' ' Demo di utilizzo dell'ingresso A/D. ' La sezione d'ingresso analogica della GMB HR168 e` basata su ' componenti di precisione comunque soggetti a piccole tolleranze. ' Per compensarle e` preferibile acquisire l'ingresso ' analogico tramite calibrazione software. ' Sub Demoad Print "La sezione d'ingresso analogica della GMB HR168 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 CN8 un segnale analogico di riferimento vicino al" Print "fondo scala (2,5V se J11 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 CN8 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" 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 ' ' ' 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. ' 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 ' ' ' Setta in input tutti i port ' Sub Setp01234input() P0 = &HFF ' Setta P1 in input S = P0 Adcf = &H00 ' Setta tutto P1 come I/O P1 = &HFF ' Setta P1 in input S = P1 P2 = &HFF ' Setta P2 in input S = P2 P3 = &HFF ' Setta P3 in input S = P3 P4 = &HFF ' Setta P4 in input S = P4 End Sub ' ' ' Sub Leggi_attesa() Waitms 200 S = Inkey() End Sub ' ' ' Sub Richiedi_tasto() Print Print "Premere tasto per uscire" Print End Sub ' ' ' Inizializza il demo ' Sub Init() Disable Interrupts 'Disabilita gli interrupts Auxr = &H0C 'Seleziona Eram Su Area Dati Esterna Eecon = &H00 'Disabilita Eeprom Del Micro P0 = &HFF P1.1 = 1 P1.2 = 1 P3.2 = 1 P3.3 = 1 P3.4 = 1 P3.5 = 1 P3.6 = 1 P3.7 = 1 End Sub