' ********************************************************************** ' ** Programma: DEMO_INT.BAS - Versione : 1.1 - 29 Gennaio 1999 ** ' ** Compilatore : BASCOM LT, (IDE V.1.20, LIB V.1.27) ** ' ** Scheda : famiglia core 8051 ** ' ** Ditta: grifo(r) ITALIAN TECHNOLOGY ** ' ** Via Dell' Artigiano 8/6 40016 San Giorgio di Piano (BO) ** ' ** Tel.+39 051 892 052 Fax +39 051 893 661 ** ' ** http://www.grifo.com http://www.grifo.it ** ' ** sales@grifo.it tech@grifo.it grifo@grifo.it ** ' ** ** ' ** Realizzato da: Adriano Pedrielli ** ' ********************************************************************** ' ' Questo programma è utilizzabile direttamente da alcune schede della ' famigla 51 : GPC(r) F2, GPC(r) 51, GPC(r) 323, GPC(r) 324, GPC(r) 451, ' GPC(r) 535, GPC(r) 552, GPC(r) 553, GPC(r) 554, ecc. ' Demo per la gestione in interrupt della seriale. ' La trasmissione avviene in interrupt ridirezionando l'output del PRINT, ' mentre la ricezione mette i caratteri in un buffer circolare. '-------------------------------------------------------------------------- ' '*********************************************************************** ' '****************** Direttive del compilatore ************************** ' $romstart = &H8050 ' indirizzo di partenza del codice macchina $ramstart = &HD000 ' indirizzo di partenza della area dati $ramsize = &H2800 ' pongo a 10K la area dati $crystal = 11059200 ' frequenza di clock del microcontrollore $large ' indirizzamento a 16 bit $noinit ' nessuna inizializzazione da parte del basic $serialoutput = Send ' definisco la procedura di ridirezione della ' trasmissione seriale ' '****************** Dichiarazione delle costanti *********************** ' Dim Baud As Const 253 ' 9600 Baud a 11.0592 MHz, 19200 Baud a 22.1184 MHz, ' '****************** Dichiarazione delle variabili ********************** ' Dim Tra_ok As Bit ' Questa variabile segue l'andamento del bit TI, ' visto che la seriale è in interrupt non è possibile ' testare TI per sapere se la trassmissione e` avvenuta, ' quindi: Tra_ok = 1 è in corso la trassmissione di ' un carattere, Tra_ok = 0 nessun carattere in ' trasmissione. Dim Car As Byte ' variabile che contiene il carattere ricevuto Dim S_buf As Byte ' puntatore di scrittura buffer Dim L_buf As Byte ' puntatore di lettura buffer Dim X As Byte ' variabile per uso generico Rx Alias Scon.0 ' bit RI Tx Alias Scon.1 ' bit TI Dim Ric_buf (15) As Byte ' Buffer per caratteri ricevuti in interrupt Dim Fine_buf As Const 16 ' puntatore di fine buffer (dimensioni buffer + 1) ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Read_buf ' procedura che preleva un carattere dal buffer On Serial Serial_int ' definisco la procedura di risposta all'interrupt ' dalla seriale. ' '************************* Programma main ****************************** ' Main: Waitms 1 ' ritardo per assestamento segnali '********** programmazione a basso livello della seriale *************** ' Tcon = 0 Scon = &B01010010 '01010000 '||||||||__ RI deve essere inizializzato a 0. '|||||||___ TI deve essere inizializzato a 0. '||||||____ Non e` rilevante (nel nostro caso). '|||||_____ Non e` rilevante (nel nostro caso). '||||______ Abilitazione flag di ricezione. '|||_______ Disabilitazione multiprocesor communication '||________ '|________> 8 bits UART ' Tmod = &B00100001 '00100001 '||||||||__ '|||||||__> T0 16 bits timer/counter register '||||||____ T0 utilizzato come Timer. '|||||_____ T0 in off '||||______ '|||______> T1 8 bits timer/counter con autoreload '||________ T1 utilizzato come timer '|_________ T1 in off ' Pcon = &B00000000 '00000000 Il MSB in PCON deve essere a 0 '|________Smod, Se= 1, Raddopppia Il Baud Rate impostato su Baud ' Th1 = Baud ' programmo il Baud Rate Set Tcon.6 ' T1 in on, start timer, abilitazione alla comunicazione ' '********** fine della programmazione manuale della seriale ************ ' Rx = 0 : Tx = 0 ' resetto i flag che attivano interrupt sulla seriale S_buf = 1 : L_buf = 1 ' inizializzo i puntatori del buffer di ricezione Tra_ok = 0 ' resetto il flag di carattere non in trasmissione Enable Serial ' enable interrupt della seriale Priority Set Serial ' priorità massima all interrupt della seriale Enable Interrupts Print Do Print " Attesa caratteri" Print Do For X = 0 To 50 Print " S_buf=" ; S_buf ; " ";' visualizzo lo stato del puntatore in scrittura Print Chr(13); Waitms 100 ' ritardo di 100 ms Next X Read_buf ' controllo il buffer e leggo l'eventuale carattere Loop Until Car <> 0 Print While Car <> 0 ' visualizzo i nuovi caratteri ricevuti Print Chr(Car) ; ' rappresento il carattere letto Print " L_buf=" ; L_buf ; Print " S_buf=" ; S_buf ' visualizzo lo stato dei puntatori Read_buf ' controllo il buffer Wend Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' Procedura di lettura del buffer ' parametri d'ingresso: nessuno ' parametri d'uscita: Car = eventuale carattere contenuto nel buffer; se il buffer è vuoto: Car=0 ' L_buf = puntatore di lettura aggiornato Sub Read_buf If L_buf <> S_buf Then ' confronta puntatore di lettura con quello di scrittura Incr L_buf ' incremento il puntatore di lettura buffer If L_buf = Fine_buf Then ' controllo se non ho sfondato il buffer L_buf = 1 ' altrimenti ripunto all'inizio End If Car = Ric_buf(l_buf) ' leggo il carattere dal buffer Else Car = 0 ' nessun carattere trovato End If End Sub ' ' ' Procedura di risposta all interrupt della seriale con priorità maggiore ' parametri d'ingresso: nessuno ' parametri d'uscita: S_buf = puntatore di scrittura aggiornato ' Ric_buf() = buffer con eventuale carattere ricevto ' Tra_ok = flag di trasmissione in corso aggiornato Serial_int: If Tx = 1 Then ' è scattato l'interrupt per trasmissione avvenuta Tx = 0 ' resetto il flag di interrupt sul Tx Tra_ok = 0 ' resetto il flag di carrattere trasmesso End If If Rx = 1 Then ' è scattato l'interrupt di ricezione di un carattere Rx = 0 ' resetto il flag di interrupt sul Rx Incr S_buf ' incremento il puntatore di scrittura buffer If S_buf = Fine_buf Then ' controllo se non ho sfondato il buffer S_buf = 1 ' altrimenti ripunto all inizio End If Ric_buf(s_buf) = Sbuf ' memorizzo il carattere ricevuto nel buffer End If Return ' ' ' Procedura che ridireziona la trasmissione su seriale, ad esempio il PRINT ' parametri d'ingresso: acc = carattere da trasmettere ' parametri d'uscita: nessuno !Send: Bitwait Tra_ok , Reset ' attendo che il flag sia resettato Tra_ok = 1 ' attivo il flag, che indica carattere in trasmissione MOV SBUF , acc ; ' trasmetto il carattre ret