' ********************************************************************** ' * File: Corso_BASCOMAVR_073.BAS * ' * Versione: 1.1 * ' * Data: 14.06.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 073 del corso BASCOM AVR. ' Stampa su una stampante parallela con interfaccia CENTRONICS, i caratteri ' ricevuti dalla linea seriale RS 232 con buffer di salvataggio in interrupt. ' L'interfaccia CENTRONICS della stampante deve essere collegata alle linee di ' I/O del Mini Modulo; tale collegamento deve avvenire con la corrispondenza ' riportata di seguito nelle definizioni, e può essere facilmente realizzato ' con la scheda GMM TST3 ed una scheda che smista i segnali. In dettaglio il ' programma richiede le seguenti connessioni: ' - GMM AM08 montata sullo zoccolo Z2 della GMM TST3; ' - CN5 della GMM TST3 collegato a linea seriale della console; ' - CN4 e CN3 della GMM TST3 collegati a scheda smista segnali su connettore ' DB25 femmina con pin out CENTRONICS; ' - DB25 femmina della scheda smista segnali, collegato ad interfaccia ' CENTRONICS della stampante, con cavo adeguato (ad esempio quello usato ' per collegarla al PC). ' Dei numerosi segnali presenti sull'interfaccia CENTRONICS, questo programma ' li inizializza tutti ma poi usa un sottoinsieme ridotto allo /STROBE e BUSY. ' Il programma si presenta e dopo attende la ricezione di caratteri che vengono ' salvati in un buffer circolare in modalità FIFO (primo che entra e` il primo ' ad uscire). Quando nel buffer sono presenti caratteri questi vengono prelevati ' ed inviati alla stampante che appunto li stampa. ' A tutti gli effetti il programma agisce come un convertitore di una stampante ' parallela in stampante seriale. ' La seriale usa un protocollo fisico costante a 19200 Baud, 8 Bit x chr, 1 Stop ' bit, Nessuna parità e 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: On Serial; Enable Serial. ' ' 14/06/10: Corso_BASCOMAVR_073.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 N.C. ; 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 DB25 Risorsa pin Z2 pin Segnale Segnale uP 'CENTRONICS CENTRONICS GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' D1 2 CN4.1 32 26 PC0 ADC0 PC0 ' D2 3 CN4.4 31 25 PC1 ADC1 PC1 ' D3 4 CN4.11 21 15 PC2 ADC2 PC2 ' D4 5 CN4.16 24 18 PD3 INT1 PD3 ' D5 6 CN4.13 23 17 PD4 T0 XCK PD4 ' D6 7 CN4.14 22 16 PD5 T1 PD5 ' D7 8 CN4.8 27 21 PD6 AIN0 PD6 ' D8 9 CN4.7 26 20 PD7 AIN1 PD7 ' /STROBE 1 CN4.15 25 19 PD2 INT0 PD2 ' /AUTOLF 14 CN3.16 13 7 PC4 ADC4 SDA PC4 ' /RESET 16 CN4.3 30 24 PB1 OC1A PB1 ' MODE 17 CN4.5 28 22 PB2 OC1B /SS PB2 ' PE 12 CN4.12 19 13 PC3 ADC3 PC3 ' /ACK 10 CN4.10 15 9 PB4 MISO PB4 ' SELECT 13 CN4.9 14 8 PB3 MOSI PB3 ' BUSY 11 CN4.6 29 23 PB0 ICP1 PB0 ' GND 18,19,..,25 CN4.17 20 14 GND -- ' ' 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. Pinstb Alias Portd.2 ' Bit con segnale d'uscita collegato a /STROBE CENTRONICS Pinmode Alias Portb.2 ' Bit con segnale d'uscita collegato a MODE CENTRONICS Pinack Alias Pinb.0 ' Bit con segnale d'ingresso collegato ad /ACK CENTRONICS Pinpempty Alias Pinc.3 ' Bit con segnale d'ingresso collegato a PE CENTRONICS Pinselect Alias Pinb.3 ' Bit con segnale d'ingresso collegato a SELECT CENTRONICS Pinbusy Alias Pinb.0 ' Bit con segnale d'ingresso collegato a BUSY CENTRONICS 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 Lenbufrx Alias 40 ' Lunghezza buffer circolare ricezione da seriale in interrupt '************************ Dichiarazioni costanti ******************************* '************************ Dichiarazioni variabili ****************************** Dim Oldbusy As Bit ' Precedente stato stampante occupata Dim Toutprn As Word ' Contatore timeout stampante Dim Del As Byte ' Variabile per generazione ritardi Dim Chrtoprn As Byte ' Carattere da stampare Dim Bufrx(lenbufrx) As Byte ' Buffer ricezione da seriale in interrupt Dim Rpntrx As Byte ' Puntatore lettura al buffer ricezione Dim Wpntrx As Byte ' Puntatore scrittura al buffer ricezione Dim Hlpb As Byte ' Variabile byte di aiuto ad uso generico '************************ Dichiarazioni procedure ****************************** Declare Sub Ini_prn() ' Inizializza linee per gestione stampante CENTRONICS Declare Sub Prn_chr() ' Stampa carattere con stampante parallela CENTRONICS Declare Sub Ini_serirq() ' Inizializza generazione interrupt da linea seriale '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Call Ini_prn() ' Inizializza linee collegate ad interfaccia CENTRONICS Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Converte stampante parallela CENTRONICS in seriale RS 232" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare GMM TST3:CN4,CN3 ad" Print "interfaccia CENTRONICS della stampante." Print "Ogni carattere ricevuto dalla seriale viene inviato alla stampante parallela." Print "Questa li stampa in corrispondenza dei caratteri di fine riga CR e/o LF o di" Print "riempimento della sua riga." Call Ini_serirq() ' Inizializza generazione interrupt da linea seriale Do ' Inizio ciclo infinito Do Loop Until Wpntrx <> Rpntrx ' Attendo un carattere ricevuto e salvato nel buffer ricezione Chrtoprn = Bufrx(rpntrx) ' Preleva carattere ricevuto da buffer ricezione Incr Rpntrx ' Incrementa puntatore lettura in modo circolare If Rpntrx > Lenbufrx Then ' Se raggiunta fine buffer Rpntrx = 1 ' Riparte da inizio in modo da renderlo circolare End If Call Prn_chr() ' Stampa carattere ricevuto Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Inizializza risorse, variabili e periferiche usate per la gestione di una ' stampante parallela con interfaccia CENTRONICS. ' Ingresso: Nulla ' Uscita: Nulla Sub Ini_prn() Portc = Portc Or &H07 ' Inizializza segnali collegati a Dx della stampante Portd = Portd Or &HF8 ' CENTRONICS come uscite digitali alte Ddrc = Ddrc Or &H07 Ddrd = Ddrd Or &HF8 Pinstb = 1 ' Inizializza segnale collegato a /STROBE della stampante Config Pinstb = Output ' CENTRONICS come uscita digitale alta = disattivo Pinmode = 1 ' Inizializza segnale collegato a MODE della stampante Config Pinmode = Output ' CENTRONICS come uscita digitale alta = attivo Config Pinack = Input ' Inizializza segnale collegato ad /ACK della stampante ' CENTRONICS come ingresso digitale Config Pinpempty = Input ' Inizializza segnale collegato a PE della stampante ' CENTRONICS come ingresso digitale Config Pinselect = Input ' Inizializza segnale collegato a SELECT della stampante ' CENTRONICS come ingresso digitale Config Pinbusy = Input ' Inizializza segnale collegato a BUSY della stampante ' CENTRONICS come ingresso digitale Oldbusy = 0 ' Precedente stato stampante non occupata End Sub ' Stampa un carattere tramite la stampante parallela con interfaccia CENTRONICS, ' di cui usa solo due segnali di controllo /STROBE e BUSY. ' Ingresso: chrtoprn = carattere da stampare ' Uscita: Nulla Sub Prn_chr() If Pinbusy = 0 Or Oldbusy = 0 Then ' Se stampante non occupata o precedentemente non occupata Toutprn = 0 ' Azzera contatore timeout stampante While Pinbusy = 1 And Toutprn < 5000 ' Attende che stampante pronta per un tempo massimo di 5 secondi Waitms 1 ' Ritardo di 1 msec Incr Toutprn ' Incrementa contatore timeout stampante Wend If Pinbusy = 0 Then ' Se stampante pronta ' Stampa carattere: setta linee Dx Hlpb = Chrtoprn ' Setta seganli collegati a linee D3..D1 Hlpb = Hlpb And &H07 Portc = Portc And &HF8 ' Prima azzerandole Portc = Portc Or Hlpb ' E poi settandole con lo stato del carattere da stampare Hlpb = Chrtoprn ' Setta seganli collegati a linee D8..D4 Hlpb = Hlpb And &HF8 Portd = Portd And &H07 ' Prima azzerandole Portd = Portd Or Hlpb ' E poi settandole con lo stato del carattere da stampare For Del = 1 To 60 ' Ritardo di circa 40 usec Next Del ' Genera impulso negativo sul segnale /STROBE in modo da attivarlo e far ' accettare il dato da stampare alla stessa stampante Pinstb = 0 ' Abbassa /STROBE For Del = 1 To 30 ' Ritardo di circa 20 usec Next Del Pinstb = 1 ' Alza /STROBE For Del = 1 To 120 ' Ritardo di circa 80 usec Next Del Oldbusy = 0 ' Setta stampante precedentemente non occupata Else Oldbusy = 1 ' Setta stampante precedentemente occupata End If Else ' Stampante occupata e precedentemente occupata ' In questa condizione si esce senza stampare il carattere. L'utente puo` ' aggiungere qui la gestione della stampante non pronta End If End Sub ' Inizializza generazione interrupt ricezione da linea seriale del microcontrollore. ' 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. ' Ingresso: Nulla ' Uscita: Rpntrx = puntatore lettura al buffer ricezione inizializzato ' Wpntrx = puntatore scrittura al buffer ricezione inizializzato Sub Ini_serirq() Rpntrx = 1 ' Inizializza puntatore lettura buffer ricezione Wpntrx = 1 ' Inizializza puntatore scrittura buffer ricezione On Urxc Serial_irq ' Definisce procedura risposta interrupt ricezione seriale Enable Urxc ' Attiva interrupt ricezione seriale Enable Interrupts ' Abilitazione generale interrupt End Sub ' Procedura di risposta all'interrupt ricezione da linea seriale del microcontrollore. ' La procedura di risposta sporca registri del microprocessore ed è stata ' dichiarata senza la direttiva Nosave. ' Ingresso: Wpntrx = puntatore scrittura al buffer ricezione ' Uscita: Wpntrx = puntatore scrittura al buffer ricezione aggiornato ' Bufrx() = buffer ricezione con eventuale carattere ricevuto Serial_irq: Bufrx(wpntrx) = Udr ' Salva chr ricevuto nel buffer ricezione Incr Wpntrx ' Incrementa puntatore scrittura in modo circolare If Wpntrx > Lenbufrx Then ' Se raggiunta fine buffer Wpntrx = 1 ' Riparte da inizio in modo da renderlo circolare End If Return '******************* Fine procedure usate dal programma ************************