' ********************************************************************** ' * File: Corso_BASCOMAVR_076.BAS * ' * Versione: 1.1 * ' * Data: 03.09.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 076 del corso BASCOM AVR. ' Contatori transizioni da ingressi optoisolati a 32 bit. ' Il programma conta le transizioni che avvengono su tutti i segnali d'ingresso ' optoisolati collegati a periferiche hardware preposte (TIMER ed interrupt). ' I conteggi sono sempre gestiti a 32 bit, pari a 4294967296 transizioni in ' modo da fornire un'alta risoluzione sul massimo numero di canali disponibili. ' I numeri delle transizioni vengono continuamente rappresentati sulla console ' seriale. Attivando i 4 ingressi Opto-In 3,4,5,6 collegati al connettore CN4 ' della GMM TST3 come da schema elettrico, si incrementano i relativi contatori. ' Gli usi tipici di questo programma sono ad esempio il conteggio degli impulsi ' forniti da ruote foniche, da generici conta pezzi, gestire la posizione di ' encoder monodirezionali, ecc. ' 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: CONFIG TIMER1; ON OVF1; ENABLE OVF1; START COUNTER1; STOP COUNTER1. ' ' 03/09/10: Corso_BASCOMAVR_076.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 !!! ' ' Segnale Risorsa pin Z2 pin Segnale Segnale uP ' esterno GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' Opto-In 3 CN4.15 25 19 PD2 INT0 INT0 ' Opto-In 4 CN4.16 24 18 PD3 INT1 INT1 ' Opto-In 5 CN4.13 23 17 PD4 T0 XCK T0 ' Opto-In 6 CN4.14 22 16 PD5 T1 T1 ' GND CN4.17 20 14 GND - ' +5 Vdc CN4.18 34 28 +5 Vdc - ' ' 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. Pinopto3 Alias Pind.2 ' Bit con segnale d'ingresso collegato ad ingresso Optoisolato 3 Pinopto4 Alias Pind.3 ' Bit con segnale d'ingresso collegato ad ingresso Optoisolato 4 Pinopto5 Alias Pind.4 ' Bit con segnale d'ingresso collegato ad ingresso Optoisolato 5 Pinopto6 Alias Pind.5 ' Bit con segnale d'ingresso collegato ad ingresso Optoisolato 6 Pupopto3 Alias Portd.2 ' Bit abilitazione pull up su segnale collegato ad ingresso Optoisolato 3 Pupopto4 Alias Portd.3 ' Bit abilitazione pull up su segnale collegato ad ingresso Optoisolato 4 Pupopto5 Alias Portd.4 ' Bit abilitazione pull up su segnale collegato ad ingresso Optoisolato 5 Pupopto6 Alias Portd.5 ' Bit abilitazione pull up su segnale collegato ad ingresso Optoisolato 6 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 Tab = &H09 ' Codice ASCII Horrizontal Tab '************************ Dichiarazioni variabili ****************************** Dim Count0l As Byte ' Variabile ad 8 bit con variazioni contate con TIMER0 Dim Count0h As Long ' Variabile a 32 bit con overflow del TIMER0 Dim Count1l As Word ' Variabile a 16 bit con variazioni contate con TIMER1 Dim Count1h As Word ' Variabile a 16 bit con numero overflow del TIMER1 Dim Cntw As Word ' Word per acquisizione numero conteggi Dim Cntl As Long ' Long per acquisizione numero conteggi Dim Cntopto3 As Long ' Variabile a 32 bit con variazioni avvenute su Opto-In 3 Dim Cntopto4 As Long ' Variabile a 32 bit con variazioni avvenute su Opto-In 4 Dim Cntopto5 As Long ' Variabile a 32 bit con variazioni avvenute su Opto-In 5 Dim Cntopto6 As Long ' Variabile a 32 bit con variazioni avvenute su Opto-In 6 '************************ Dichiarazioni procedure ****************************** Declare Sub Get_cnt0() ' Preleva contatore valido da TIMER0 Declare Sub Get_cnt1() ' Preleva contatore valido da TIMER1 Declare Sub Count_optoin5() ' Preleva numero conteggi complessivo da ingresso Opto-In 5 Declare Sub Count_optoin6() ' Preleva numero conteggi complessivo da ingresso Opto-In 6 '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali ' Inizializza i segnali usati come ingressi digitali in modo da poter usare ' la funzione alternativa di contatori. Inoltre si abilita il pull up interno ' sugli stessi segnali in modo da evitare eventuali accoppiamenti quando non ' vengono collegati. Pupopto3 = 1 ' Inizializza segnale Opto-In 3 come ingresso digitale con pull up Config Pinopto3 = Input Pupopto4 = 1 ' Inizializza segnale Opto-In 4 come ingresso digitale con pull up Config Pinopto4 = Input Pupopto5 = 1 ' Inizializza segnale Opto-In 5 come ingresso digitale con pull up Config Pinopto5 = Input Pupopto6 = 1 ' Inizializza segnale Opto-In 6 come ingresso digitale con pull up Config Pinopto6 = Input Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Conta attivazioni di 4 ingressi Optoisolati con 32 bit" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare circuiteria per ingressi" Print "bufferati Optoisolati a CN4 come da schema elettrico." Print "Grazie alle soluzioni adottate il programma conta anche i rimbalzi elettrici" Print "tipici della commutazioni di contatti meccanici." Print "Numero attivazioni:" Print "Opto-In 3 Opto-In 4 Opto-In 5 Opto-In 6" ' Attiva interrupt INT0 usato per conteggi Opto-In 3 Cntopto3 = 0 ' Azzera numero conteggi da Opto-In 3 On Int0 Countint0_irq ' Procedura di risposta ad INT0: riceve dato per stampante Config Int0 = Falling ' Setta INT0 attivo sul fronte di discesa Enable Int0 ' Attiva interrupt INT0 ' Attiva interrupt INT1 usato per conteggi Opto-In 4 Cntopto4 = 0 ' Azzera numero conteggi da Opto-In 4 On Int1 Countint1_irq ' Procedura di risposta ad INT1: riceve dato per stampante Config Int1 = Falling ' Setta INT1 attivo sul fronte di discesa Enable Int1 ' Attiva interrupt INT1 ' Attiva TIMER0 come contatore a 16 bit con interrupt su overflow Count0h = 0 ' Azzera contatore overflow TIMER0 Config Timer0 = Counter , Edge = Falling ' TIMER0 come 8 bit counter su fronte discesa Counter0 = 0 ' Azzera contatore del TIMER0 Start Counter0 ' Avvia contatore del TIMER0 On Ovf0 Counter0_irq ' Definisce procedura risposta interrupt di overflow TIMER0 Enable Ovf0 ' Abilita interrupt da overflow TIMER0 ' Attiva TIMER1 come contatore a 16 bit con interrupt su overflow Count1h = 0 ' Azzera contatore overflow TIMER1 Config Timer1 = Counter , Edge = Falling ' TIMER1 come 16 bit counter su fronte discesa Counter1 = 0 ' Azzera contatore del TIMER1 Start Counter1 ' Avvia contatore del TIMER1 On Ovf1 Counter1_irq ' Definisce procedura risposta interrupt di overflow TIMER1 Enable Ovf1 ' Abilita interrupt da overflow TIMER1 Enable Interrupts ' Abilitazione generale interrupts Do ' Inizio ciclo infinito Print Cntopto3 ; ' Rappresenta numero conteggi complessivo da ingresso Opto-In 3 Printbin Tab ; Tab ' Incolonna rappresentazioni Print Cntopto4 ; ' Rappresenta numero conteggi complessivo da ingresso Opto-In 4 Printbin Tab ; Tab Call Count_optoin5() ' Preleva e rappresenta numero conteggi complessivo da ingresso Opto-In 5 Print Cntopto5 ; Printbin Tab ; Tab Call Count_optoin6() ' Preleva e rappresenta numero conteggi complessivo da ingresso Opto-In 6 Print Cntopto6 ; Printbin Cret ' Mantiene rappresentazione su stessa riga Waitms 100 ' Ritardo tra acquisizioni Loop ' Fine ciclo infinito Stop Counter0 ' Ferma contatore del TIMER0 Stop Counter1 ' Ferma contatore del TIMER1 Disable Interrupts ' Disabilitazione generale interrupts End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Procedura di risposta all'interrupt esterno INT0: incrementa apposita ' variabile che conta le variazioni avvenute. ' La procedura di risposta sporca i registri del microprocessore ed è stata ' dichiarata senza la direttiva Nosave, in modo da lasciarli inalterati. ' Ingresso: Cntopto3 = Numero variazioni INT0 ' Uscita: Cntopto3 = Numero variazioni incrementato Countint0_irq: Incr Cntopto3 ' Incrementa contatore variazioni INT0 Return ' Procedura di risposta all'interrupt esterno INT1: incrementa apposita ' variabile che conta le variazioni avvenute. ' La procedura di risposta sporca i registri del microprocessore ed è stata ' dichiarata senza la direttiva Nosave, in modo da lasciarli inalterati. ' Ingresso: Cntopto4 = Numero variazioni INT1 ' Uscita: Cntopto4 = Numero variazioni incrementato Countint1_irq: Incr Cntopto4 ' Incrementa contatore variazioni INT1 Return ' Procedura di risposta all'interrupt da overflow del TIMER0: incrementa ' apposita variabile che conta gli overflow avvenuti. ' La procedura di risposta sporca i registri del microprocessore ed è stata ' dichiarata senza la direttiva Nosave, in modo da lasciarli inalterati. ' Ingresso: Count0h = Numero overflow del TIMER0 ' Uscita: Count0h = Numero overflow incrementato Counter0_irq: Incr Count0h ' Incrementa contatore overflow TIMER0 Return ' Procedura di risposta all'interrupt da overflow del TIMER1: incrementa ' apposita variabile che conta gli overflow avvenuti. ' La procedura di risposta sporca i registri del microprocessore ed è stata ' dichiarata senza la direttiva Nosave, in modo da lasciarli inalterati. ' Ingresso: Count1h = Numero overflow del TIMER1 ' Uscita: Count1h = Numero overflow incrementato Counter1_irq: Incr Count1h ' Incrementa contatore overflow TIMER1 Return ' Preleva attuale contatore da TIMER0. Questo dispositivo ha soli 8 bit ed il ' valore letto non può avere problemi di aliasing dovuti ad overflow. ' Questa procedura coincide con l'istruzione Counter0 del BASCOM AVR ed è stata ' realizzata per ragioni di compatibilità e trasportabilità. ' Ingresso: Nulla ' Uscita: Count0l = Attuale valore a 16 bits del TIMER0 Sub Get_cnt0() Count0l = Counter0 End Sub ' 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: Count1l = Attuale valore a 16 bits del TIMER1 Sub Get_cnt1() Count1l = Counter1 End Sub ' Preleva numero conteggi complessivo a 32 bits da ingresso Opto-In 5, ' assicurando che il valore letto non abbia problemi di aliasing dovuti ad ' overflow avvenuti durante l'esecuzione. ' Ingresso: Nulla ' Uscita: Cntopto5 = Attuale conteggio a 32 bits Sub Count_optoin5() Cntl = Count0h ' Salva numero overflow ovvero 24 bit più significativi del conteggio Call Get_cnt0() ' Preleva contatore valido da TIMER0 If Cntl <> Count0h Then ' Se ovvenuto overflow del TIMER0 Call Get_cnt0() ' Ripreleva contatore valido da TIMER0 Cntl = Count0h ' Risalva numero overflow End If Cntopto5 = Cntl ' Ottiene numero conteggi complessivo a 32 bits Shift Cntopto5 , Left , 8 ' 24 bits più significativi da numero overflow Cntopto5 = Cntopto5 Or Count0l ' 8 bits meno significativi da contatore del TIMER0 End Sub ' Preleva numero conteggi complessivo a 32 bits da ingresso Opto-In 6, ' assicurando che il valore letto non abbia problemi di aliasing dovuti ad ' overflow avvenuti durante l'esecuzione. ' Ingresso: Nulla ' Uscita: Cntopto6 = Attuale conteggio a 32 bits Sub Count_optoin6() Cntw = Count1h ' Salva numero overflow ovvero 16 bit più significativi del conteggio Call Get_cnt1() ' Preleva contatore valido da TIMER1 If Cntw <> Count1h Then ' Se ovvenuto overflow del TIMER1 Call Get_cnt1() ' Ripreleva contatore valido da TIMER1 Cntw = Count1h ' Risalva numero overflow End If Cntopto6 = Cntw ' Ottiene numero conteggi complessivo a 32 bits Shift Cntopto6 , Left , 16 ' 16 bits più significativi da numero overflow Cntopto6 = Cntopto6 Or Count1l ' 16 bits meno significativi da contatore del TIMER1 End Sub '******************* Fine procedure usate dal programma ************************