' ********************************************************************** ' * File: Corso_BASCOMAVR_037.BAS * ' * Versione: 1.1 * ' * Data: 06.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 037 del corso BASCOM AVR. ' Genera onda quadra della frequenza impostata da console, tramite Timer, su ' segnale collegato al LED rosso L2. L'attivazione del LED naturalmente non ' varia al variare della frequenza in quanto il segnale generato è sempre un ' onda quadra con duty cycle al 50%. ' 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 Z1 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. ' ' 06/10/09: Corso_BASCOMAVR_037.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 2-3 ; J3 in 1-2 ; J8 in 2-3 !!! ' Risorsa pin Z1 pin Segnale Segnale uP ' GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' LED L2 12 6 PC5 ADC5 SCL PC5 ' ' Segnale pin COMx pin CN5 pin Z1 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. Pinl2 Alias Portc.5 ' Bit con segnale d'uscita collegato a LED rosso L2 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 ******************************* '************************ Dichiarazioni variabili ****************************** Dim Freq As Byte ' Valore inserito per settaggio frequenza '************************ Dichiarazioni procedure ****************************** Declare Sub Ini_tmrirq() ' Inizializza timer per generazione interrupt periodico '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Pinl2 = 1 ' Inizializza segnale collegato ad L2 come uscita digitale alta Ddrc.5 = 1 Call Ini_tmrirq() ' Inizializza timer per generazione frequenza Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Genera frequenza su segnale collegato a LED rosso della GMM TST3" Print "Montare Mini Modulo su Z1 della GMM TST3." Print "La frequenza generata sul segnale collegato ad L2 è inversamente proporzionale" Print "alla costante di tempo inserita, da un minimo di 255->1807 Hz ad un massimo" Print "di 15->30720 Hz. Per dettagli vedere commenti del programma." Do ' Inizio ciclo infinito Input "Inserire nuova costante di tempo per frequenza (1..255): " , Freq ' Il valore inserito determina la frequenza generata, tramite la costante di ' tempo che viene caricata nel Timer2. In dettaglio: ' Frequenza conteggio Timer2 = Frequenza clock/8 = 7372800/8 = 921600 Hz ' Frequenza interrupt Timer2 = Frequenza conteggio Timer2/costante tempo ' Frequenza generata da programma = Frequenza interrupt Timer2/2 ' infatti il segnale viene generato dalla procedura di risposta all'interrupt ' periodico del Timer2, che lo complementa. Servono quindi due interrupts per ' ottenere il periodo completo (semiperiodo basso+semiperiodo alto). ' Il tempo di risposta all'interrupt (entrata, esecuzione ed uscita dalla ' procedura di risposta senza Nosave) in questo programma dura circa 16 usec, ' quindi le costanti di tempo troppo basse (da 1 a 14) generano comunque la ' stessa frequenza massima di circa 30722 Hz. Ocr2 = Freq ' Carica costante di tempo inserita ed imposta frequenza Loop ' Fine ciclo infinito Stop Timer2 ' Ferma TIMER2 e funzioni associate End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Inizializza generazione interrupt periodico con auto reload da compare, tramite ' TIMER2 del microcontrollore usato per tutte le gestioni temporali del programma. ' I commenti di questa procedura indicano concisamente le operazioni svolte ma ' informazioni dettagliate sono disponibili nel data sheet del microcontrollore ' e nell'aiuto in linea del BASCOM. Sub Ini_tmrirq() Config Timer2 = Ctc , Compare = Disconnect , Clear Timer = 1 , Prescale = 8 ' TIMER2 come 8 bit timer con clear on compare, conteggio Fclock/8 On Oc2 Timer2_irq ' Definisce procedura risposta interrupt di compare del TIMER2 Ocr2 = 255 ' Carica costante di tempo massima -> frequenza minima Enable Compare2 ' Abilita interrupt da compare del TIMER2 Enable Interrupts ' Abilitazione generale interrupts Start Timer2 ' Attiva TIMER2 End Sub ' Procedura di risposta all'interrupt periodico associato al TIMER2. ' Complementa uscita su cui generare segnale della frequenza impostata. ' La procedura di risposta anche se minimale usa registri del microprocessore ' e non può essere dichiarata con la direttiva Nosave. Timer2_irq: Pinl2 = Not Pinl2 ' Inverte stato segnale collegato a L2 Return '******************* Fine procedure usate dal programma ************************