fisertek_300
 
 
Modulo RS 485 
 
 
barra rossa2 
 
L'interfaccia RS 485 è un elemento indispensabile per i miei robot e non potevo trascurarlo dal punto di vista della sicurezza e dell'affidabilità. Ho fatto molte ricerche in rete, trovando schemi con componenti introvabili, finchè l'amico Mauro Soligo, di Padova (max_xxv@tin.it) decide di mandarmi uno schema di RS485 da lui progettato. In chat con Mauro facciamo insieme le correzioni e gli aggiustamenti del caso e ne realizzo due esemplari per le prove.Da subito i due moduli dimostrano un funzionamento eccellente, anche alla velocità di 115.200 bit/s.Ne sono entusiasta e Mauro acconsente alla sua pubblicazione.
 
barra rossa2 
 
Questa pagina descrive un modulo completamente optoisolato in tutte le sue parti, compresa l'alimentazione. (anche quella deve essere isolata altrimenti è inutile optoisolare il MAX 485).Inoltre abbiamo previsto la protezione del bus con un transorb, il terminatore, il pull-up e il pull-down escludibili a seconda della configurazione della rete da fare.Potete creare reti RS485 fino a 32 dispositivi connessi, abilitando i terminatori e i pull solo sul primo e l'ultimo dispositivo della rete e la trasmissione dovrebbe essere possibile fino alla distanza di 1.200 metri. (io l'ho provato con un doppino di 500 metri e funziona perfettamente).Molti utenti in rete mi hanno ringraziato ancor prima di pubblicare questo progetto, aspettandosi che ci fosse qualcosa di complicato nella parte software ma non è così: bisogna comportarsi come per una normale interfaccia RS232 soltanto che bisognerà gestire anche il verso della comunicazione.Questo perché l'interfaccia RS 485 che presento è half duplex. Permette cioè la comunicazione in un solo verso alla volta.Ho pensato di fare un programmino semplicissimo per far comunicare due pic tra loro e poi spiegherò cosa dovrete fare per cambiare verso di comunicazione.Adesso passiamo alla fase pratica del progetto: 
________________________________________________________________________________________ 
 
 
 
 
 
  • Schema elettrico del modulo  
  • Circuito stampato lato rame, basetta da 70 x 100 a 300 dpi  
  • Disegno lato componenti del modulo
  • rs485_600
    _____________________________________________________________________________ 
     
    Il programma 
    Ovviamente occorrono due moduli per connettere due PIC tra loro e due programmi da fare per provare il tutto.  
    Dovremo utilizzare il modulo 16F876, il modulo 16F877, due moduli rs485, il modulo led e un potenziometro. 
    Ci converrà dapprima fare un programma che legge un potenziometro da una porta AD e riporta il valore binario sulla porta B di uno dei PIC, poi trasferiremo questo valore sulla seriale del pic per fare in modo che il valore binario appaia sul secondo pic e poi inseriremo i moduli rs485. 
     
    Progamma base 
     
    /* Legge un potenziometro su RA0 e ne riporta il valore in binario a 
    8 bit sulla porta B.   Per PIC 16F876/877 
    Roma 21/12/03 (c) by Sergio Fiocco */ 
     
    #include <pic.h> 
    #include <stdio.h> 
    #define XTAL_FREQ 4MHZ 
    #include "delay.c" 
     
    main() 
    unsigned short valore; 
    unsigned char valore1; 
     
          TRISB=0; //PORTB tutte uscite 
          TRISC=0; //PORTC tutte uscite  
          ADCON0 = 0b11000001; //setta RA0 come analogico 
          ADCON1 = 0b10000000; 
     
    for(;;) { 
              ADGO = 1; //Fa partire la conversione 
              while(ADGO) 
              continue; //Attende che la conversione sia completa 
     
              valore=ADRESL+(ADRESH<<8); //valore a 10 bit 
              valore1=valore/4; //riporto a 8 bit 
              PORTB=valore1; //riporta il valore1 su portA 
              DelayMs(5); //ritardo per allentare la lettura  
              } 
     
    Ecco il primo listato da compilare e inserire nella demoboard 16F876. 
    Su quella demoboard avremo collegato il modulo led alla porta B e un potenziometro alla porta RA0. 
    Al variare del potenziometro vedremo il relativo valore binario a 8 bit rappresentato sui led. 
    Una volta giunti a far funzionare la demo, dovremo fare in modo che la combinazione binaria rappresentata sui led, sia rappresentata anche sul secondo pic che dobbiamo ancora collegare.Il secondo pic potra essere un'altra demoboard con 876 oppure la demo 877, è indifferente se le alimentazioni siano separate o meno. Dobbiamo solo unire le masse nel caso le demo siano alimentate separatamente. 
    Prendiamo la seconda demoboard e la mettiamo vicino alla prima, prendiamo un filo e colleghiamo la porta RC6 del pic appena programmato con la porta RC7 del secondo pic.( RC6 trasmette e RC7 del secondo pic riceve).  
    Ricordatevi di collegare le masse se le alimentazioni sono separate. 
    A questo punto dovremo modificare il programma in modo che il valore venga trasmesso in seriale sulla porta RC6.  
    Ecco il listato con le parti aggiunte a tale scopo in rosso: 
     
    /* Legge un potenziometro su RA0 e ne riporta il valore in binario a 
    8 bit sulla porta B e trasmette via seriale. Per PIC 16F876/877 
    Roma 21/12/03 (c) by Sergio Fiocco */ 
     
    #include <pic.h> 
    #include <stdio.h> 
    #define XTAL_FREQ 4MHZ 
    #include "delay.c" 
    #include "uart.c" 
     
    main() 
    unsigned short valore; 
    unsigned char valore1; 
    unsigned char clock; 
    unsigned long baudrate; 
    unsigned char rc; 
     
             TRISB=0; //PORTB tutte uscite 
             TRISC=0; //PORTC tutte uscite 
             clock = 4; // setta il quarzo (4 MHz) 
             baudrate = 2400; //seta la velocità della seriale 
             rc = UartInit(clock, baudrate, UART_CFG_BITSTOP_1); 
     
             ADCON0 = 0b11000001; //setta RA0 come analogico 
             ADCON1 = 0b10000000; 
     
    for(;;) { 
               ADGO = 1; //Fa partire la conversione 
               while(ADGO) 
               continue; //Attende che la conversione sia completa 
     
               valore=ADRESL+(ADRESH<<8); //valore a 10 bit 
               valore1=valore/4; //riporto a 8 bit 
     
               PORTB=valore1; //riporta il valore1 su port
               UartPutch(valore1); //trasmette valore1 
               DelayMs(5); //ritardo per allentare la lettura  
              }  
     
    A questo punto potete ricompilare il programma e vedrete che farà la stessa cosa di prima solo che, in più, trasmetterà sulla seriale il dato che ci interessa arrivi al secondo pic. 
    Ora dovremo fare un programma per il secondo pic che dovra ricevere il dato e rappresentarlo con il modulo led alla porta B. 
    Eccoci giunti al terzo programma che andrà compilato e inserito nel secondo pic: 
     
    /* Questo programma và nel secondo pic. 
    * visualizza il valore ricevuto dalla seriale 
    * (c) 2003 by Fiocco Sergio */ 
     
    #include <pic.h> 
    #include <stdio.h> 
    #define XTAL_FREQ 20MHZ 
    #include "delay.c" 
    #include "uart.c" 
     
    main() 
    unsigned char clock; 
    unsigned long baudrate; 
    unsigned char rc; 
     
          TRISB=0;  
          TRISC=0;  
          clock = 4; 
          baudrate = 2400; 
          rc = UartInit(clock, baudrate, UART_CFG_BITSTOP_1);  
     
         ADCON0 = 0; //disabilita  
         ADADCON1 = 7;  
     
    for(;;)
              PORTB = UartGetch(); //visualizza ciò che riceve 
              
     
    Una volta compilato questo listato e inserito nel secondo pic, potrete vedere i led rappresentare il valore del potenziometro collegato al primo pic. (ovviamente il modulo led lo avete spostato sul secondo pic). 
    Vedrete anche che, al variare del potenziometro, il vaore rappresentato sui led varierà simultaneamente. 
    Abbiamo appena creato una comunicazione tra due pic funzionante ma abbiamo il limite della RS 232che consente la trasmissione dei dati fino ai 17 metri teorici consentiti da questo standart. 
    Ecco giunto il momento di mettere in funzione i due moduli RS485 presentati in questa pagina. 
    Magari se li mettevamo subito, potevamo avere dei dubbi sulle cause di eventuali malfunzionamenti. 
    E' per questo che siamo giunti solo ora al loro utilizzo, così siamo certi che almeno la trasmissione e la ricezione dei pic funzionano. 
    I moduli RS485 vanno collegati nel seguente modo: (fate riferimento alla foto per i colori dei fili). 
    Il filo rosso và al positivo dell'alimentazione del pic a cui il modulo andrà collegato. 
    Il filo nero và collegato alla massa dello stesso pic. 
    Il filo giallo và collegato a RC7 dei rispettivi pic 
    Il filo bianco và collegato a RC6 dei rispettivi pic. 
    Il filo blu va collegato a massa sul pic di ricezione e al positivo sul pic di trasmissione.(per ora) 
    Poi dovete mettere su on tutti i dip switch dei pull-up, dei pull-dows e dei terminatori. 
    Poi prendete un doppino telefonico e collegate tra loro i moduli, la linea A di un modulo và collegata alla linea A dell'altro.  
    Lo stesso dicasi per la linea B. 
    Non serve collegare le masse delle demoborad tra loro. 
    La massa della linea è opzionale e non và collegata a nessun altra massa perché è una massa isolata dai pic e serve come ulteriore protezione dai disturbi insieme ad un doppino schermato. 
    Comunque non collegate mai la massa isolata con le masse dei pic. 
    Ora che avete collegato il tutto secondo queste istruzioni, vedrete che il tutto funzionerà anche se mettete un filo particolarmente lungo.  
    Io stesso ho provato con un doppino da 500 metri e funziona benissimo. 
    Rimane da vedere la faccenda della bidirezionalità della trasmissione dei dati tra i pic. 
    La comunicazione tra pic con questi moduli può avvenire in un verso alla volta, portando a livello basso il filo blu del modulo stesso per ricevere e portandolo alto per trasmettere. 
    In pratica ci servirà connettere il filo blu ad una delle porte libere del pic, mandare a livello basso il pin se vogliamo ricevere (condizione normale) e mandarlo a livello alto se vogliamo trasmettere. 
    Naturalmente, dopo la trasmissione, converrà riportare il pin a livello basso in modo da liberare la linea e consentire ad altri dispositivi di trasmettere. 
    E ' un po' come accendere un led prima di trasmettere e spegnerlo subito dopo la trasmissione.Stà a voi sviluppare un protocollo di comunicazione che serva a far andare d'accordo i vari dispositivi che vorrete collegare. 
    Io sono soddisfattissimo di questo modulo e sono sicuro che lo sarete anche voi.
     
    barra rossa2 
     
    b_home2_baloon 
     
    © 2002-2006 by Sergio Fiocco -Tutti i diritti riservati- Vietata la riproduzione, anche parziale del presente sito