maître/esclave RS485
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

maître/esclave RS485



  1. #1
    khaledchelsea

    maître/esclave RS485


    ------

    bnj j un problème dans le projet d'un fin d’étude , je fait un exemple de capteur DS18B20(température ) mais il ne fonctionne pas voila le schéma et les deux code source (maitre/esclave) Qui peut me aider et je vous remercie


    le code de maitre:
    Code:
                         //das ist nicht gut bat Allah und mohammed ist her prophet**************/
                           //*****************maitre***************************
    
    char dat[10];
     char  error;
    
     char esclave_1[1]={0};
    
     ///
    
     unsigned long temp_moyen;
     unsigned int lumier_extern,lumier_interne;
    #define signaler  PORTD.F2
    #define esclave_1_  160
    
    #define tempera_1  1
     #define temp_com PORTD.RD4
    
    
    
    
    
     sbit  rs485_rxtx_pin  at RC2_bit;               // set transcieve pin
    sbit  rs485_rxtx_pin_direction at TRISC2_bit;   // set transcieve pin direction
    
    
    // LCD module connections
    sbit LCD_RS at RB3_bit;
    sbit LCD_EN at RB2_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;
    
    sbit LCD_RS_Direction at TRISB3_bit;
    sbit LCD_EN_Direction at TRISB2_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    
    // End LCD module connections
     char adresse=160,test=0;
      char *text="000";
      char *text_="0000";
      char *_text="0000";
    
    void interrupt() {
      RS485Master_Receive(dat);
    }
    /**********les valeurs des consigne pour les actioneurs********************/
    #define t_max  25
    #define t_min  35
    
    
    #define on 1
    #define off 0
    
     void condition_actieurs(){
            if(temp_moyen>t_max && temp_moyen< 50) temp_com=on;
            else if(temp_moyen<t_min)  temp_com=off;
    
    
                            }
    
    
    
    
    
     void affiche_moyen(unsigned long grand,char line, char colon){
      text[0] = (grand/100) + 48;
      text[1] = (grand/10)%10  + 48;
      text[2] =  grand%10 + 48;
       Lcd_Out(line,colon,text);
       if(line==1 && colon==6){
       Soft_UART_Write(',');
       Soft_UART_Write(84);  //T
       Soft_UART_Write(58);  //:
                               }
    
      /**********************pour l'envoi de la valeur calculer**********************/
       Soft_UART_Write(_text[0]);
       Soft_UART_Write(_text[1]);
       Soft_UART_Write(_text[2]);
            /**********fin***************/
    
                         }
    
     void calcule_moyen(){
       /****pour_afficher _la_moyenne_de_la_temperature******/
       temp_moyen=(unsigned long) (esclave_1[0]);
       temp_moyen=temp_moyen/1;
       Lcd_Out(1, 1, "Temp:");
       Lcd_Chr(1,10,223);
       Lcd_Chr(1,11,'C');
       affiche_moyen(temp_moyen,1,6);
    
     // pour afficher les autres granderus
      condition_actieurs();  // pour actioner les actioneurs
                         }
    
    void main() {
     Lcd_Init();                        // Initialize LCD
      Lcd_Cmd(_LCD_CLEAR);               // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
    
         Lcd_Out(1,1,"Demarage Systeme");
         Lcd_Cmd(_LCD_CLEAR);
          TRISD.F2=0;
         TRISC=0;
         TRISC.RC7=1;
         TRISD.RD7=0;
         TRISD.RD6=0;
         TRISD.RD5=0;
         TRISD.RD4=0;
         TRISD.F1=0;
         PORTD=0;
         UART1_Init(9600);                    // initialize UART1 module
         Delay_ms(100);
          RS485Master_Init();
          RCIE_bit = 1;                        // enable interrupt on UART1 receive
          TXIE_bit = 0;                        // disable interrupt on UART1 transmit
          PEIE_bit = 1;                        // enable peripheral interrupts
          GIE_bit = 1;
         // Delay_ms(500);
        error = Soft_UART_Init(&PORTD, 2, 3, 9600, 0); // Initialize Soft UART at 14400 bps
    
            if (error > 0) {
                 while(1) ;                            // Stop program
                           }
             Delay_ms(500);
    
    
    
          for(;;){
          if(test==0){
          RS485Master_Send(dat,1,adresse);
          test=1;
                      }
          if (dat[5])  {                     // if an error detected, signal it
              PORTD.F2=1;                //   by setting portd to 0xAA
              Delay_ms(1000);
              signaler=0;
                       }
    
           if (dat[4]) {
           PORTD.F1=1;
                   dat[4]=0;
                   //******************esclave_1*******************//
    
                      switch(dat[0]){
                    case tempera_1:  esclave_1[0]=dat[1];    break;
    
                      calcule_moyen();test=0; adresse=160 ;  break;
                          RS485Master_Send(dat,1,adresse);
                                            }
                 }
    
    
    
    
    
    
    
    
    
    
    
    
    
        }
    }

    le code de esclave:
    Code:
    char dat[9];
    sbit  rs485_rxtx_pin at RC2_bit;             // set transcieve pin
    sbit  rs485_rxtx_pin_direction at TRISC2_bit;   // set transcieve pin direction
    
    unsigned int temp, recup_tmr0,recup_tmr1;
    float CAL1,CAL2;
     unsigned long RH1,frequence1,RH2,frequence2;
    
    
    #define signaler  PORTB.RB7
    
    #define tempera_1  1
    #define tempera_2  2
    #define tempera_3  3
    
    #define humidity  4
    
    #define hum_s_1  5
    #define hum_s_2  6
    #define hum_s_3  7
    
    #define temp_1 0
    #define temp_2 1
    #define temp_3 2
    
    
    /********/
    
    #define mux_e0 PORTD.RD0
    #define mux_e1 PORTD.RD1
    #define mux_e2 PORTD.RD2
    
    #define hum_s1 0
    #define hum_s2 1
    #define hum_s3 2
    
    
    // Interrupt routine
    void interrupt() {
     RS485Slave_Receive(dat);
    }
    /**********************sous programme pour lire les capterus de temperature*****************/
    
    char lire_temp(char pin_capteurs){
        char temp_whole;
        Ow_Reset(&PORTB, pin_capteurs);                         // Onewire reset signal
        Ow_Write(&PORTB, pin_capteurs, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTB, pin_capteurs, 0x44);                   // Issue command CONVERT_T
        Delay_us(120);
    
        Ow_Reset(&PORTB, pin_capteurs);
        Ow_Write(&PORTB, pin_capteurs, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTB, pin_capteurs, 0xBE);                   // Issue command READ_SCRATCHPAD
    
        temp =  Ow_Read(&PORTB, pin_capteurs);
        temp = (Ow_Read(&PORTB, pin_capteurs) << 8) + temp ;
    
        temp_whole = temp >> 4 ;
        return temp_whole;
    
                                 }
    
    
    
    
    
    void main() {
      TRISC.RC6=0;
      TRISC.RC7=1;
      TRISC.RC0=1;
      TRISA.RA4=1;
      TRISD=0;
      PORTD=0;
      //TRISB=0;
      //PORTB=0;
    
        ADCON0=0;
      ADCON1=0x0F;
    
    
    
      UART1_Init(9600);                  // initialize UART1 module
      Delay_ms(100);
      RS485Slave_Init(160);
    
    
    
      dat[4] = 0;                        // ensure that message received flag is 0
      dat[5] = 0;                        // ensure that message received flag is 0
      dat[6] = 0;                        // ensure that error flag is 0
    
      RCIE_bit = 1;                      // enable interrupt on UART1 receive
      TXIE_bit = 0;                      // disable interrupt on UART1 transmit
      PEIE_bit = 1;                      // enable peripheral interrupts
      GIE_bit = 1;
    
    
    
      for(;;){
          if (dat[5])  {                   // if an error detected, signal it by
      signaler=1;
      Delay_ms(1000);
      signaler=0;
                      }
    
      if (dat[4]) {                    // upon completed valid message receive
          dat[4] = 0;
    
          dat[0]=tempera_1;
          dat[1]=lire_temp(temp_1);
          RS485Slave_Send(dat,2);
          Delay_ms(50);
               }
    
    
    
    
    
            }
    
    
    }
    Nom : Nouvelle image (9).jpg
