Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Communication RS485 avec un protocole spécifique



  1. #1
    saf.b.s

    Unhappy Communication RS485 avec un protocole spécifique


    ------

    Bonjour à tous,
    Dans le cadre d'un PFE, je dois établir une plateforme de simulation pour mon projet. Cette plateforme contient 3 µC 16F877 reliés chacun à un afficheur LCD. Les 3 µC doivent etre relié par RS485. 1er µC doit envoyer des informations aux deux autres µC qui les afficherons sur les LCD reliés à ces derniers.Les informations sont simples du type chaine de caractère comme suivant
    " POS:2444 / PIN:2
    POS:300 / PIN:7
    Couleur: Rouge"
    Ce sont des indications pour le test d'un cablage d'automobile puisque le projet s'agit de la conception et réalisation d'un testeur de cablage automobile pour un fabricant de câblage automobile.
    Ces indications doivent être affichée sur les deux LCD pour diriger les ouvriers. J'ai écris un code qui simule le fonctionnement d'un réseau RS485 mais j'ai eu un problème concernant le Bit qui contrôle l'enable du MAX485 pour choisir entre Transmission ou reception.Je dois configurer le 1 PIC en transmission puis juste apres qu'il termine la transmission je dois le mettre en mode reception pour recevoir le OK de l'un des autres PIC.Mon probleme est : ou-est ce que je dois mettre les instructions "output_high(PIN_C5);" et le "output_low(PIN_C5);"!!!!j 'ai essayé mais je trouve tjrs le meme probleme:avant la fin de la transmission le port se ferme et ne transmet pas toute l'information.SVP est-ce que quelqu'un peut m'aider.

    -----

  2. Publicité
  3. #2
    saf.b.s

    Talking Re : Communication RS485 avec un protocole spécifique

    J'ai oublié de mettre le code mais le temps de le mettre un ami m'a aidé à trouver la solution. à la prochaine.

  4. #3
    carcan

    Re : Communication RS485 avec un protocole spécifique

    Bonjour,

    précisez quel compilateur vous utlisez ...

    A+
    Laurent

  5. #4
    Jack

    Re : Communication RS485 avec un protocole spécifique

    il serait peut-être intéressant de faire fonctionner ta RS485 sous un protocole standard, modbus par exemple. A moins que les trois µC puissent être à l'origine d'une demande, ce qui complique tout en raison des problèmes de collision.

    Tu as des infos supplémentaires à nous donner?

    A+

  6. #5
    saf.b.s

    Re : Communication RS485 avec un protocole spécifique

    J'utilise le PIC C Compiler.
    @ Jack:Vu la simplicité des informations à envoyer, l'encadreur m'a déconseiller d'utiliser un protocole standard car l'utilisation du modbus par exemple nécessite l'ajout d'une EEPROM ce qui s'avère exagéré pour une telle application.
    Le problème maintenant c'est que je dois écrire un code qui gère les transmissions entre les 3 µC.On s'est mis d'accord sur un protocole spécifique à notre application qui est le suivant:
    -Le 1er µC doit pouvoir envoyer une trame aux deux autres µC qui contient:
    -le caractère "@" comme début de trame
    -l'adresse du µC récepteur.je dois mettre une adresse(0 par exemple)pour que la trame soit acceptée par les deux µC à la fois.
    - Longueur de la trame
    - les données.
    - checksum
    - "0x0d" comme caractère de fin.
    Ensuite, je dois prévoir une communication entre les 2 µC car le câble va être testé par ces derniers de la manière suivante:
    - Un µC doit envoyer à l'autre une indication pour commencer le test et ce dernier va lui envoyer un signal à travers la câble à tester : si les impulsions sont bien reçues par le µC qui a envoyé le signal de test, celui-ci envoi un signal au µC principal (qui est celui qui leur a envoyé la trame qui contient les données) pour qu'il leur envoi un OK puis une autre trame qui contient d'autres données et ainsi de suite.Au cas où les impulsions ne sont pas reçues, le µC qui envoi les impulsions doit envoyer ce signal chaque 2 secondes jusqu'à ce que l'opérateur annule cette opération par l'appui sur un bouton "SKIP" sur le même µC.
    Je suis un peu confus car c'est ma première fois donc si vous avez une idée, un code, un lien ou quelque chose qui peut m'aider je vous en serai reconnaissant et merci d'avance.
    A+

  7. A voir en vidéo sur Futura
  8. #6
    Jack

    Re : Communication RS485 avec un protocole spécifique

    car l'utilisation du modbus par exemple nécessite l'ajout d'une EEPROM
    Je ne vois pas quel est l'intérêt. Comment ton encadrant a-t-il justifié la présence de cette eeprom?

    Pour le reste, chacun peut inventer le protocole qu'il veut.

    Tu n'as toujours pas précisé si chacun des 3 µC peut prendre l'initiative de démarre une communication.

    A+

  9. Publicité
  10. #7
    saf.b.s

    Re : Communication RS485 avec un protocole spécifique

    oui, chacun des µC doit être capable de prendre l'initiative de démarrer une communication.On ne peut pas utiliser de Modbus car la communication entre les 2 esclaves est impossible.

  11. #8
    Jack

    Re : Communication RS485 avec un protocole spécifique

    Ok. On en revient donc au problème de collision lors de la demande simultanée de 2 maitres. Tu comptes la gérer comment?

    A+

  12. #9
    saf.b.s

    Re : Communication RS485 avec un protocole spécifique

    Justement c'est ça le problème, pour le moment je n'ai aucune idée.j'ai trouvé quelques codes concernant la communication RS485 mais j'ai pas réussi à les déchiffrer.Si vous avez un code qui gère ce serai la bienvenue.
    A+

  13. #10
    Jack

    Re : Communication RS485 avec un protocole spécifique

    Je n'ai pas de code pour toi malheureusement.

    Pour gérer les conflits d'accès simultané, le plus simple est d'instaurer un système de jeton. C'est classique et ça a fait ses preuves: Il n'y a qu'un seul jeton pour tous les maitres et seul le maitre le possédant a le droit de prendre la parole. Si le possesseur du jeton n'a rien a dire, il le donne au maitre suivant, etc.

    A+

  14. #11
    ftorama

    Re : Communication RS485 avec un protocole spécifique

    Citation Envoyé par Jack Voir le message
    Je n'ai pas de code pour toi malheureusement.

    Pour gérer les conflits d'accès simultané, le plus simple est d'instaurer un système de jeton. C'est classique et ça a fait ses preuves: Il n'y a qu'un seul jeton pour tous les maitres et seul le maitre le possédant a le droit de prendre la parole. Si le possesseur du jeton n'a rien a dire, il le donne au maitre suivant, etc.

    A+
    On peut aussi utiliser un transceiver RS422 monté en RS-485 et vérifier par écho que les signaux émis et reçus sont les mêmes

  15. #12
    saf.b.s

    Re : Communication RS485 avec un protocole spécifique

    Code:
    /////////////////////////////////////////////////////////////////////////
    ////                            RS485.c                              ////
    ////                                                                 ////
    ////      This file contains drivers for RS-485 communication        ////
    /////////////////////////////////////////////////////////////////////////
    ////                                                                 ////
    //// int1 rs485_get_message(int* data_ptr, int wait)                 ////
    ////     * Get a message from the RS485 bus                          ////
    ////     * Address can be 1 - 33.                                    ////
    ////     * A 1 will be returned if a parity check error occurred.    ////
    ////                                                                 ////
    //// int1 rs485_send_message(int to, int len, int* data)             ////
    ////     * Send a message over the RS485 bus                         ////
    ////     * Inputs:                                                   ////
    ////          to    - Destination address                            ////
    ////          len   - Message length                                 ////
    ////          *data - Pointer to message                             ////
    ////     * Returns TRUE if successful, FALSE if failed               ////
    ////                                                                 ////
    //// void rs485_wait_for_bus(int1 clrwdt)                            ////
    ////     * Wait for the RS485 bus to open. Normally used before      ////
    ////       sending a message to avoid collisions.                    ////
    ////     * Pass in TRUE to restart the watch dog timer to prevent    ////
    ////       the device from resetting.                                ////
    ////     * This is not needed if sending an immediate response       ////
    ////                                                                 ////
    /////////////////////////////////////////////////////////////////////////
    ////        (C) Copyright 1996, 2004 Custom Computer Services        ////
    //// This source code may only be used by licensed users of the CCS  ////
    //// C compiler.  This source code may only be distributed to other  ////
    //// licensed users of the CCS C compiler.  No other use,            ////
    //// reproduction or distribution is permitted without written       ////
    //// permission.  Derivative programs created using this software    ////
    //// in object code form are not restricted in any way.              ////
    /////////////////////////////////////////////////////////////////////////
    Comme tu peux le constater, le code est soumis à copyright. J'ai donc dû supprimer la suite

    Ceci est la bibliothèque du PIC C pour la communication RS485, comment pourrais-je utiliser les fonctions disponibles car quand je mets
    #include <rs485.c> le compilateur m'affiche plain d'erreur et je ne sais pas à quoi est dû cela!!!
    Est-ce que quelqu'un pourrais m'aider?
    Dernière modification par Jack ; 25/04/2011 à 15h45. Motif: Copyright

  16. Publicité
  17. #13
    Jack

    Re : Communication RS485 avec un protocole spécifique

    Le nombre d'erreurs n'est pas très représentatif. Il faut toujours chercher à corriger la première pour que tout rentre dans l'ordre. Que dit le message d'erreur?

    A+

  18. #14
    carcan

    Re : Communication RS485 avec un protocole spécifique

    Salut !

    en fait tu utilises le compilateur de CCS ... (question que je t'avais posé au début).

    Pour créer des communications en RS485 en CCS, c'est extrêmement simple :
    - hardware : PIC + MAX485 ou équivalent
    - init software : #use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,enable=PIN_C 0,bits=8,timeout=100), les pins xmit et rcv doivent être celles de l'UART, la PIN enable va sur l'entrée "Listen/Talk" du MAX485 (2 pins à relier ensemble de mémoire)
    - dans le programme : printf pour envoyer une trame, la réception se fait de préférence par interruption.

    Y a pas plus simple !

    A+
    Laurent

  19. #15
    saf.b.s

    Re : Communication RS485 avec un protocole spécifique

    #########################
    Image hébergée sur serveur externe supprimée
    Merci de suivre ces consignes

    Merci également d'utiliser les balises code afin de faciliter la lecture du code


    voici mon schéma sur Isis.
    Voici le code sur PIC C compiler pour l'emetteur:
    Code:
    #include "pfe.h"
    #include "LCD.C"
    #include "KBD.C"
    
    
    #define BUFFER_SIZE 8
    BYTE serial_buffer[BUFFER_SIZE];
    BYTE next_in  = 0;
    BYTE next_out = 0;
    
    #define T_BUFFER_SIZE 64
    byte t_buffer[T_BUFFER_SIZE];
    byte t_next_in = 0;
    byte t_next_out = 0;
    
    
    
    #int_tbe
    void t_serial_isr() {
       putc(t_buffer[t_next_out]);
       t_next_out=(t_next_out+1) % T_BUFFER_SIZE;
       if(t_next_in==t_next_out)
       {
         disable_interrupts(int_tbe);
        output_low(PIN_C5);
       }
    }
    
    void bputc(char c) {
       short restart;
       int ni;
    
       restart=t_next_in==t_next_out;
       t_buffer[t_next_in]=c;
       ni=(t_next_in+1) % T_BUFFER_SIZE;
       while(ni==t_next_out);
       t_next_in=ni;
       if(restart)
        { enable_interrupts(int_tbe);
         output_high(PIN_C5);}
    }
    
    #int_rda
    void serial_isr() {
       byte t;
       
       t=getc();
       
      
       serial_buffer[next_in]=t;
       
       t=next_in;
       next_in=(next_in+1) % BUFFER_SIZE;
       if(next_in==next_out)
         next_in=t;           // Buffer full !!
         
    }
    
    #define bkbhit (next_in!=next_out)
    
    BYTE bgetc() {
       BYTE c;
    
       while(!bkbhit) ;
       c=serial_buffer[next_out];
       next_out=(next_out+1) % BUFFER_SIZE;
       return(c);
    }
    
    /*
    void send_msg(char *buf,int size)
    {
    int i;
    output_high(PIN_C5);
     for(i=0;i<size;i++ ) fputc(buf[i]);
     //output_low(PIN_C5);
    }
    */
    
    
    void main()
    {
     char ch;
     char buf[20];
     int i=100;
     
      enable_interrupts(int_rda);
      enable_interrupts(GLOBAL);
      
    output_low(PIN_C5);
    
       kbd_init();
       lcd_init();
     
     
        printf(bputc,"\r\n\POS:24/PIN:2 POS:30/PIN7 Couleur:ROUGE\r\n");
     
    while(true)
     {
       ch = kbd_getc();
       if (ch=='1')
      {lcd_gotoxy(1,1);
      printf(lcd_putc,"\r\n\POS:24/PIN:2 POS:30/PIN7 Couleur:ROUGE\r\n");
    }
       
        while(bkbhit )
       { 
        ch=bgetc();
        lcd_putc(ch);
       }
    
       }
       
    
    }
    
    et voici le code du récepteur:
    #include "pfe.h"
    #include "LCD.C"
    #include "KBD.C"
    
    
    #define BUFFER_SIZE 8
    BYTE serial_buffer[BUFFER_SIZE];
    BYTE next_in  = 0;
    BYTE next_out = 0;
    
    #define T_BUFFER_SIZE 64
    byte t_buffer[T_BUFFER_SIZE];
    byte t_next_in = 0;
    byte t_next_out = 0;
    
    
    
    #int_tbe
    void t_serial_isr() {
       putc(t_buffer[t_next_out]);
       t_next_out=(t_next_out+1) % T_BUFFER_SIZE;
       if(t_next_in==t_next_out)
       {
         disable_interrupts(int_tbe);
        output_low(PIN_C5);
       }
    }
    
    void bputc(char c) {
       short restart;
       int ni;
    
       restart=t_next_in==t_next_out;
       t_buffer[t_next_in]=c;
       ni=(t_next_in+1) % T_BUFFER_SIZE;
       while(ni==t_next_out);
       t_next_in=ni;
       if(restart)
        { enable_interrupts(int_tbe);
         output_high(PIN_C5);}
    }
    
    #int_rda
    void serial_isr() 
    {
       byte t;
      int i;
       
       t=getc();
        
      
       serial_buffer[next_in]=t;
       //printf(lcd_putc , "info %c",(serial_buffer[next_in])); /*mes essais pour affichage sur le 2 eme LCD)*/
      t=next_in;
       next_in=(next_in+1) % BUFFER_SIZE;
       if(next_in==next_out)
         next_in=t;           // Buffer full !!
        // for(i=next_in;i<next_out;i++ ) 
        // printf(lcd_putc , "info %c",(serial_buffer[next_in]));/*mes essais pour affichage sur le 2 eme LCD)*/
         
    }
    
    #define bkbhit (next_in!=next_out)
    
    BYTE bgetc() {
       BYTE c;
    
       while(!bkbhit) ;
       c=serial_buffer[next_out];
       next_out=(next_out+1) % BUFFER_SIZE;
       return(c);
    }
    
    /*
    void send_msg(char *buf,int size)
    {
    int i;
    output_high(PIN_C5);
     for(i=0;i<size;i++ ) fputc(buf[i]);
     output_low(PIN_C5);
    }
    */
    
    
    void main()
    {
     char ch;
     char buf[20];
     int i=100;
     
      enable_interrupts(int_rda);
      enable_interrupts(GLOBAL);
      
    output_low(PIN_C5);
    
       kbd_init();
       lcd_init();
     
     
        
    
    while(true)
     {
     //printf(lcd_putc,"\r\n\POS:24/PIN:2 POS:30/PIN7 Couleur:ROUGE\r\n");
     /*j'ai écris cette ligne pour tester si l'afficheur fonctionne bien et que le problème ne vient pas de l'afficheur ou de la liaison entre le µC et le LCD*/
    }
       
        while(bkbhit )
       { 
        ch=bgetc();
        lcd_putc(ch);
       }
    
       }
    Mon problème c'est que le message qui sort du 1er µC s'affiche bien dans le terminal virtuel et arrive correctement au 2eme µC et il n'arrive pas à s'afficher sur son afficheur LCD2.
    à l'aiiiiiide!!!
    Dernière modification par Jack ; 25/04/2011 à 17h12. Motif: image et balise code

  20. #16
    saf.b.s

    Re : Communication RS485 avec un protocole spécifique

    #########################
    Image hébergée sur serveur externe supprimée
    Merci de suivre ces consignes


    c'est le schéma sur ISIS.
    Dernière modification par Jack ; 25/04/2011 à 17h12.

Sur le même thème :

Discussions similaires

  1. Choix protocole communication pour PICs
    Par Platipu$ dans le forum Électronique
    Réponses: 10
    Dernier message: 26/11/2010, 07h22
  2. Communication RS485 half et full duplex et gestion maitre esclave
    Par bertouf42 dans le forum Électronique
    Réponses: 19
    Dernier message: 06/03/2008, 08h34
  3. Protocole de communication Modem 56K PCI
    Par DavidDB dans le forum Électronique
    Réponses: 6
    Dernier message: 23/11/2007, 14h34
  4. Reconnaitre un protocole de communication
    Par basamir dans le forum Matériel - Hardware
    Réponses: 4
    Dernier message: 02/11/2006, 11h14
  5. communication avec matlab via un rs485
    Par madmat dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 27/10/2005, 22h37