' ********************************************************************** ' * File gmbser.bas - Rel. 1.1 con Bascom 8051 DEMO IDE e LIB 2.0.11.0 * ' * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * ' * Scheda: GMB HR168 + GMM AC2 * ' * 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 24.02.04 * ' ********************************************************************** ' ' Il demo e' un semplice esempio di comunicazione in grado di operare con tutti ' i protocolli elettrici disponibili su CN6 (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. ' ' ' ' !!!!!!!!!!!!!!!!!!!!! ATTENZIONE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Nel menu Options/Compiler/Misc impostare: ' - Byte End(hex) ad almeno A0 ' ' ' 24.02.04 - 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 ************************** ' $regfile = "89c51ac2.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 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 S As Byte Dim S0 As Bit ' Stato driver trasmissione ' Per le procedure di basso livello Dim Char As Byte ' Usata dal demo delle seriali Dim Bitrate As Long ' ' '****************** 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 Call Setp01234input() ' Setta tutti i port in input Do Print Chr(clrscr); ' Pulisce lo schermo Print "Demo 1.1 per GMB HR168 d.s. 110104" Print Print "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 J6, J7 e J8 in 2-3" ' La comunicazione e' a basso livello perche' ' BASCOM non gestisce la direzione ad alto livello Input "Baud rate:" , Bitrate ' Valore = 256 -((2*14745600) /(384 * BaudRate)) oppure ' Valore = 256 -((14745600) /(384 * BaudRate)) a seconda di CKCON per l'UART Bitrate = 384 * Bitrate 'S = 14745600 / Bitrate Bitrate = 14745600 / Bitrate S = Bitrate S = 256 - S Call Ser_a Print "Testare in RS232, poi configurare GMB per un altro protocollo:" Print "togliere alimentazione,settare DSW1:" Print "2=3=OFF,4=5=ON,poi:" Print Print "RS422:" Print "-montare SN75176 o MAX483 su IC10 e IC11" Print "-J5=2-3 J6,J7,J8=1-2 J10=1-2" Print Print "RS485:" Print "-montare SN75176 o MAX483 su IC10" Print "-J5=1-2 J6,J7,J8=1-2 J10=1-2" Print Print "Se la scheda e' a un capo della rete, chiudere J3 e J4 " Print "R attiva o disattiva il trasmettitore" S0 = Disattivo ' memorizzo lo stato P2.3 = 1 ' Setta come uscita Do Call Rxa ' ricevo dalla seriale A If S <> 0 Then ' è presente un carattere nella seriale A Call Txa(s) ' Trasmetto il carattere sulla seriale A S = S Or &H20 ' Metti in minuscolo If S = "r" Then If S0 = Attivo Then ' se era disattivo P2.3 = 1 S0 = Disattivo Else ' viceversa P2.3 = 0 S0 = 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(s 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 = S ' 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 S = Sbuf ' leggo il carattere ricevuto Else S = 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 = S ' Baud rate scelto dall'utente Set Tcon.6 ' T1 in on, start timer1, attivo la comunicazione su A End Sub ' ' ' Setta in input tutti i port ' Sub Setp01234input() P0 = &HFF ' Setta P1 in input S = P0 Adcf = &H00 ' Setta tutto P1 come I/O P1 = &HFF ' Setta P1 in input S = P1 P2 = &HFF ' Setta P2 in input S = P2 P3 = &HFF ' Setta P3 in input S = P3 P4 = &HFF ' Setta P4 in input S = P4 End Sub