' ********************************************************************** ' * File: Corso_BASCOMAVR_086.BAS * ' * Versione: 1.1 * ' * Data: 17.01.11 * ' * 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 086 del corso BASCOM AVR. ' Programma di gestione di un pannello operatore QTP 03 tramite linea seriale ' hw asincrona. ' Al fine di semplificare il programma, la seriale hw è gestita tramite le ' istruzioni ad alto livello del BASCOM dedicate alla console; quest'ultima ' non è più disponibile in quanto fisicamente sostituita dalla QTP stessa ' che, con la sua funzionalità di dumb terminal, sostituisce la console. ' Le funzionalità del programma riguardano un piccolo sottoinsieme di quelle ' offerte dalla QTP 03 e sono selezionabili da operatore tramite i 3 tasti ' esterni ed il display. ' La comunicazione tra Mini Modulo e QTP avviene con un protocollo fisico ' costante a 19200 Baud, 8 Bit x chr, 1 Stop bit, Nessuna parità. ' Dal punto di vista elettrico la linea seriale asincrona della QTP 03 può ' essere sia RS 232 che TTL e può quindi essere collegata al Mini Modulo con ' entrambe. ' ' Aggiunte: Nessuna. ' ' 17/01/11: Corso_BASCOMAVR_086.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 pin CN3 pin CN5 pin Z2 pin Segnale Segnale uP ' QTP 03 QTP 03 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' TX 3 3 9 3 RxD RS232 RxD ' RX 5 2 10 4 TxD RS232 TxD ' GND 8 5 20 14 GND - 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 Esc = 27 ' Codice ASCII di escape '************************ Dichiarazioni variabili ****************************** Dim Chrx As Byte ' Carattere ricevuto Dim Cur_qtp As Byte ' Parametro per tipo cursore della QTP Dim Buz_qtp As Byte ' Stato buzzer QTP Dim Col_qtp As Byte ' Parametri per posizione cursore della QTP Dim Row_qtp As Byte Dim Tout As Byte ' Contatore timeout Dim Gstr As String * 22 ' Stringa per visualizzazione valori e messaggi Dim G As Single ' Variabile per grandezza da visualizzare Dim Shwgron As Bit ' Flag rappresentazione grandezza attiva Dim Msgsfton As Bit ' Flag scorrimento messaggi attivo Dim Hlpb As Byte ' Variabile di aiuto ad uso generico '************************ Dichiarazioni procedure ****************************** ' Procedure per QTP 03 Declare Sub Clear_qtp() ' Cancella tutto il display della QTP Declare Sub Clreol_qtp() ' Cancella display della QTP fino a fine linea Declare Sub Cur_type_qtp(byval Cur_qtp As Byte) ' Setta tipo cursore della QTP Declare Sub Buz_attr_qtp(byval Buz_qtp As Byte) ' Setta stato Buzzer della QTP Declare Sub Pos_cur_qtp(byval Col_qtp As Byte , Byval Row_qtp As Byte) ' Posiziona cursore della QTP Declare Sub Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali ' Le istruzioni d'uso non vengono mostrate su console in quanto ora coincide ' con la QTP 03. ' Effettuare seguenti operazioni prima di usare il programma: ' - Montare Mini Modulo su Z2 della GMM TST3. ' - Fornire un adeguata alimentazione alla QTP 03. ' - Tramite SETUP LOCALE configurare QTP 03 a: ' COMMUNICATION:Norm. ' BAUD RATE: 19200 ' STOP BIT: 1 ' KEY-CLICK: ON ' Sl.ADD.(Hex): Indifferente ' EEPROM DATA: INIT ' - Collegare linea seriale da CN5 GMM TST3 a CN3 QTP 03 come riportato nelle ' definizioni. ' - Configurare QTP 03 per la comunicazione asincrona e posizionare J1, J2 ' per il collegamento effettuato (linea TTL od RS 232), come indicato nel ' suo manuale. ' - Collegare 3 pulsanti normalmente aperti a CN3 della QTP 03 come riportato ' nel suo manuale. ' - Premere i tre pulsanti della QTP per effettuare le operazioni associate, ' come descritto nelle seguenti istruzioni. ' - Il tasto 1 varia lo stato del buzzer in modo sequenziale tra disattivo, ' intermittente ed attivo. ' - Il tasto 2 attiva e disattiva la rappresentazione di una grandezza sulla ' seconda riga del display. ' - Il tasto 3 attiva e disattiva la rapresentazione di un messaggio a ' scorrimento sulla prima riga del display. Call Clear_qtp() ' Cancella display della QTP Call Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Printbin Esc ; 33 ; 83 ; 0 ; 0 ' Assicura shift messaggi disattivo: ESC ! S nmess lungh Print "Corso BASCOM AVR:086"; ' Presenta programma e concise indicazioni d'uso Print "premere tasti su QTP"; ' su display della QTP Call Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Printbin Esc ; 33 ; 67 ; 0 ' Memorizza messaggio 0: ESC ! C n.mess car.0÷car.19 Print "Rappresentazione mes"; Call Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Printbin Esc ; 33 ; 67 ; 1 ' Memorizza messaggio 1: ESC ! C n.mess car.0÷car.19 Print "saggio a scorrimento"; Buz_qtp = 0 ' Inizializza stato buzzer disattivo Shwgron = 0 ' Rappresentazione grandezza disattiva Msgsfton = 0 ' Scorrimento messaggi disattivo Do Chrx = Inkey() ' Verifica se tasto premuto su QTP e lo preleva Select Case Chrx ' Controlla chr ricevuto=codice tasto premuto Case "1": ' Tasto 1 QTP premuto Incr Buz_qtp ' Varia stato buzzer in modo sequenziale If Buz_qtp = 3 Then ' Se superato ultimo stato Buz_qtp = 0 ' Reinizializza stato buzzer disattivo End If Call Buz_attr_qtp(buz_qtp) ' Setta stato Buzzer della QTP Case "2": ' Tasto 2 QTP premuto Shwgron = Not Shwgron ' Complementa flag rappresentazione grandezza Call Pos_cur_qtp(1 , 2) ' Posiziona cursore QTP ad inizio seconda riga Call Clreol_qtp() ' Elimina precedente rappresentazione If Shwgron = 1 Then ' Se rappresentazione grandezza attivata Print "Grandezza =" ; ' Rappresenta etichetta su QTP Call Cur_type_qtp(0) ' Disattiva cursore Else ' Rappresentazione grandezza disattivata Call Cur_type_qtp(85) ' Attiva cursore blocco lampeggiante End If Case "3": ' Tasto 3 QTP premuto Msgsfton = Not Msgsfton ' Complementa flag scorrimento messaggi Call Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta If Msgsfton = 1 Then ' Se scorrimento mesaggi attivo Printbin Esc ; 33 ; 83 ; 0 ; 40 ' Attiva shift messaggi 0,1: ESC ! S nmess lungh Else ' Se scorrimento mesaggi disattivo Printbin Esc ; 33 ; 83 ; 0 ; 0 ' Disattiva shift messaggi 0,1: ESC ! S nmess lungh End If End Select If Shwgron = 1 Then ' Se rappresentazione grandezza attiva Call Pos_cur_qtp(13 , 2) ' Posiziona cursore a fine etichetta Hlpb = Rnd(255) ' Simula acquisizione grandezza G = Hlpb / 10 ' Simula una cifra decimale sulla grandezza Gstr = Fusing(g , "00.#") ' Visualizza grandezza formattata Print Gstr ; End If Waitms 200 ' Ritardo simulazione ciclo macchina del programma Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Cancella tutto il display della QTP e riporta cursore in HOME ' Ingresso: Nulla ' Uscita: Nulla Sub Clear_qtp() Printbin 12 ' Manda comando cancella pagina: FF End Sub ' Cancella il display della QTP dalla posizione attuale del cursore fino a fine ' linea ' Ingresso: Nulla ' Uscita: Nulla Sub Clreol_qtp() Printbin Esc ; 75 ' Manda comando cancella fino a fine riga: ESC K End Sub ' Setta tipo cursore della QTP in base al parametro passato ' Ingresso: Cur_qtp = tipo cursore (0->disattivo, 85->lampeggiante, 255->fisso) ' Uscita: Nulla Sub Cur_type_qtp(byval Cur_qtp As Byte) Select Case Cur_qtp Case 0 : Printbin Esc ; 80 ' Manda comando disattivazione cursore: ESC P Case 85 : Printbin Esc ; 81 ' Manda comando attivazione cursore lampeggiante: ESC Q Case 255 : Printbin Esc ; 79 ' Manda comando attivazione cursore fisso: ESC O End Select End Sub ' Setta Buzzer della QTP in base al parametro passato ' Ingresso: Buz_qtp = stato buzzer (0->disattivo, 1->intermittente, 2->attivo) ' Uscita: Nulla Sub Buz_attr_qtp(byval Buz_qtp As Byte) Printbin Esc ; 50 ; 255 Select Case Buz_qtp Case 0 : Printbin 0 ' Manda comando Buzzer disattivo: ESC 2 255 0 Case 1 : Printbin 85 ' Manda comando Buzzer intermittente: ESC 2 255 85 Case 2 : Printbin 255 ' Manda comando Buzzer attivo: ESC 2 255 255 End Select End Sub ' Posiziona cursore della QTP sulla posizione definita dai parametri passati, ' che partono da 1 ' Ingresso: Col_qtp = Colonna del cursore ' Row_qtp = Riga del cursore ' Uscita: Nulla Sub Pos_cur_qtp(col_qtp As Byte , Row_qtp As Byte) Printbin Esc ; 89 ' Manda comando posizionamento cursore: Hlpb = Row_qtp + 31 ' ESC Y r+32 c+32 Printbin Hlpb Hlpb = Col_qtp + 31 Printbin Hlpb End Sub ' Attende EEPROM della QTP pronta, con un timeout di sicurezza di circa 500 ' millisecondi ' Ingresso: Nulla ' Uscita: Nulla Sub Wt_eerdy_qtp() Tout = 0 ' Azzera contatore timeout Do Printbin Esc ; 51 ' Manda comando richiesta disponibilità EEPROM: ESC 3 Waitms 100 ' Attende tempo per ricezione risposta Chrx = Inkey() ' Verifica se ricevuta risposta a comando Incr Tout ' Incrementa contatore timeout If Chrx = 6 Then ' Controlla se EEPROM QTP pronta da eventuale risposta ricevuta Tout = 6 ' Setta per uscita immediata End If Loop Until Tout >= 5 ' Ripete fino a EEPROM pronta o timeout scaduto End Sub '******************* Fine procedure usate dal programma ************************