' ********************************************************************** ' * File: Corso_BASCOMAVR_040.BAS * ' * Versione: 1.1 * ' * Data: 12.10.09 * ' * 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 040 del corso BASCOM AVR. ' Frequenzimetro. ' Il programma misura la frequenza del segnale d'ingresso del TIMER1 usato ' come contatore a 16 bits. La frequenza viene calcolata come numero delle ' transizioni avvenute in una unità di tempo di 0,25 secondi, e viene ' continuamente rappresentata sulla console seriale. Premendo il tasto T12 ' di una TIO 16 collegata al connettore CN4 della GMM TST3, si commuta il ' segnale misurato. ' 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!! ' Nel programma i nomi che identificano i segnali usati sono riferiti allo ' schema elettrico ed al manuale tecnico della GMM TST3!! ' ' Aggiunte: Nessuna. ' ' 12/10/09: Corso_BASCOMAVR_040.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 in 2-3 ; J2 in 1-2 ; J3 in 1-2 ; J5 in 2-3 ; J7 in 2-3 ; J8 in 2-3 ' J9 in 2-3 !!! ' ' TASTO Risorsa pin Z2 pin Segnale Segnale uP ' TIO 16 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' T12 CN4.14 22 16 PD5 T1 T1 ' ' 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. Pint12 Alias Ddrd.5 ' Bit con direzione segnale collegato a tasto giallo T12 della TIO 16 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 = &H0D ' Codice ASCII Carriage Return Const Dtfreq = 0.25 ' Unità di tempo per misura frequenza, in secondi Const Delfreq =(dtfreq * 1000) - 6 ' Ritardo per misura frequenza, in millisecondi '************************ Dichiarazioni variabili ****************************** Dim Count1 As Word ' Variabili con variazioni contate con TIMER1 Dim Oldcount1 As Word ' Precedenti variazioni contate con TIMER1 Dim Dtcount1 As Word ' Numero variazioni nell'unità di tempo Dim Freq As Single ' Variabile per frequenza misurata '************************ Dichiarazioni procedure ****************************** Declare Sub Get_cnt1() ' Preleva contatore valido da TIMER1 '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Pint12 = 0 ' Inizializza segnale collegato a T12 della TIO 16 come ingresso digitale Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Misura frequenza del segnale T1 d'ingresso al TIMER1" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare TIO 16 a CN4 e premere T12." ' Determina e rappresenta su console le caratteristiche della misura effettuata Freq = 1 / Dtfreq ' Determina risoluzione della misura di frequenza Print "La misura ha una risoluzione=" ; Freq ; " Hz e F.max="; Freq = 65535 * Freq ' Determina frequenza massima misurabile Print Freq ; " Hz" Print "Frequenza misurata (Hz):" ' Predispone TIMER1 per la misura di frequenza Config Timer1 = Counter , Edge = Falling , Noise Cancel = 0 ' TIMER1 come 16 bit counter su fronte discesa senza filtro Counter1 = 0 ' Azzera contatore del TIMER1 Oldcount1 = 0 ' Azzera precedente contatore del TIMER1 Start Counter1 ' Avvia contatore del TIMER1 Do ' Inizio ciclo infinito ' La misura frequenza è effettuata prelevando il numero di variazioni del ' segnale avvenute nell'unità di tempo, rapportata ad un secondo. Se ad ' esempio l'unità è 1/4=0,25 secondi ed in questo tempo avvengono 100 ' variazioni, la frequenza sarà 100/0,25=400 Hz. ' E' conveniente scegliere una unità di tempo bassa, in modo da aumentare ' la massima frequenza misurabile; questa coincide con le 65535 variazioni ' massime del contatore a 16 bits nella stessa unità di tempo. Le istruzioni ' precedenti determinano e mostrano sia la risoluzione che la frequenza ' massima definite appunto dall'unità di tempo scelta. ' L'unità di tempo è effettuata con un ritardo che tiene conto anche del ' tempo di elaborazione necessario per calcolare la frequenza. Call Get_cnt1() ' Preleva contatore valido da TIMER1 Dtcount1 = Count1 - Oldcount1 ' Determina numero variazioni nell'unità di tempo Oldcount1 = Count1 ' Aggiorna precedente contatore del TIMER1 Freq = Dtcount1 ' Determina frequenza con numero variazioni Freq = Freq / Dtfreq ' nell'unità di tempo Print Freq ; " "; ' Rappresenta frequenza determinata su console Printbin Cret ' Mantiene rappresentazione su stessa riga Waitms Delfreq ' Effettua ritardo per misura frequenza Loop ' Fine ciclo infinito Stop Counter1 ' Ferma contatore del TIMER1 End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Preleva attuale contatore da TIMER1 assicurando che il valore letto non abbia ' problemi di aliasing dovuti all'overflow del byte meno significativo. ' Questa procedura coincide con l'istruzione Counter1 del BASCOM AVR ed è stata ' realizzata per ragioni di compatibilità e trasportabilità. ' Ingresso: Nulla ' Uscita: Count1 = Attuale valore a 16 bits del TIMER1 Sub Get_cnt1() Count1 = Counter1 End Sub '******************* Fine procedure usate dal programma ************************