' ********************************************************************** ' * File: Corso_BASCOMAVR_062.BAS * ' * Versione: 1.1 * ' * Data: 27.01.10 * ' * Ambiente sviluppo: Bascom-AVR Demo Ver. 1.11.9.1 + * ' * + AVR bootloader grifo(r) Ver. 1.2 * ' * Schede: GMM AM08 + GMM TST3 * ' * Sviluppato da: GRIFO(r) Italian Technology * ' * 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 * ' * Autore: Gianluca Angelini * ' ********************************************************************** ' Programma di esempio 062 del corso BASCOM AVR. ' A/D converter: controllo ingresso analogico con banda di controllo, od ' isteresi, e pilotaggio di un'uscita. ' Ogni secondo il programma acquisisce l'ingresso analogico e poi controlla se ' ha superato un limite (set point) con isteresi, impostabili. L'ingresso è ' acquisito usando un canale dell'A/D converter, con media di 8 conversioni, ' ed è rappresentato sulla console assieme agli altri parametri del controllo. ' Inoltre con la console si possono impostare i valori attuali del set point e ' dell'isteresi. Lo stato del controllo è impostato su un'uscita digitale che, ' se collegata ad un apposito attuatore, può intervenire sulla grandezza ' acquisita. ' Il programma si presenta ed usa una console seriale dotata di monitor e ' tastiera con un protocollo fisico costante a 19200 Baud, 8 Bit x chr, 1 Stop ' bit, Nessuna parità. ' Questa console può coincidere con un sistema in grado di gestire una ' comunicazione seriale in RS 232. Al fine di semplificarne l'uso si può ' usare un PC dotato di una linea COMx, che esegue un programma di emulazione ' terminale come HYPERTERMINAL o l'omonima modalità offerta dal BASCOM AVR ' (vedere Configurazioni IDE). ' Il programma funziona solo se la GMM AM08 è montata sullo zoccolo Z2 della ' GMM TST3!! ' ' Aggiunte: Nessuna. ' ' 27/01/10: Corso_BASCOMAVR_062.BAS - Ver 1.1 - By G.A. ' Prima versione. ' ' '*************************** Configurazioni IDE ******************************** ' NOTE: per usare correttamente questo programma demo, eseguire i seguenti ' punti: ' 1) Controllare la presenza del file M8DEF.DAT nella directory di ' installazione del BASCOM-AVR e se non disponibile copiarlo e dopo ' rilanciare l'IDE. ' 2) Nella finestra "Options | Compiler | Chip" impostare: ' Chip: m8def.dat ' XRAM: None ' HW Stack: 64 ' Soft Stack: 32 ' Framesize: 64 ' XRAM waitstate: disattivo ' External Access Enable: disattivo ' 3) Nella finestra "Options | Communication" settare: ' COM port = la linea del PC collegata alla GMM AM08, tramite la GMM TST3 ' Baudrate = 19200 ' Parity = None ' Databits = 8 ' Stopbit = 1 ' Handshake = None ' Emulation = TTY ' Font = Terminal, Normale, 12 punti, colore bianco ' Backcolor = Navy ' 4) Al termine della compilazione, della programmazione del codice nella ' GMM AM08, aprire la finestra di emulazione terminale del BASCOM AVR con ' l'opzione: Tools | Terminal emulator (Ctrl+T) ed a questo punto resettare ' o riaccendere il Mini Modulo. '********************** Direttive del compilatore ****************************** $regfile "M8DEF.DAT" ' File di definizione microcontrollore usato $romstart = &H0 ' Indirizzo inizio codice in FLASH $crystal = 7372800 ' Frequenza quarzo del microcontrollore $hwstack = 64 ' Spazio per stack hardware $swstack = 32 ' Spazio per stack software $framesize = 64 ' Spazio per frame $map ' Genera informazioni di debug $baud = 19200 ' Velocità comunicazione seriale: 19200 Baud ' Altri parametri sono fissi a: 8 bit x chr ' 1 Stop bit ' No parity '******************************* Definizioni *********************************** ' Le risorse usate dal programma sono collegate come illustrato nella seguenti ' tabelle: ' !!! N.B. Sulla GMM TST3 i jumper devono essere posizionati come segue: ' J1 N.C. ; J2 in 1-2 ; J3 in 1-2 ; J5 in 2-3 ; J7 in 2-3 ; J8 in 2-3 ' J9 in 2-3 !!! ' ' Risorsa pin Z2 pin Segnale Segnale uP ' GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' CN4.6 29 23 PB0 ICP PB0 ' CN4.2 33 27 ADC7 ADC7 ' CN4.17 20 14 GND - ' ' Segnale pin COMx pin CN5 pin Z2 pin Segnale Segnale uP ' PC DB9 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' TX 3 3 9 3 RxD RS232 PD0 ' RX 2 2 10 4 TxD RS232 PD1 ' GND 5 5 20 14 GND - ' Da questa tabella si ricava che il cavo di collegamento tra la COM del PC ed ' il CN5 della GMM TST3 è un normale cavo dritto o prolunga. Volendolo ' richiedere alla grifo(r) si deve specificare il codice CCR 9+9E. Pincntr Alias Portb.0 ' Bit con segnale d'uscita collegato ad attuatore controllo Pinrx Alias Ddrd.0 ' Bit con direzione segnale collegato a RxD GMM AM08 Pintx Alias Ddrd.1 ' Bit con direzione segnale collegato a TxD GMM AM08 '************************ Dichiarazioni costanti ******************************* Const Cret = 13 ' Codice ASCII di ritorno di carrello Const Qadc = 2.56 / 1023 ' Quantizzazione A/D converter con fondo scala=Vref=2.56 V '************************ Dichiarazioni variabili ****************************** Dim Choice As Byte ' Tasto premuto su console Dim Chadc As Byte ' Canale sezione A/D converter Dim Cmbadc As Word ' Combinazione determinata da A/D converter Dim Ncnv As Byte ' Numero conversioni A/D per media Dim Idxadc As Byte ' Indice per medie conversioni A/D Dim Avgshift As Byte ' Numero bit da shiftare per ottenere media conversioni Dim Sumadc As Word ' Somma combinazioni A/D converter per media Dim Avgadc As Word ' Combinazione media determinata da A/D converter Dim Voltadc As Single ' Tensione aquisita con A/D converter Dim Gstr As String * 6 ' Stringa per visualizzazione tensione formattata Dim Setpoint As Single ' Set point per controllo Dim Hyster As Single ' Isteresi per controllo Dim Inihyst As Single ' Valore inizio isteresi Dim Cntron As Bit ' Flag con stato controllo Dim Onhyst As Bit ' Flag per controllo in banda isteresi '************************ Dichiarazioni procedure ****************************** Declare Sub Ini_adc() ' Inizializza sezione A/D converter Declare Sub Getavg_adc(byval Chadc As Byte , Byval Ncnv As Byte) ' Acquisisce d'ingresso A/D converter con media '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Pincntr = 1 ' Inizializza segnale collegato ad attuatore controllo come Ddrb.0 = 1 ' uscita digitale alta, ovvero disattiva Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Controllo ingresso analogico GMM AM08" Print "Montare Mini Modulo su Z2 della GMM TST3; collegare ingresso analogico da" Print "convertire tra pin 17 (GND) e 2 (ADC7) di CN4 della GMM TST3; collegare uscita" Print "digitale di controllo su pin 6 di CN4 della GMM TST3 (vedere apposito schema" Print "elettrico per dettagli)." Print "Ogni secondo il programma acquisisce, controlla, comanda l'uscita e rappresenta" Print "i valori coinvolti, sulla console." Print Call Ini_adc() ' Inizializza linee e sezione A/D converter usate Setpoint = 2.0 ' Set point iniziale a 2 Volt Hyster = 0.2 ' Isteresi iniziale di 0.2 Volt Onhyst = 0 ' Controllo non in isteresi Do ' Inizio ciclo infinito Print "S varia set point, I varia isteresi" Print "ADC7(V) S.P.(V) Ist.(V) Attuatore" Inihyst = Setpoint - Hyster ' Determina valore inizio isteresi Do ' Inizio ciclo infinito Call Getavg_adc(7 , 8) ' Acquisisce canale ADC7 dell'A/D converter con media di 8 conversioni Voltadc = Avgadc ' Determina tensione da combinazione media Voltadc = Voltadc * Qadc ' Tramite quantizzazione If Voltadc < Inihyst Then ' Se tensione acquisita sotto banda isteresi Cntron = 1 ' Attuatore controllo attivo Onhyst = 0 ' Controllo non in isteresi End If If Voltadc >= Inihyst And Onhyst = 0 Then ' Se tensione in banda isteresi e controllo non in isteresi Cntron = 1 ' Attuatore controllo attivo End If If Voltadc >= Setpoint Then ' Se tesnsione sopra banda isteresi Cntron = 0 ' Attuatore controllo disattivo Onhyst = 1 ' Controllo in isteresi End If ' Rappresenta valori del controllo grandezza come da legenda visualizzata prima. Print " "; Gstr = Fusing(voltadc , "0.###") ' Formatta tensione con tre cifre decimali Print Gstr ; " "; ' Rappresenta tensione acquisita e formattata Gstr = Fusing(setpoint , "0.###") ' Formatta set point con tre cifre decimali Print Gstr ; " "; ' Rappresenta set point formattato Gstr = Fusing(hyster , "0.###") ' Formatta Isteresi con tre cifre decimali Print Gstr ; " "; ' Rappresenta Isteresi formattata If Cntron = 1 Then ' Rappresenta stato attuatore controllo e setta relativa uscita digitale Print "ON "; Pincntr = 0 ' Setta uscita digitale di controllo bassa, per attivare l'attuatore Else Print "OFF"; Pincntr = 1 ' Setta uscita digitale di controllo alta, per disattivare l'attuatore End If Print " "; ' Elimina eventuale rappresentazione precedente rimasta Printbin Cret ' Mantiene rappresentazione su stessa riga Wait 1 ' Ritardo di 1 sec: definisce la frequenza del controllo ' Controlla se l'utente ha premuto uno dei tasti per variare parametri del ' controllo temperatura come termostato ed in caso affermativo li preleva Choice = Inkey() ' Verifica se tasto premuto su console If Choice >= "a" Then ' Se tasto minuscolo Choice = Choice And &HDF ' Lo converte in in maiuscolo End If Loop Until Choice = "S" Or Choice = "I" ' Esce per scelta valida da utente Print ' Distanzia rappresentazioni seguenti Print Select Case Choice ' Controlla scelta convertita Case "S": ' Scelta variazione Set point: lo preleva da console in gradi centigradi Input "Set point (V): " , Setpoint Case "I": ' Scelta variazione Isteresi: la preleva da console in gradi centigradi Input "Isteresi (V): " , Hyster End Select Print ' Distanzia rappresentazioni seguenti Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Inizializza risorse, variabili e periferiche usate per la conversione A/D. ' Ingresso: Nulla ' Uscita: Nulla Sub Ini_adc() ' Il segnale A/D usato (ADC7) non ha molteplici funzioni e quindi non deve ' essere settato in input senza pull up ' Definisce conversione su richiesta, Prescaler=64 (clock A/D Al 50%), Vref interna=2,56V Config Adc = Single , Prescaler = 64 , Reference = Internal_2.56 Start Adc ' Attiva sezione A/D converter End Sub ' Effettua una serie di conversioni su un canale dell' A/D converter in polling, ' restituendo la combinazione media a 10 bit determinata. ' Ingresso: Chadc = canale da convertire ' Ncnv = numero conversioni per media (multiplo di 2, <=64) ' Uscita: Avgadc = combinazione determinata dalla conversione Sub Getavg_adc(byval Chadc As Byte , Byval Ncnv As Byte) ' Determina numero bit da shiftare per ottenere media conversioni Avgshift = 0 ' Azzera numero bit da shiftare Idxadc = Ncnv ' Copia numero conversioni per media Do Incr Avgshift ' Incrementa numero bit da shiftare Shift Idxadc , Right , 1 ' Shifta copia numero conversioni per media Loop Until Idxadc <= 1 ' Ripete fino a conversioni finite Sumadc = 0 ' Azzera somma combinazioni A/D converter per media For Idxadc = 1 To Ncnv ' Ciclo ripetoto numero conversioni per media Cmbadc = Getadc(chadc) ' Converte canale dell'A/D converter per media Sumadc = Sumadc + Cmbadc ' Aggiorna somma combinazioni A/D converter per media Next Idxadc Avgadc = Sumadc ' Determina media da somma combinazioni A/D converter Shift Avgadc , Right , Avgshift ' shiftandola del numero bit determinato (=dividendola End Sub ' per numero conversioni per media) '******************* Fine procedure usate dal programma ************************