' ********************************************************************** ' * File gmbser.bas - Rel. 1.1 Bascom 8051 DEMO IDE e LIB 2.0.11.0 * ' * GRIFO(R) 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 * ' * sales@grifo.it tech@grifo.it grifo@grifo.it * ' * by Graziano Gaiba del 30.04.03 * ' ********************************************************************** ' ' Il demo e' un semplice esempio di comunicazione in grado di operare con tutti ' i protocolli elettrici disponibili su CN2 (RS 232, RS 422, RS 485, ' current loop o TTL). In dettaglio, tramite funzioni a basso livello, ' e' possibile programmare il baud rate da console, poi ogni carattere ricevuto ' dalla seriale viene ritrasmesso sulla stessa; la ricezione del carattere 'r' ' determina la gestione della direzione (segnale DIR) per RS 422 e RS 485. ' ' 30.04.03 - Rel 1.1 By Graziano Gaiba ' ' Il file compilato non supera i 2048 bytes, quindi puo' essere ' compilato con il demo gratuito di BASCOM 8051. ' '****************** Direttive del compilatore ************************** ' ' Impostare ad 80h il limite per la memoria interna mediante il menu: ' Options/Compiler/Misc $regfile = "grifo_mm.dat" $romstart = &H0 ' indirizzo di partenza del codice ' macchina per FLASH $ramstart = &H0 ' indirizzo di partenza della area ' dati $ramsize = &H100 ' pongo a 256 bytes la area dati $crystal = 14745600 ' frequenza di clock del microcontrollore $baud = 19200 ' velocità di comunicazione RS-232 '$large ' indirizzamento a 16 bit ' solo se si non usa la versione demo $map ' Genera una mappa degli indirizzi ' per ogni linea di codice ' '****************** Dichiarazione delle costanti *********************** ' Const Cret = 13 ' Codice di ritorno di carrello Const Nl = 10 ' Codice nuova linea Const Clrscr = 12 ' codice di clear screen Const Bell = 7 ' codice di Bell Const R = 1 ' valore per leggere in I2C Bus Const W = 0 ' valore per scrivere in I2C Bus ' Codice della scheda sulla quale gira il demo Const Can_gm1 = "1" Const Can_gm2 = "2" Const Gmm_5115 = "3" Const Attivo = 1 ' Valore per attivare il driver 422 o 485 Const Disattivo = 0 ' Valore per disattivare il driver 422 o 485 Tia Alias Scon.1 ' flag di trasmissione avvenuta su seriale A Ria Alias Scon.0 ' flag di ricezione avvenuta su seriale A ' '****************** Dichiarazione delle variabili ********************** ' ' Uso generico Dim S1 As String * 1 ' Input generico Dim V1bit As Bit ' Stato driver trasmissione ' Per le procedure di basso livello Dim Char As Byte Dim Rate As Long ' Baud rate richiesto dall'utente Dim Valore As Byte ' Valore del timer per il baud rate ' Scheda su cui gira il demo Dim Board As Byte ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Ser_a ' Programmazione della seriale A Declare Sub Txa(char As Byte) ' Gestisce la trasmissione sulla seriale A Declare Sub Rxa ' Gestisce la ricezione sulla seriale A ' '************************* Programma main ****************************** ' Main: ' Inizializza il demo Disable Interrupts ' Disabilita gli interrupts Auxr = &H0C ' Seleziona Eram Su Area Dati Esterna Eecon = &H00 ' Disabilita Eeprom Del Micro Adcf = &H00 ' Port 1 come I/O P3 = &HFF ' Setta port 3 in input Do Print Chr(clrscr); ' Pulisce lo schermo Print "Demo 1.1 per GMBHR84 ds100203" Print Print "Modulo usato:" Print "1) GM1" Print "2) GM2 o 5115" Print Print "Scelta: "; Do Board = Inkey ' Attesa sospensiva di un tasto Loop Until Board <> 0 Print Chr(board) ' Spiegazione sulla gestione dell'UART in RS 232 e TTL Print Print "Per RS 232: settare ON gli switch 2 e 3 e OFF gli switch 4 e 5 di DSW1" Print "La Gestione Software e' Bascom,Vedere Documentazione Per piu' informazioni" Print "Settando OFF gli switch 2 e 3 e ON gli switch 4 e 5,sullo zoccolo" Print "vanno i segnali TTL dell'UART." Print Print "Premere un tasto per continuare..." S1 = Waitkey Print Print "Collegare J7 in "; If Board = Can_gm1 Then ' Corretto collegamento del DIR Print "1-2" Else Print "2-3" End If ' La comunicazione e' a basso livello perche' ' BASCOM non gestisce la direzione ad alto livello Input "Baud rate:" , Rate ' Valore = 256 -((14745600) /(384 * BaudRate)) Rate = 384 * Rate Valore = 14745600 / Rate Valore = 256 - Valore Call Ser_a Print "Testare in RS232,poi configurare GMB per altro protocollo:" Print "togliere alimentazione,settare DSW1:" Print "2=3=OFF,4=5=ON,poi:" Print Print "RS422:" Print "-montare SN75176 o MAX483 su IC1 e IC2" Print "-J2=1-2 J3=1-2 J4=1-2 J5=2-3" Print Print "RS485:" Print "-montare SN75176 o MAX483 su IC1" Print "-J2=1-2 J3=1-2 J4=1-2 J5=1-2" Print Print "Scheda a un capo rete->J1 chiuso" Print "R commuta trasmettitore" V1bit = Disattivo ' memorizzo lo stato If Board = Can_gm1 Then P2.3 = 1 ' Setta come uscita Else P1.3 = 1 ' Setta come uscita End If Do Call Rxa ' ricevo dalla seriale A If Char <> 0 Then ' è presente un carattere nella seriale A Call Txa(char) ' Trasmetto il carattere sulla seriale A Char = Char Or &H20 ' Metti in minuscolo If Char = "r" Then If V1bit = Attivo Then ' se era disattivo If Board = Can_gm1 Then P2.3 = 1 Else P1.3 = 1 ' attiva la trasmissione ' del driver 422 o 485 End If V1bit = Disattivo Else ' viceversa If Board = Can_gm1 Then P2.3 = 0 Else P1.3 = 0 ' disattiva la trasmissione ' del driver 422 o 485 End If V1bit = Attivo End If End If End If Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' ' ************** Gestisce la trasmissione sulla seriale A ********************** ' * Questa procedura permette di trasmettere un carattere alla volta sulla * ' * seriale A, il carattere da trasmettere risiede nella variabile CHAR * ' ****************************************************************************** ' Sub Txa(char As Byte) ' Gestisce la trasmissione sulla seriale A Bitwait Tia , Set ' attendo che sia trasmesso il carattere ' precedente Tia = 0 ' resetto il bit di trasmissione Sbuf = Char ' trasmetto il carattere End Sub ' ' ************** Gestisce la ricezione sulla seriale A ************************* ' * Questa procedura restituisce il carattere ricevuto sulla seriale A e lo * ' * mette nella variabile Valore, se non c'è nessun carattere, restituisce il * ' * CHAR= 0. * ' ****************************************************************************** ' Sub Rxa ' Gestisce la ricezione sulla seriale A If Ria = 1 Then Ria = 0 ' resetto il bit di ricezione Char = Sbuf ' leggo il carattere ricevuto Else Char = 0 ' nessun carattere ricevuto End If End Sub ' Inizializzazione baud rate generators Sub Ser_a Tcon = 0 Scon = &B01010010 '01010010 '||||||||__ RI deve essere inizializzato a 0. '|||||||___ TI deve essere inizializzato a 1. '||||||____ Non e` rilevante (nel nostro caso). '|||||_____ Non e` rilevante (nel nostro caso). '||||______ Abilitazione flag di ricezione. '|||_______ Disabilitazione multiprocesor communication '||________ '|________> 8 bits UART ' Tmod = &B00100011 '00100011 '||||||||__ '|||||||__> T0 8 bits timer/counter con autoreload '||||||____ 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 sulla seriale A ' Th1 = Valore ' Baud rate scelto dall'utente Set Tcon.6 ' T1 in on, start timer1, attivo la comunicazione su A End Sub