Affichages : 44
Taille : 228,5 Ko

    -----
    Dernière modification par Antoane ; 30/04/2015 à 13h55. Motif: Remplacement balises quote par code

  2. #2
    DAUDET78

    Re : maître/esclave RS485

    Moi, le code , ce n'est plus de mon âge !
    Par contre, coté hard , ta ligne doit être fermée, à chaque extrémité, sur des résistances de 120 ohm

    PS : je ne vois aucun condensateur de découplage !
    J'aime pas le Grec

Discussions similaires

  1. [PIC18 - Liaison SPI] - Envoi données Maitre > Esclave / Esclave vers Maitre
    Par jorg1n dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 12/01/2011, 16h45
  2. DD maître/esclave
    Par blackloffy dans le forum Matériel - Hardware
    Réponses: 7
    Dernier message: 04/09/2009, 23h05
  3. Communication RS485 half et full duplex et gestion maitre esclave
    Par invite1237d672 dans le forum Électronique
    Réponses: 19
    Dernier message: 06/03/2008, 08h34
  4. PIC18F452 - Maître-esclave I2c
    Par invitee1362fea dans le forum Électronique
    Réponses: 17
    Dernier message: 06/02/2007, 20h18
  5. maitre/esclave
    Par weeman dans le forum Matériel - Hardware
    Réponses: 10
    Dernier message: 28/03/2004, 14h49
Découvrez nos comparatifs produits sur l'informatique et les technologies.