' ********************************************************************** ' * File: Corso_BASCOMAVR_054.BAS * ' * Versione: 1.1 * ' * Data: 07.12.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 054 del corso BASCOM AVR. ' Programma di gestione di una linea seriale asincrona aggiuntiva, in interrupt. ' Il Mini Modulo GMM AM08 dispone di una sola linea seriale hw, collegata alla ' periferica USART, e questo programma ne aggiunge una seconda sw, collegata a ' due linee di I/O. La gestione della seriale sw è effettuata tramite le ' istruzioni ad alto livello del BASCOM, associate ad un interrupt, in modo da ' non risultare sospensive, ovvero non interrompono l'esecuzione del programma ' durante la trasmissione e la ricezione di caratteri. ' Paragonando una seriale sw con una hw emergono numerose differenze tra cui ' dei limiti sulla velocità di comunicazione (Baud rate), un carico di lavoro ' notevolmente superiore per il microcontrollore e l'impossibilità di ricevere ' e trasmettere contemporaneamente. ' Il programma prevede le seguenti operazioni sulla seriale sw: ' - comunica con un protocollo fisico di 4800 Baud, 8 Bit x chr, 1 Stop bit, ' Nessuna parità; ' - ogni carattere ricevuto viene riconosciuto da un interrupt, ricevuto e ' salvato in un buffer di ricezione circolare; ' - i caratteri ricevuti in modo non sospensivo vengono visualizzati su console; ' - trasmette i caratteri premuti sulla console. ' Dal punto di vista elettrico la seriale sw del Mini Modulo è a livello TTL e ' normalmente deve essere bufferata per comunicare con altri dispositivi seriali ' esterni. A questo scopo si ricorda l'interfaccia MSI 01 che trasforma una ' seriale TTL in RS 232, RS 422, RS 485 o Current Loop. ' L'utente è in grado di comunicare con la seriale sw tramite la console dotata ' di monitor e tastiera, collegata alla seriale hw, 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: ON INT1, CONFIG INT1, ENABLE INT1 ' ' 07/12/09: Corso_BASCOMAVR_054.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 ' software GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' RX SW CN4.16 24 18 PD3 INT1 PD3 INT1 ' TX SW CN4.13 23 17 PD4 T0 PD4 ' ' 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 ******************************* '************************ Dichiarazioni variabili ****************************** Dim Crxsw As Byte ' Carattere ricevuto da ssriale sw Dim Ctxsw As Byte ' Carattere da trasmettere su seriale sw Dim Rxcsw As Byte ' Carattere ricevuto in interrupt Dim Bufrx(5) As Byte ' Buffer di ricezione per 5 caratteri Dim Wpntrx As Byte ' Puntatore scrittura buffer ricezione Dim Rpntrx As Byte ' Puntatore lettura buffer ricezione Dim Isrxsw As Bit ' Flag carattere ricevuto da seriale sw Dim Key As Byte ' Tasto premuto su console '************************ Dichiarazioni procedure ****************************** On Int1 Ricev_sw ' Procedura di risposta ad INT1 Declare Sub Iniser_sw() ' Inizializza e predispone uso seriale sw Declare Sub Closeser_sw() ' Chiude e termina uso seriale sw Declare Sub Isrxser_sw() ' Gestisce ricezione seriale sw Declare Sub Txser_sw() ' Trasmette carattere su seriale sw '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Print ' Separa precedenti rappresentazioni su console Print Print " Gestione seriale sw con interrupt su GMM AM98 + GMM TST3" Print "Montare Mini Modulo su Z2 della GMM TST3 e collegare dispositivo seriale" Print "esterno (configurato a 4800 Baud, 8 Bit, 1 Stop, Nessuna parita`) come da" Print "schema." Print "Il programma riceve caratteri dalla seriale sw e li rappresenta sulla console" Print "e trasmette i tasti premuti sulla seriale sw." Print Print "La ricezione dalla seriale sw non e` sospensiva ed il programma prosegue anche" Print "se il dispositivo seriale non e` collegato o non trasmette caratteri!!" ' Inizializza la lseriale sw per una velocità di 4800 Baud, 8 Bit x chr, ' 1 stop Bit, Nessuna parità sui segnali di I/O definiti nella precedente ' tabella. ' Nel sorgente le due istruzioni che seguono devono precedere ogni istruzione ' che usa la seriale sw. Open "comd.4:4800,8,N,1" For Output As #1 ' Associa segnale usato come linea di trasmissione, a canale 1 Open "comd.3:4800,8,N,1" For Input As #2 ' Associa segnale usato come linea di ricezione, a canale 2 Call Iniser_sw() ' Inizializza e predispone uso seriale sw Do ' Inizio ciclo infinito Call Isrxser_sw() ' Verifica e riceve carattere da seriale sw If Isrxsw = 1 Then Printbin Crxsw ' Visualizza carattere ricevuto su console End If Key = Inkey() ' Preleva eventuali tasti premuto su console If Key <> 0 Then ' Se tasto premuto Ctxsw = Key ' Copia tasto premuto su carattere da trasmettere Call Txser_sw() ' Trasmette carattere su seriale sw End If Loop ' Fine ciclo infinito Disable Interrupts ' Disabilitazione generale interrupt Call Closeser_sw() ' Chiude e termina uso seriale sw End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Procedura risposta ad INT1 attivato dallo Start bit del carattere ricevuto. ' Questa tecnica può essere sfruttata solo se il segnale di ricezione della ' seriale sw (RX SW) è in grado di generare interrupt sul fronte di discesa. ' La tecnica inoltre non rende sospensiva la ricezione dalla stessa seriale ' liberando di inutile lavoro il microcontrollore. ' Ingresso: Wpntrx = attuale puntatore scrittura buffer ricezione ' Uscita: Wpntrx = attuale puntatore scrittura buffer ricezione aggiornato ' Bufrx() = Buffer di ricezione con carattere ricevuto Ricev_sw: Get #2 , Rxcsw ' Riceve chr appena iniziato con seriale sw, associata a canale 2 Bufrx(wpntrx) = Rxcsw ' Salva chr ricevuto nel buffer ricezione Incr Wpntrx ' Incrementa puntatore scrittura in modo circolare If Wpntrx > 5 Then Wpntrx = 1 End If Gifr.7 = 1 ' Resetta flag INTF1 per cancellare tutte Return ' le transizioni del chr ' Inizializza e predispone uso seriale sw ' Ingresso: Nulla ' Uscita: Wpntrx = puntatore scrittura buffer ricezione inizializzato ' Rpntrx = puntatore lettura buffer ricezione inizializzato Sub Iniser_sw() Wpntrx = 1 ' Inizializza puntatore scrittura buffer ricezione Rpntrx = 1 ' Inizializza puntatore lettura buffer ricezione Config Int1 = Falling ' INT1 triggera su fronte discesa Enable Int1 ' Attiva interrupt INT1 Enable Interrupts ' Abilitazione generale interrupts End Sub ' Gestisce ricezione seriale sw ' Ingresso: Rpntrx = attuale puntatore lettura buffer ricezione ' Uscita: Rpntrx = attuale puntatore lettura buffer ricezione aggiornato ' Isrxsw = flag carattere ricevuto da seriale sw ' Crxsw = eventuale carattere ricevuto Sub Isrxser_sw() If Wpntrx <> Rpntrx Then ' Verifica se carattere ricevuto tramite INT1 e salvato nel buffer circolare Crxsw = Bufrx(rpntrx) ' Preleva carattere ricevuto da buffer ricezione Incr Rpntrx ' Incrementa puntatore lettura in modo circolare If Rpntrx > 5 Then Rpntrx = 1 End If Isrxsw = 1 ' Indica carattere ricevuto e prelevato Else Isrxsw = 0 ' Indica carattere non ricevuto End If End Sub ' Trasmette carattere su seriale sw, provvedendo a disabilitare gli interrupts ' in modo da non variare le temporizzazioni e quindi il frame del carattere ' in trasmissione. ' Ingresso: Ctxsw = carattere da trasmettere ' Uscita: Nulla Sub Txser_sw() Disable Interrupts ' Disabilitazione generale interrupt Put #1 , Ctxsw ' Trasmette carattere su seriale sw, associata a canale 1 Enable Interrupts ' Abilitazione generale interrupt End Sub ' Chiude e termina uso seriale sw. ' Nel sorgente le due istruzioni che seguono devono venire dopo tutte le ' istruzioni che usano la seriale sw. ' Ingresso: Nulla ' Uscita: Nulla Sub Closeser_sw() Close #1 ' Chiude canali associati alla seriale sw Close #2 End Sub '******************* Fine procedure usate dal programma ************************