' ********************************************************************** ' * File: Corso_BASCOMAVR_074.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 074 del corso BASCOM AVR. ' Simula una stampante parallela con interfaccia CENTRONICS, usando il Mini ' Modulo GMM AM08. ' I dati inviati alla stampante simulata sono salvati in un buffer circolare ' e rappresentati sulla console seriale, in ASCII. L'interfaccia CENTRONICS ' del sistema che comanderebbe la stampante (es. PC) 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, con cavo DB25M+DB25M dritto (1:1). ' Il programma si presenta e mostra i dati inviati alla stampante su una console ' seriale dotata di 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: On Int0; Enable Int0. ' ' 14/06/10: Corso_BASCOMAVR_074.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 Pind.2 ' Bit con segnale d'ingresso collegato a /STROBE CENTRONICS Pinmode Alias Pinb.2 ' Bit con segnale d'ingresso collegato a MODE CENTRONICS Pinack Alias Portb.0 ' Bit con segnale d'uscita collegato ad /ACK CENTRONICS Pinpempty Alias Portc.3 ' Bit con segnale d'uscita collegato a PE CENTRONICS Pinselect Alias Portb.3 ' Bit con segnale d'uscita collegato a SELECT CENTRONICS Pinbusy Alias Portb.0 ' Bit con segnale d'uscita 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 Lenbufprn Alias 255 ' Lunghezza buffer circolare per dati stampante Maxfilprn Alias 185 ' Numero dati anti riempimento buffer stampante Minfilprn Alias 135 ' Numero dati ripresa riempimento buffer stampante '************************ Dichiarazioni costanti ******************************* '************************ Dichiarazioni variabili ****************************** Dim Wpntprn As Byte ' Puntatore scrittura buffer circolare dati stampante Dim Rpntprn As Byte ' Puntatore lettura buffer circolare dati stampante Dim Datprn As Byte ' Dato inviato alla stampante Dim Bufprn(lenbufprn) As Byte ' Buffer circolare per dati stampante Dim Hlpbprn1 As Byte ' Prima variabile byte di aiuto per stampante Dim Hlpbprn2 As Byte ' Seconda variabile byte di aiuto per stampante '************************ Dichiarazioni procedure ****************************** Declare Sub Genack_prn() ' Genera impulso su segnale /ACK dell'interfaccia CENTRONICS Declare Sub Inisim_prn() ' Inizializza linee per simulazione stampante CENTRONICS '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Call Inisim_prn() ' Inizializza linee collegate ad interfaccia CENTRONICS come stampante Print ' Separa da precedenti indicazioni, andando su nuova riga Print Print " Simulazione stampante parallela CENTRONICS" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare GMM TST3:CN4,CN3 ad" Print "interfaccia CENTRONICS collegata al posto della stampante(cavo DB25M+DB25M)." Print "I dati inviati alla stampate dall'interfaccia CENTRONICS sono rappresentati" Print "sulla console in formato ASCII." Do ' Inizio ciclo infinito If Wpntprn <> Rpntprn Or Pinbusy = 1 Then ' Se buffer stampante circolare con nuovi dati o pieno ' Preleva e rappresenta primo dato nuovo salvato nel buffer stampante Datprn = Bufprn(rpntprn) ' Preleva nuovo dato dal buffer stampante Printbin Datprn ' Rappresenta nuovo dato come chr ASCII ' Aggiorna puntatore lettura buffer stampante in modo circolare If Rpntprn = Lenbufprn Then ' Se raggiunta fine buffer circolare Rpntprn = 1 ' Puntatore lettura buffer stampante ad inizio Else Incr Rpntprn ' Incrementa puntatore lettura buffer stampante End If ' Se buffer stampante era quasi pieno (BUSY attivo) e si è sufficientemente ' svuotato, completa ricezione ultimo dato inviando l'impulso di /ACK e ' disattivando il BUSY If Pinbusy = 1 Then ' Se segnale BUSY dell'interfaccia CENTRONICS attivo If Wpntprn >= Rpntprn Then ' Determina numero dati nel buffer stampante Datprn = Wpntprn - Rpntprn ' Numero dati nel buffer = scrittura-lettura Else Datprn = Lenbufprn - Rpntprn ' Numero dati nel buffer = (Lenbufprn-lettura)+scrittura Datprn = Datprn + Wpntprn End If If Datprn < Minfilprn Then ' Se buffer stampante è sufficientemente vuoto Call Genack_prn() ' Genera impulso su segnale /ACK dell'interfaccia CENTRONICS Pinbusy = 0 ' Disattiva segnale BUSY dell'iterfaccia CENTRONICS End If End If ' Effettua ritardo che simula il tempo di elaborazione del programma ' principale dei dati nel buffer stampante ed assicura che non si riempa ' la console seriale Waitms 10 ' Ritardo 10 ms End If Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Inizializza risorse, variabili e periferiche usate per la simulazione di una ' stampante parallela con interfaccia CENTRONICS. ' Ingresso: Nulla ' Uscita: Wpntprn = puntatore scrittura buffer stampante inizializzato ' Rpntprn = puntatore lettura buffer stampante inizializzato Sub Inisim_prn() Ddrc = Ddrc And &HF8 ' Inizializza segnali collegati a Dx della stampante Ddrd = Ddrd And &H07 ' CENTRONICS come ingressi digitali Config Pinstb = Input ' Inizializza segnale collegato a /STROBE della stampante ' CENTRONICS come ingresso digitale Config Pinmode = Input ' Inizializza segnale collegato a MODE della stampante ' CENTRONICS come ingresso digitale Pinack = 1 ' Inizializza segnale collegato ad /ACK della stampante Config Pinack = Output ' CENTRONICS come uscita digitale alta = disattiva Pinpempty = 0 ' Inizializza segnale collegato a PE della stampante Config Pinpempty = Output ' CENTRONICS come uscita digitale bassa = disattiva Pinselect = 1 ' Inizializza segnale collegato a SELECT della stampante Config Pinselect = Output ' CENTRONICS come uscita digitale alta = attiva Pinbusy = 0 ' Inizializza segnale collegato a BUSY della stampante Config Pinbusy = Output ' CENTRONICS come uscita digitale bassa = disattiva Wpntprn = 1 ' Puntatore scrittura buffer stampante ad inizio Rpntprn = 1 ' Puntatore lettura buffer stampante ad inizio On Int0 Getdat_prn ' Procedura di risposta ad INT0: riceve dato per stampante ' On Int0 Getdat_prn Nosave ' Procedura di risposta ad INT0: riceve dato per stampante Config Int0 = Falling ' Setta INT0 attivo sul fronte di discesa Enable Int0 ' Attiva interrupt INT0 Enable Interrupts ' Abilitazione generale interrupt End Sub ' Genera impulso su segnale /ACK dell'interfaccia CENTRONICS. ' Ingresso: nulla ' Uscita: nulla Sub Genack_prn() Pinack = 0 ' Genera impulso su /ACK della stampante CENTRONICS NOP ' della durata di circa 5 usec NOP NOP NOP NOP Pinack = 1 End Sub ' Procedura risposta ad INT0 attivato dal segnale /STROBE dell'interfaccia ' CENTRONICS, per ogni dato inviato alla stampante. Preleva il dato e lo salva ' nel buffer circolare stampante. ' Le operazioni descritte sono codificate in assembly in modo da usare il minor ' numero di registri del microcontrollore ed ottenere la massima velocità di ' esecuzione. ' Ingresso: Wpntprn = attuale puntatore scrittura buffer stampante ' Rpntprn = attuale puntatore lettura buffer stampante ' Uscita: Wpntprn = attuale puntatore scrittura buffer stampante aggiornato ' Bufprn() = Buffer stampante con dato prelevato ' Pinbusy = Attivo se buffer stampante quasi pieno Getdat_prn: Pinbusy = 1 ' Rallenta stampa attivando segnale BUSY dell'interfaccia CENTRONICS ' Preleva dato da stampare e lo salva nel buffer stampante Hlpbprn1 = Pinc And &H07 ' Preleva stato segnali collegati a linee D3..D1 Hlpbprn2 = Pind And &HF8 ' Preleva stato segnali collegati a linee D8..D4 Bufprn(wpntprn) = Hlpbprn1 Or Hlpbprn2 ' Salva dato D8..D1 nel buffer stampante ' Aggiorna puntatore scrittura buffer stampante circolare If Wpntprn = Lenbufprn Then ' Se raggiunta fine buffer circolare Wpntprn = 1 ' Puntatore lettura buffer stampante ad inizio Else Incr Wpntprn ' Incrementa puntatore scrittura buffer stampante End If ' Determina numero dati attualmente presenti nel buffer circolare della ' stampante, usando i due puntatori allo stesso buffer If Wpntprn >= Rpntprn Then ' Determina numero dati nel buffer stampante Hlpbprn1 = Wpntprn - Rpntprn ' Numero dati nel buffer = scrittura-lettura Else Hlpbprn1 = Lenbufprn - Rpntprn ' Numero dati nel buffer = (Lenbufprn-lettura)+scrittura Hlpbprn1 = Hlpbprn1 + Wpntprn End If ' Controlla se buffer stampante quasi pieno, tramite il numero dati appena ' determinato ed in caso negativo genera impulso su /ACK e disattiva BUSY, ' viceversa esce lasciando BUSY attivo If Hlpbprn1 < Maxfilprn Then ' Se buffer stampante non ha superato il livello massimo riempimento Call Genack_prn() ' Genera impulso su segnale /ACK dell'interfaccia CENTRONICS Pinbusy = 0 ' Disattiva segnale BUSY dell'iterfaccia CENTRONICS End If Return '******************* Fine procedure usate dal programma ************************