' **************************************************************** ' * File: gmbser.pbas - Ver. 1.1 * ' * Compilatore: mikroBasic for PIC by mikroElektronica * ' * IDE: mikroBasic for PIC by mikroElektronica * ' * Versione Compilatore: 1.1.6.0 * ' * Schede: GMM 4620 + GMB HR168 * ' * 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 * ' * by Graziano Gaiba 01.03.05 * ' **************************************************************** ' ' 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' ' o 'R' determina la gestione della direzione (segnale DIR) per RS 422 e RS 485. ' ' Rel 1.1 - by Graziano Gaiba ' Demo di utilizzo a basso livello della periferica EUSART usando una GMB HR168 ' pilotata da un Mini Modulo GMM 4620 ' ' ' ***************** Definizioni del compilatore ****************** ' program uk_gmb_ser ' ' *************** Dichiarazione delle costanti ******************* ' const ASC_r = 114 const ASC_rU = 82 ' ' ******************* Dichiarazione delle Variabili ******************** ' ' Variabili di uso generico dim d_in as byte ' ' ' ******************* Definizione delle procedure ********************* ' ' ' Inizializzazione direzione segnali della CPU sub procedure Init_cpu ' ADCON1=$0f ' Imposta come I/O digitale i pin AN0..12 CMCON=$07 ' Imposta come I/O digitale RA0..4 ' Gli ingressi optoisolati di CN1 sono: ' IN1-1 <-> RA0 ' IN2-1 <-> RA1 ' IN3-1 <-> RB0 ' IN4-1 <-> RB1 ' IN5-1 <-> RA4 ' IN6-1 <-> RC0 ' IN7-1 <-> RC1 ' IN8-1 <-> RC5 trisa.0=1 trisa.1=1 trisa.4=1 trisb.0=1 trisb.1=1 trisc.0=1 trisc.1=1 trisc.5=1 ' Gli ingressi optoisolati di CN2 sono: ' IN1-2 <-> RD0 ' IN2-2 <-> RD1 ' IN3-2 <-> RD2 ' IN4-2 <-> RD3 ' IN5-2 <-> RD4 ' IN6-2 <-> RD5 ' IN7-2 <-> RD6 ' IN8-2 <-> RD7 trisd=$ff ' Le uscite relays di CN3 sono: ' OUT A1 <-> RB4 ' OUT A2 <-> RB5 ' OUT B1 <-> RB6 ' OUT B2 <-> RB7 ' OUT C1 <-> RB3 ' OUT C2 <-> RB2 trisb=trisb and $03 ' Le uscite relays di CN4 sono: ' OUT D1 <-> RA3 ' OUT D2 <-> RC2 (J10 in posizione 3-4) trisa.3=0 trisc.2=0 ' Inizialzza modulo USART (8 bit, 19200 baud rate, ' no parity) Usart_init(19200) end sub ' ' ' Invia una stringa di caratteri alla porta seriale sub procedure print_USART(dim byref txt as char[255]) dim i as byte dim l as byte l = txt[0] for i = 1 to l USART_Write(txt[i]) next i end sub ' ' ' Invia CR + LF sub procedure print_CRLF USART_Write(10) USART_Write(13) end sub ' ' ' Pulisce lo schermo, inviando 25 volte CR + LF. sub procedure clrscr dim i as byte for i = 0 to 24 print_CRLF next i end sub ' ' ' Chiede la pressione di un tasto sub procedure wait_key dim c as byte print_usart("Premere un tasto...") do nop loop until USART_Data_Ready = 1 c = USART_Read end sub ' ' ' Procedura per impostare lo stato dei relays sui connettori CN3 e CN4. ' A seconda del valore dei bits di port_val, ogni relay viene attivato ' (contatto chiuso) o disattivato (contatto aperto). ' I bit di port_val hanno il seguente significato: ' -- CN3 ' port_val.0 pilota il relay OUT A1 ' port_val.1 pilota il relay OUT A2 ' port_val.2 pilota il relay OUT B1 ' port_val.3 pilota il relay OUT B2 ' port_val.4 pilota il relay OUT C1 ' port_val.5 pilota il relay OUT C2 ' -- CN4 ' port_val.6 pilota il relay OUT D1 ' port_val.7 pilota il relay OUT D2 ' ' Ogni bit ha il seguente significato: ' bit Significato ' 0 Relay disattivato (contatto aperto) ' 1 Relay attivato (contatto chiuso) sub procedure set_relays(dim port_val as byte) ' I relays sono pilotati in logica complementata , quindi anche port_val ' deve essere complementato port_val=port_val xor $ff portb.4=port_val.0 portb.5=port_val.1 portb.6=port_val.2 portb.7=port_val.3 portb.3=port_val.4 portb.2=port_val.5 porta.3=port_val.6 portc.2=port_val.7 end sub ' ' ' Trasmissione di un singolo carattere usando il modulo EUSART ' a basso livello. ' Il carattere da trasmettere e' il parametro della procedura. ' La procedura e' bloccante: attende che si liberi il trasmettitore. sub procedure tx_char(dim char_to_tx as byte) ' attende che si liberi il trasmettitore do nop loop until txsta.1 = 1 txreg = char_to_tx end sub ' ' ' Verifica che sia stato ricevuto un carattere. ' Se un carattere e' stato ricevuto restituisce 1, altrimenti 0. sub function rx_status as byte dim kbhit as byte if pir1.5 = 1 then pir1.5 = 0 kbhit = 1 else kbhit = 0 end if Result = kbhit end sub ' ' ' Ricezione di un singolo carattere usando il modulo EUSART ' a basso livello. ' NON check verifica che un carattere si stato effettivamente ' ricevuto. sub function rx_char as byte Result = rcreg end sub ' '********************** Programma principale *************************** ' main: Init_cpu ' Spegne i relays set_relays(0) ' Serve la comunicazione a basso livello perche' il segnale DIR non viene ' gestito dalle istruzioni di alto livello del PIC BASIC PRO. ' Disabilita rilevazione baud-rate automatica, generatore baud-rate a 8 bit baudctl = 0 ' Valore per baud rate 19200 e tenendo conto dei settaggi fatti sopra ' Fosc ' SPBRG = -------------- - 1 ' 16 * BaudRate spbrg = 31 ' Baud rate elevati, modo asincrono, abilta trasmettitore, trasmette a 8 bit txsta = $24 ' Abilita ricevitore, ricezione a 8, abilita porta seriale rcsta = $90 clrscr print_USART("Demo EUSART a basso livello Rel 1.1 per GMM 4620 rel 120304") print_CRLF print_USART("e GMB HR168 rel 110104") print_CRLF print_CRLF print_USART("Viene mostrato come configurare l'accoppiata per comunicazione seriale") print_CRLF print_USART("tipo RS 232, TTL, RS 422, RS 485.") print_CRLF print_USART("Seguendo le istruzioni si puo' provare la comunicazione RS 232 a basso livello,") print_CRLF print_USART("ovvero pilotata da istruzioni assembly anziche' da comandi BASIC.") print_CRLF print_USART("Poi, RS 422 o RS 485 viene configurato ed utilizzato. Anche un segnale di") print_CRLF print_USART("direzione viene usato con il protocollo RS 485.") print_CRLF wait_key print_CRLF print_CRLF print_USART("In RS 232: su GMM 4620 mettere ON i dip switch da 1 a 3, mettere OFF gli altri,") print_CRLF print_USART("mettere OFF i dip switch 2 e 3, mettere ON i dip switch 4 e 5, per avere") print_CRLF print_USART("dei segnali TTL dalla EUSART direttamente sui pin dello zoccolo.") print_CRLF print_USART("Collegare J10 in 1-2.") print_CRLF wait_key print_CRLF print_CRLF print_USART("Collaudare in RS232, poi configurare GMB per un altro protocollo a scelta:") print_CRLF print_USART("Spegnere l'accoppiata, impostare i dip switch:") print_CRLF print_USART("2=3=OFF,4=5=ON, poi:") print_CRLF print_CRLF print_CRLF print_USART("RS422:") print_CRLF print_USART("-installare SN75176 o MAX483 su IC10 e IC11") print_CRLF print_USART("J5=2-3 J6,J7,J8=1-2 J10=1-2") print_CRLF print_CRLF print_CRLF print_USART("RS485:") print_CRLF print_USART("-installare SN75176 o MAX483 su IC10") print_CRLF print_USART("-J5=1-2 J6,J7,J8=1-2 J10=1-2") print_CRLF print_CRLF print_CRLF print_USART("Se l'accoppiata e' all'estremita' di una rete -> J3 e J4 vanno connessi") print_CRLF print_USART("La ricezione del carattere R commuta lo stato del trasmettitore") print_CRLF ' Il segnale DIR per RS 485 e' PORTE.2 trise.2 = 0 porte.2 = 0 for_ever: if rx_status = 1 then d_in = rx_char if (d_in = ASC_r) or (d_in = ASC_rU) then if porte.2 = 0 then porte.2 = 1 else porte.2 = 0 end if end if tx_char(d_in) end if goto for_ever end.