' ********************************************************************** ' * File: Corso_BASCOMAVR_061.BAS * ' * Versione: 1.1 * ' * Data: 25.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 061 del corso BASCOM AVR. ' A/D converter: tramite menù si può selezionare la modalità di conversione ' usata tra le seguenti: ' - conversione singola di tutti gli ingressi ad ogni pressione tasto; ' - conversione media di tutti gli ingressi ad ogni pressione tasto; ' - conversione singola di tutti gli ingressi ripetuta automaticamente; ' - conversione media di tutti gli ingressi ripetuta automaticamente. ' Nel caso della conversione media l'utente ha anche la possibilità di ' scegliere il numero di conversioni su cui calcolare la media. ' Il programma si presenta e mostra le conversioni su 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. ' ' 25/01/10: Corso_BASCOMAVR_061.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.1 32 26 PCO ADC0 ADC0 ' CN4.4 31 25 PC1 ADC1 ADC1 ' CN4.11 21 15 PC2 ADC2 ADC2 ' CN4.12 19 13 PC3 ADC3 ADC3 ' CN3.16 13 7 PC4 ADC4 SDA ADC4 ' CN3.15 12 6 PC5 ADC5 SCL ADC5 ' CN3.11 16 10 ADC6 ADC6 ' CN4.2 33 27 ADC7 ADC7 ' CN3.17 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. 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 '************************ 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 Declare Sub Shwconn_adc() ' Rappresenta legenda con collegamento ingressi analogici Declare Sub Shwonecnv_adc() ' Acquisisce e rappresenta ingressi analogici con conversione singola Declare Sub Shwavgcnv_adc() ' Acquisisce e rappresenta ingressi analogici con conversione media '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Conversioni ingressi analogici GMM AM08" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare ingressi analogici da" Print "convertire sulla GMM TST3, come indicato da seguente tabella." Print "Per ogni ingresso viene rappresentata sulla console la corrispondente tensione." Call Ini_adc() ' Inizializza linee e sezione A/D converter usate Do ' Inizio ciclo infinito Print ' Presenta menù con le possibili operazioni Print " S) Conversioni singole su pressione tasto" Print " M) Conversioni medie su pressione tasto" Print " s) Conversioni singole ripetute" Print " m) Conversioni medie ripetute" Print "Effettuare la scelta premendo il tasto associato: "; Choice = Waitkey() ' Attende scelta operazione da eseguire Printbin Choice ' Rappresenta scelta effettuata Print Print ' Distanzia menù da rappresentazioni seguenti Select Case Choice ' Controlla scelta convertita Case "S": ' Scelta conversioni singole su pressione tasto Print "Premere F per terminare, altri tasti per convertire." Call Shwconn_adc() ' Rappresenta legenda con collegamento ingressi analogici Do ' Inizio ciclo conversioni Call Shwonecnv_adc() ' Acquisisce e rappresenta ingressi analogici con conversione singola Choice = Waitkey() ' Attende pressione tasto su console Loop Until Choice = "F" ' Ripete fino a pressione tasto "F" Case "M": ' Scelta conversioni medie su pressione tasto Input "Inserire conversioni per media (multiplo di 2, <=64): " , Ncnv Print "Premere F per terminare, altri tasti per convertire." Call Shwconn_adc() ' Rappresenta legenda con collegamento ingressi analogici Do ' Inizio ciclo conversioni Call Shwavgcnv_adc() ' Acquisisce e rappresenta ingressi analogici con conversione media Choice = Waitkey() ' Attende pressione tasto su console Loop Until Choice = "F" ' Ripete fino a pressione tasto "F" Case "s": ' Scelta conversioni singole ripetute Print "Conversioni in corso; premere F per terminare." Call Shwconn_adc() ' Rappresenta legenda con collegamento ingressi analogici Do ' Inizio ciclo conversioni Call Shwonecnv_adc() ' Acquisisce e rappresenta ingressi analogici con conversione singola Waitms 50 ' Ritardo tra acquisizioni Choice = Inkey() ' Verifica pressione tasto su console Loop Until Choice = "F" ' Ripete fino a pressione tasto "F" Case "m": ' Scelta conversioni medie ripetute Input "Inserire conversioni per media (multiplo di 2, <=64): " , Ncnv Print "Conversioni in corso; premere F per terminare." Call Shwconn_adc() ' Rappresenta legenda con collegamento ingressi analogici Do ' Inizio ciclo conversioni Call Shwavgcnv_adc() ' Acquisisce e rappresenta ingressi analogici con conversione media Waitms 50 ' Ritardo tra acquisizioni Choice = Inkey() ' Verifica pressione tasto su console Loop Until Choice = "F" ' Ripete fino a pressione tasto "F" Case Else: ' Scelta non valida Printbin &H07 ' Emette un BEL di avviso sulla console End Select Print ' Separa 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() ' Alcuni segnali A/D usati hanno molteplici funzioni e quindi devono essere ' settati in input senza pull up Ddrc = &H00 ' Setta PortC.0÷5=ADC0÷5 del uP in input Portc = &H00 ' 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) ' Rappresenta su console la legenda con collegamento ingressi analogici del Mini ' Modulo su GMM TST3 ' Ingresso: Nulla ' Uscita: Nulla Sub Shwconn_adc() Print " ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 ADC6 ADC7" Print "CN4.1 CN4.4 CN4.11 CN4.12 CN3.16 CN3.15 CN3.11 CN4.2" Print " Volt Volt Volt Volt Volt Volt Volt Volt" End Sub ' Acquisisce tutti gli ingressi analogici disponibili con conversione singola e ' rappresenta su console le combinazioni e le tensioni ottenute ' Ingresso: Nulla ' Uscita: Nulla Sub Shwonecnv_adc() For Chadc = 0 To 7 ' Ciclo per gli 8 canali disponibili su A/D converter Cmbadc = Getadc(chadc) ' Converte canale dell'A/D converter Voltadc = Cmbadc ' Determina tensione da combinazione Voltadc = Voltadc * Qadc ' Tramite quantizzazione Gstr = Fusing(voltadc , "0.###") ' Formatta tensione con una cifra intera e tre decimali Print Gstr ; " "; ' Rappresenta tensione formattata Next Chadc Printbin Cret ' Mantiene rappresentazione su stessa riga End Sub ' Acquisisce tutti gli ingressi analogici disponibili con conversione media e ' rappresenta su console le combinazioni e le tensioni ottenute ' Ingresso: Ncnv = numero conversioni per media (multiplo di 2, <=64) ' Uscita: Nulla Sub Shwavgcnv_adc() For Chadc = 0 To 7 ' Ciclo per gli 8 canali disponibili su A/D converter Call Getavg_adc(chadc , Ncnv) ' Acquisisce canale dell'A/D converter con media di Ncnv conversioni Voltadc = Avgadc ' Determina tensione da combinazione media Voltadc = Voltadc * Qadc ' Tramite quantizzazione Gstr = Fusing(voltadc , "0.###") ' Formatta tensione con una cifra intera e tre decimali Print Gstr ; " "; ' Rappresenta tensione formattata Next Chadc Printbin Cret ' Mantiene rappresentazione su stessa riga End Sub '******************* Fine procedure usate dal programma ************************