' ********************************************************************** ' * File: Corso_BASCOMAVR_013.BAS * ' * Versione: 1.1 * ' * Data: 20.07.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 013 del corso BASCOM AVR. ' Gestisce un generatore di lettere Morse con il buzzer della GMM TST3. ' Il programma attende la ricezione di lettere o numeri dalla linea seriale e ' le genera con codice Morse sul buzzer. La velocità di generazione dei codici ' Morse è lenta in modo da consentire il corretto riconoscimento degli stessi ' anche a personale inesperto; l'unità temporale che usa l'esempio è fissa e ' pari a circa 200 msec. ' La ricezione delle lettere avviene tramite una console seriale dotata di ' tastiera e monitor, 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). ' ' Aggiunte: And, Restore, Read, Data, Shift. ' ' 20/07/09: Corso_BASCOMAVR_013.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 ' hw GMM TST3 GMM 5115 GMM AM08 uP ' Buzzer BZ1 15 9 PB4 MISO PB4 ' ' Segnale pin COMx pin CN5 pin Z1 pin Segnale Segnale ' PC DB9 GMM TST3 GMM TST3 GMM AM08 GMM AM08 uP ' 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. Pinbz1 Alias Portb.4 ' Bit con segnale d'uscita collegato a buzzer BZ1 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 Mchr As Byte ' Carattere da generare in Morse Dim Ichr As Byte ' Indice per ricerca carattere da generare Dim Mcod As Byte ' Codice Morse del carattere da generare Dim Ncmp As Byte ' Numero componenti del codice Morse Dim Icmp As Byte ' Indice componenti del codice Morse Dim Mbit As Byte ' Bit attuale nel codice Morse Dim Del As Long ' Variabile che conta cicli per ritardi '************************ Dichiarazioni procedure ****************************** Declare Sub Del_1unit() ' Genera ritardo di una unità temporale Morse Declare Sub Morse_chr() ' Genera una lettera con codice Morse '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Pinbz1 = 1 ' Inizializza segnale collegato a BZ1 come uscita digitale alta=disattivo Ddrb.4 = 1 Print ' Separa da precedenti indicazioni, andando su nuova riga Print " Generatore di codici Morse tramite buzzer" Print Print "Premere numeri e/o lettere (0..9 , A..Z) da generare con codice Morse..." Do ' Inizio ciclo infinito Mchr = Waitkey() ' Attende ricezione carattere e lo salva If Mchr >= "0" And Mchr <= "Z" Then ' Controlla se carattere valido: da "0" a "Z" Printbin Mchr ' Rappresenta carattere ricevuto su console Call Morse_chr() ' Genera carattere ricevuto in Morse End If Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Genera un ritardo di una unità temporale Morse. Tale durata genera i codici ' Morse lentamente in modo da consentirne il corretto riconoscimento. ' Ingresso: Nulla ' Uscita: Nulla Sub Del_1unit() Del = 0 ' Azzera contatore cicli effettuati per ritardo Do ' Inizio ciclo ritardo Del = Del + 1 ' Incrementa variabile che conta cicli per ritardo Loop Until Del > 23200 ' Fine ciclo ritardo di circa 200 millisecondi End Sub ' Genera una lettera con codice Morse usando la tabella definita nel programma. ' La velocità di generazione dei codici è lenta in modo da consentirne il ' corretto riconoscimento. ' Ingresso: Mchr = variabile con carattere da generare ' Uscita: Nulla Sub Morse_chr() ' Preleva codice Morse e numero componenti relativi al carattere da generare ' dalla tabella definita alla fine del programma Mchr = Mchr - &H30 ' Codice ASCII del carattere da generare parte da 0 Restore Morse ' Punta ad inizio tabella Morse For Ichr = 0 To Mchr ' Ciclo che legge la tabella dall'inizio al carattere da generare Read Mcod ' Preleva codice Morse del carattere Ichr dalla tabella Read Ncmp ' Preleva componenti del carattere Ichr dalla tabella Next Ichr ' Genera carattere in Morse usando il codice ed il numero componenti prelevati ' dalla tabella. Da ricordare che nel codice un bit a 0 equivale ad un punto ' (buzzer attivo per 1 unità temporale) mentre un bit a 1 equivale ad una ' linea (buzzer attivo per 3 unità temporali). Ogni componente è naturalmente ' separato dal successivo da uno spazio (buzzer disattivo per 1 unità ' temporale). For Icmp = 1 To Ncmp ' Ciclo ripetuto per il numero componenti Mbit = Mcod And &H01 ' Ottiene bit meno significativo del codice Pinbz1 = 0 ' Attiva buzzer BZ1 If Mbit = 0 Then ' Se componente attuale è un punto Call Del_1unit() ' Genera ritardo di 1 unità temporale Else ' Componente attuale è una linea Call Del_1unit() ' Genera ritardo di 3 unità temporali Call Del_1unit() Call Del_1unit() End If Pinbz1 = 1 ' Disattiva buzzer BZ1 Call Del_1unit() ' Genera spazio di 1 unità temporale Shift Mcod , Right , 1 ' Shifta codice di un bit a destra Next Icmp ' Genera spazio tra un carattere ed il successivo (buzzer disattivo per 3 ' unità temporali) Call Del_1unit() ' Genera ritardo di 3 unità temporali Call Del_1unit() Call Del_1unit() End Sub '******************* Fine procedure usate dal programma ************************ '******************** Inizio dati usati dal programma ************************** ' Ogni carattere è codificato con due numeri di cui il primo indica il codice ' a bit dei componenti ed il secondo il numero di componenti. Con componenti ' s'intendono sia i punti che le linee con cui ogni lettera è codificata in ' Morse e: ' - il punto equivale ad un bit a 0; ' - la linea equivale ad un bit a 1; ' - nel codice il bit meno significativo è il primo ad essere generato; ' - i caratteri sono ordinati secondo lo standard ASCII a partire da "0"=&H30. ' ' Ad esempio il carattere 1 è codificato da: punto linea linea linea linea ' a bit diventa: 0 1 1 1 1 ' che per l'ordine invertito di generazione diventa: 1 1 1 1 0 ' ovvero in esadecimale HEX: 1E ' con un numero di componenti: 5 ' che in BASCOM AVR diventa: Data &H1E , 5 ' ' Ad esempio il carattere D è codificato da: linea punto punto ' a bit diventa: 1 0 0 ' che per l'ordine invertito di generazione diventa: 0 0 1 ' ovvero in esadecimale HEX: 01 ' con un numero di componenti: 3 ' che in BASCOM AVR diventa: Data &H01 , 3 ' Morse: Data &H1F , 5 ' Carattere 0 Data &H1E , 5 ' Carattere 1 Data &H1C , 5 ' Carattere 2 Data &H18 , 5 ' Carattere 3 Data &H10 , 5 ' Carattere 4 Data &H00 , 5 ' Carattere 5 Data &H01 , 5 ' Carattere 6 Data &H03 , 5 ' Carattere 7 Data &H07 , 5 ' Carattere 8 Data &H0F , 5 ' Carattere 9 Data &H00 , 0 ' Carattere : Data &H00 , 0 ' Carattere ; Data &H00 , 0 ' Carattere < Data &H00 , 0 ' Carattere = Data &H00 , 0 ' Carattere > Data &H00 , 0 ' Carattere ? Data &H00 , 0 ' Carattere @ Data &H02 , 2 ' Carattere A Data &H01 , 4 ' Carattere B Data &H05 , 4 ' Carattere C Data &H01 , 3 ' CArattere D Data &H00 , 1 ' CArattere E Data &H04 , 4 ' CArattere F Data &H03 , 3 ' CArattere G Data &H00 , 4 ' CArattere H Data &H00 , 2 ' CArattere I Data &H0E , 4 ' CArattere J Data &H05 , 3 ' CArattere K Data &H02 , 4 ' CArattere L Data &H03 , 2 ' CArattere M Data &H01 , 2 ' CArattere N Data &H07 , 3 ' CArattere O Data &H06 , 4 ' CArattere P Data &H0B , 4 ' CArattere Q Data &H02 , 3 ' CArattere R Data &H00 , 3 ' CArattere S Data &H01 , 1 ' CArattere T Data &H04 , 3 ' CArattere U Data &H08 , 4 ' CArattere V Data &H06 , 3 ' CArattere W Data &H09 , 4 ' CArattere X Data &H0D , 4 ' CArattere Y Data &H03 , 4 ' CArattere Z '********************* Fine dati usati dal programma ***************************