récupération de 2 octets via RS232 par un pic 18F2550
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

récupération de 2 octets via RS232 par un pic 18F2550



  1. #1
    tinaarfa

    récupération de 2 octets via RS232 par un pic 18F2550


    ------

    Bonsoir,
    j'ai besoin d'une aide svp et c urgent, une programme sous CCs pour récupérer une donnée d'adresse 0X25 sur 16 bits via RS232 par un pic 18F2550 , en savant que la donnée est une entrée numerique (càd j'ai pas besoin de la convertir) ,
    Et merciiii

    -----

  2. #2
    spown

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Bonjour/bonsoir est bienvenue sur FUTURA,

    Elle est où la question ? ?? faire ton travail ? c'est pas le bon endroit

    Tu veux lire 0x25 sur 16 bit ? genre , TOTO = 0x25|0xFFFF ?

  3. #3
    paulfjujo

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    bonjour,


    C'est loin d'etre clair et comprehensible comme requete !

    pour récupérer une donnée d'adresse 0X25 sur 16 bits
    pour sortir la donnéee 16 bits situee à l'adresse 0x25 du PIC, via une liaison serie RS232 ?

    en sachant que la donnée est une entrée numerique
    c'est mieux en sachets..

    une entree ? Qui vient d'ou ?
    toutes les donnees internes d'un PIC sont traitees en numerique !
    meme si on les presente ensuite sous d'autres formes ( ascii, entier, flottant..)

  4. #4
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Bonjour,
    oui je veux lire cette valeur par le pic 18F2550 , bit par bit via la communication RS232 !
    comment je fais ça ??!
    Dernière modification par tinaarfa ; 13/04/2014 à 15h54.

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    en general une donnéee est definie par son adresse
    adresse elle meme definie soit par un nom de registre
    soit initialisée par un nom de varaible (en C)
    pourquoi cette adresse specifique de 0x25 ?

    d'ailleur adresse en RAM en EEPROM en FLASH PROGRAM?
    Dernière modification par paulfjujo ; 13/04/2014 à 15h59.

  7. #6
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    j'ai besoin de savoir comment le faire puisque je suis débutante dans le Pic :/

  8. #7
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    compilateur : CCs

  9. #8
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    0X25 en exa c l'adresse d'un paramtere Ua (tension)
    j'ai un module comme un compteur ou un moyen de mesure de la famille Acrel istallé dans une armoire d'une industrie et qui donne des mesures tels que tension , puissance .. ect

    Alors je vais réaliser une carte ; le pic lire les données envoyés par ce compteur et il les envoie au pc à travers une liaison RS232 , pour le moment j'ai besoin de faire juste la première partie car c un projet de fin d’étude,
    puisque les données sont de 16 bits , je vais l'envoyer au pic pour les lire bit par bit via la liaison RS232 !

  10. #9
    Seb.26

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Citation Envoyé par tinaarfa Voir le message
    Alors je vais réaliser une carte ; le pic lire les données envoyés par ce compteur et il les envoie au pc à travers une liaison RS232 , pour le moment j'ai besoin de faire juste la première partie car c un projet de fin d’étude,
    puisque les données sont de 16 bits , je vais l'envoyer au pic pour les lire bit par bit via la liaison RS232 !
    le 18F2550 ne peut sait pas lire des mots de 16b sur son UART ... donc soit tu expliques mal ton besoin, soit c'est pas possible ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    oui pour les registres de pic 18F2550 , ils sont de 8 bits , mais pour moi je vais lire les 2 octets bit par bit en série !!
    càd à travers TX et RX du RS232 !

  12. #11
    spown

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Avec quelle interface ton PIC lit la valeur envoyée par le capteur ?

  13. #12
    paulfjujo

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    0X25 en exa c l'adresse d'un paramtere Ua (tension)
    j'ai un module comme un compteur ou un moyen de mesure de la famille Acrel istallé dans une armoire d'une industrie et qui donne des mesures tels que tension , puissance ..

    Cette adresse 0x25 est donc interne à l'equipement distant.. <----- RS232 ---> PIC UART ?
    il doit donc y avoir un protocole specifique pour lire dans l'equipement
    Modbus ? autre protocole?

  14. #13
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Bonjour,
    le pic lit la valeur envoyée par le capteur à travers l'interface MAX232 !

  15. #14
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Oui l'adresse 0x25 est interne à l’équipement distant. Pour le protocole c'est le Modbus _RTU

  16. #15
    paulfjujo

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    il faut donc que le pic envoie une requete au format modbus_RTU
    avec l'adresse de l'esclave , type de requete,l'adresse de la donnee (0x25) le nb de mot(1) ou bytes (2) et le CRC16 de la tame ainsi composee.
    L'automate repondra correctement que si la question est correcte !
    voir la literrature sur Modbus

    ci joint , un exemple de requete pour un automate , en TBAS datant de 1995 !
    lecture de 8 mots à l'adrese 640 de l'esclave #1
    le format de la trame ou requete aupres de l'automate est resumé ci dessous:

    Code:
    trame:
       NøEsclave  Lecture   @MSB     @LSB       Nb de mots
    Trame$=chr$(1)+chr$(4)+chr$(AdrMSB)+chr$(AdrLSB)+chr$(NbMSB)+chr$(NbLSB)
    Crc&=FNChecksum&(Trame$)
    Trame$=Trame$+chr$(CrcH)+chr$(CrcL)
    print #1,Trame$

    5CLI2J3_BAS.txt

    ou voir ICI
    ou LA
    Dernière modification par paulfjujo ; 14/04/2014 à 17h01.

  17. #16
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    ok , mais pour mon cas que dois-je faire ?!

  18. #17
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    j'ai pas compris comment je dois commencer à faire le programme :/
    Dernière modification par tinaarfa ; 14/04/2014 à 17h29.

  19. #18
    spown

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Tu devrais envoyé une requête à partir de ton 18F via le protocol Mbus ( n'est pas géré par 18F, il faut développer une communication ) en spécifiant dans la trame l'adresse 0x25. Le capteur va répondre avec une trame ( Mbus) qui contient la valeur désirée. Par la suite tu vas filtrer la trame puis extraire cette valeur.

    Voir ca : http://www.m-bus.com/mbusdoc/md5.php

  20. #19
    paulfjujo

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Citation Envoyé par tinaarfa Voir le message
    j'ai pas compris comment je dois commencer à faire le programme :/

    voir ICI ou plutot LA (post #15) cas ou le PIC est maitre


    Apres il va falloir se mettre au boulot !

    on ne va pas te fournir le programme tout pret et c'est deja pas mal de te renseigner
    au vu du peu d'information que tu fournis,
    et nous montrer ce que tu as deja fait ou cogité.
    Dernière modification par paulfjujo ; 14/04/2014 à 19h07.

  21. #20
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    ok , je vais essayer , malgré que je sais pas par quoi je commence :/

  22. #21
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    @spown, je n'arrive pas à commencer le programme :/ pouvez vous me donner un exemple d'un programme qui m'aide dans mon travail svp !!!

  23. #22
    spown

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Est ce que t'as jeté un coup d’œil sur les liens de paulfjujo ??

    Code:
    // simple test de laison Modbus Esclave vers Maitre PC
    // pour recuperer 3 mesures analogiques
    /*
    Exemple d’échange entre un maître et un esclave
    Trame émise par le maître : 01 03 00 02 00 01 25 CA
    - Adresse esclave : 01
    - Code fonction 03 = lecture registre
    - N° du registre de début de lecture : MSB : 00 et LSB : 02
    - Nombre de registre de lecture : MSB : 00 et LSB : 01
    - CRC : 25 CA
    Réponse de l’esclave avec erreur : 01 83 02 01 31
    - Adresse esclave : 01
    - Code fonction : lecture avec MSB = 1 : 83
    - Code erreur (n° registre) : 02
    - CRC : 01 31
    Réponse de l’esclave sans erreur : 01 03 02 02 58 B8 DE
    - Adresse esclave : 01
    - Code fonction : lecture registre : 03
    - Nombre d’octets données : 02
    - Données du registre 0002 : MSB 02 et LSB : 58
    - CRC : B8 DE
    Resultat avec Jbus_RTU.exe :
    Trame émise par le maître : >>1 3 0 1 0 3 54 0B
    reception: 02C3 0281 03AB
     */
    
    #define LedBlanche PORTE.F0
    #define SlaveAddress 1
    //bank1
     unsigned char buffer[32];
    int Receive;
    int M0,M1,M2;
    unsigned short  oj;
    char stop = 0;
    
    char *txt="MikroC 16F877 Modbus Q=10Mhz 19200 090606\n\r" ;
    char *p1="............................" ;
    char l;
    unsigned short int i,j,k;
    
    void Octet2Hex(char number);
    void octet_Bcd_to_2cars(short n);
    char  CRC16(unsigned int dataLength,char check)  ;
    char CheckRSInBuffer(void);
    unsigned char readRS(void);
    unsigned char  ReadMBFrame();
    unsigned char WriteMBFrame();
    void Write_String();
    
    void InitMain() {
      PORTA = 255;
      TRISA = 255;          // PORTA is input
      PORTB = 0;           // set PORTB to 0
      TRISB = 0;           // designate portb pins as output
      ADCON1=0b10001100 ; //RA0,RA1,RA2,RA5= ANA, RA3=+Vref,  RE0..RE2=digital ,cadre a droite
      //ADCON1 = 0b10000101 ; // portA A0,A1=analog, A2=D, A3=+ref, A4,A5=digital
      PORTC = 0x0;          // set PORTC to $FF
      TRISC = 0;             // designate PORTC pins as output
      PORTE = 0x0;          // set PORTE to $FF
      TRISE = 0;             // designate PORTE pins as output
     }
    
    void Octet2Hex(char number)
    {
    char high,low;
      // high nibble
      high = ((number & 0xF0) >> 4) + 48; // + '0'
      if (high > 57u)
        high += 7;                        // > '9'
      // low nibble
      low = (number & 15u) + 48;          // +'0' low nibble
      if (low > 57u)
        low += 7;                         // > '9'
      Usart_Write(high);
      Usart_Write(low);
    }
    
    //CRC 16 for modbus checksum rev PF june 2009
    char  CRC16(unsigned int dataLength,char check)
    {
    unsigned int CheckSum;
    unsigned int j;
    unsigned char lowCRC;
    unsigned char highCRC;
    unsigned short i;
    CheckSum = 0xffff;
    for (j=1; j<dataLength; j++)
    {
    CheckSum = CheckSum^(unsigned int)buffer[j];
    for(i=8;i>0;i--)
    	if((CheckSum)&0x0001)
    	CheckSum = (CheckSum>>1)^0xa001;
    	else
    	CheckSum>>=1;
    }
    highCRC = CheckSum>>8;
    CheckSum<<=8;
    lowCRC = CheckSum>>8;
    if (check==1)
      {
      if ( (buffer[dataLength+1] == highCRC) & (buffer[dataLength] == lowCRC ))
      return 1;
      else
      return 0;
      }
      else
      {
       buffer[dataLength] = lowCRC;
      buffer[dataLength+1] = highCRC;
    
      return 1;
      }
    }
    
    
    char CheckRSInBuffer(void)
    {
    unsigned int j = 0;
    while((!RCIF) && (j < 30000)) j++;
            return RCIF;
    }
    
    
     unsigned char readRS(void)
    {
       while(!RCIF) continue;
       return RCREG;
    }
    
    
    unsigned char  ReadMBFrame()
    {
    unsigned int counter = 0;
    unsigned int aux;
    stop = 0;
    while (!stop)
       if(!CheckRSInBuffer())
             stop = 1;
       else
            {
            if (counter<=73)
            buffer[counter] = RCREG;
            counter++;
            }
    if ((buffer[1] == 16)&(((unsigned int) buffer[6] + 9)!=counter)) return 2; //wrong  nr of registers
    if (counter > 32) return 2; //to many bytes in frame
    if (counter < 8) return 0; //to few bytes frame
    if (buffer[0] != SlaveAddress) return 0; //wrong address
    if ((buffer[1] != 3) & (buffer[1] != 16))return 1; //wrong modbus function
    aux = (unsigned int)buffer[2] * 256 + (unsigned int)buffer[3] + (unsigned int)buffer[4]*256
    +(unsigned int)buffer[5];
    if (aux > 8000) return 2; // to many registers
    if ((buffer[4]>0)|( buffer[5] > 32)) return 2; // to many registers
    if( CRC16(counter - 2,1))
       return buffer[1]; //OK
    else
       return 0;   //bad CRC
     }
    
    
     unsigned char WriteMBFrame()
     {
      unsigned int r =0;
     buffer[1]  =1;   //N° esclave
     buffer[2]  =3;   //code lecture mot
     buffer[3]  =6;   //nb de bytes
     buffer[4]  =M0 / 256 ; //data 1 MSB
     buffer[5]  =M0 % 256 ; //data 1 LSB
     buffer[6]  =M1 / 256 ; //data 2 MSB
     buffer[7]  =M1 % 256 ; //data 2 LSB
     buffer[8]  =M2 / 256 ; //data 3 MSB
     buffer[9]  =M2 % 256 ; //data 3 LSB
     buffer[10]  =0;  //CRC
     buffer[11]  =0;  //CRC
     r= CRC16(10,0) ; //met à jour CRC16
     for (i=1;i<12;i++)   Usart_Write(buffer[i]);
     return r ;
     }
    
    
    void Write_String()
    {
    short int i1,j1,k;
     j1=strlen(txt);
       i1=0;
       do
       {
       k=txt[i1];
       Usart_Write(k);
       i1++;
       }while (i1<j1);
    }
    
    
    void main()
    {
      initMain();
      USART_Init(19200);
      txt= strcpy(txt,"INIT usart 19200\n\r");
        Delay_ms(1000);
      Write_String();
      Usart_Write(13);
      Delay_ms(1000);
      i=0;
    
        while(1)
        {
        M0 = ADC_Read(0) ;
        LedBlanche=0;
        //txt= strcpy(txt,"Mesure ADC0= ");Write_String();
        //WordToStr(M0, txt);  Write_String();
        //Usart_Write(13);
    
    
     /* to test CRC16 calcul
          buffer[1]=1;            // num esclave
          buffer[2]=3;            // requete=lecture mot
          buffer[3]=0;buffer[4]=35;// @ debut
          buffer[5]=0;buffer[6]=8;// nb de mots à lire
          buffer[7]=0;buffer[8]=0;// CRC16
          Delay_ms(20);
          i=CRC16(7,0) ;//CRC 16 calcul must be 25CA
          txt= strcpy(txt,"CRC16= ");
          Write_String();
          Usart_Write(9); Octet2Hex(buffer[7]);
          Usart_Write(9); Octet2Hex(buffer[8]);
          Usart_Write(13);
       */
    
        Delay_ms(100);
        M1 = ADC_Read(1) ;
        Delay_ms(100);
       /*
        txt= strcpy(txt,"Mesure ADC1= "); Write_String();
         WordToStr(M1, txt); Write_String();
        Usart_Write(13);
       */
    
        M2 = ADC_Read(4) ;
        LedBlanche =1;
        Delay_ms(800);
    
        if (Usart_Data_Ready())
        {
            Receive=Usart_Read();
        //  Receive=readRS();
        //  if (Receive==1)
        //  {
        //      Receive=readRS();
        //      if (Receive==3)
        //      {
        //          Receive=readRS();
        //          if (Receive==1)
        //          {
        //            Receive=readRS();
        //            if (Receive==3)
        //             {
        //              Receive = readRS();
                      //  Usart_Write(Receive);
                      //  Usart_Write(13);
                       WriteMBFrame() ;
        //              };
        //          };
        //       };
        //  };
         };
       } ;
    }

  24. #23
    tinaarfa

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    Bonjour, oui j'ai déjà vu
    Pour le CRC16 j'ai pas une valeur exacte alors j'ecris seulement la fonction de calcul de celui ci et le pic automatiquement donne sa valeur ou quoi ??!

  25. #24
    paulfjujo

    Re : récupération de 2 octets via RS232 par un pic 18F2550

    bonjour,

    As-tu verifier que l'automate ou device distant est bien configuré en ESCLAVE
    et donc le PIC sera MAITRE. ?

    Quel est le format de la liaison ?
    RS232 tension ou courant , vitesse, format, avec ou sans parité ?
    Certains automates utilise la parité !

    Le CRC16 est calculé par la fonction char CRC16(unsigned int dataLength,char check)
    la table unsigned char buffer[32] doit contenir la trame à analyser
    datalength est le nombre de bytes contenus dans la trame
    check est un flag d'aiguillage
    si check =1 on test si le checksum de retour est le meme que celui de la trame
    si check=0 on rajoute le checksum à la fin de trame

    puisque tu connais precisement l'adresse de l'automate
    le type de requete
    le nombre de byte à recevoir
    tu peux calculer le CRC16 au prealable et le mettre "en dur" dans la requette

    // Esclave#1 lecture mot adresse 10 1 (registre ANA7 sur ITB 8EA)
    // 01 03 00 0A 00 01 00 A4 08
    voir CRC16_3.exe dans le zip

    et dans un premier temps recevoir la trame de reponse SANS CALCULERet COMPARER le checksum CRC16
    Verifier si l'automate repond , afficher le resulatt sur un LCD ou terminal..

    Je te conseille dans un premier temps d'utiliser le terminal VBRAY (ou equivalent permettant d'envoyer des codes caracteres )
    qui dialoguera directement avec ton "automate"
    pour degrossir et TESTER la liaison AVANT de programmer quoique ce soit

    regarde ma demarche ICI

    et les outils idoine..programmes .


    voir le fichier MACROS permettant d'envoyer des requetes MODBUS à un module Leroy ITB 4EA
    et le resultat que l'on peut visualiser sur les echanges

    dans le zip
    CRC16_3.exe programme calcul CRC16 d'une trame (tourne dans une fenetre DOS sous XP)
    Modbus_Test_Vbray.tmf macro pour touches de fonctions VBRAY terminal
    Terminal_Vbray_Modbus.jpg exemple d'echange trames modbus
    Modbus_prg.zip

Discussions similaires

  1. Récupération de données RS232-USB
    Par invitefaa2fdf1 dans le forum Programmation et langages, Algorithmique
    Réponses: 40
    Dernier message: 20/05/2014, 00h58
  2. Réponses: 1
    Dernier message: 21/03/2012, 16h45
  3. Récupération de données par le port rs232
    Par invitea81c0b4b dans le forum Électronique
    Réponses: 29
    Dernier message: 07/01/2010, 22h18
  4. octets
    Par invite254e45a5 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 21/11/2007, 15h25
  5. reception 2 octets en I2C
    Par invite820b5138 dans le forum Électronique
    Réponses: 15
    Dernier message: 05/06/2007, 09h43
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...