Liaison USART du PIC 16F877
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Liaison USART du PIC 16F877



  1. #1
    invitecc1144c9

    Liaison USART du PIC 16F877


    ------

    Bonjour à tous! quelqu'un pourrait me dire ce qui ne va pas dans ce bout de code.
    Je l'ai vu dans un forum et apparemment un ami m'a aussi dit que ça devrait marcher mais pas chez moi! lorsque je le test, ma simulation se plante complètement, rien ne s'affiche sur mon PC.

    Code:
     if (k==l)  // atous les caracteres sont des chiffre
         {
         k=atoi (buffer);  // converti ascii to entier
         L1 = (long)k*1024/5000;
         PORTD= L1&0x000000FF;
         PORTB= (unsigned char)(L1>>8);
         }
    Normalement ce bout de code doit me servir pour pouvoir écrire une valeur et le convertir en décimale mais ça ne marche pas chez moi, je ne sais pas pourquoi?

    -----

  2. #2
    paulfjujo

    Re : Liaison USART du PIC 16F877

    Normalement ce bout de code doit me servir pour pouvoir écrire une valeur et le convertir en décimale
    mais ça ne marche pas chez moi, je ne sais pas pourquoi?
    NON pas, en decimale , mais en entier
    tape ta valeur en mV au clavier au lieu de X.XXX volts
    ex: 2500 pour 2,5 volts et là ca marchera..

    sinon, je repete ici la version flottant que je t'ai envoyé en MP
    l'inconvenient est que le flottant utilise plus de ressources en ROM et RAM
    là tu peux taper 2.5 ou 2.500 ..ou ce que tu veux en flottant

    nota: il n'y a pas de test sur le contenu de ce que tu as tapé au clavier !

    Code:
     // version flottant
     
       if( Drapeaux.Full==1)
       { 
          txt=TEXTE;
          CRLF();
          UART1_Write_Text( buffer); // copie du buffer sur terminal
          UART1_Write(TAB);
       // version avec flottant
          ff=atof(buffer)*1024.0/5.00;
          k=(unsigned int)ff;
          //on suppose que les 2 bits de poids fort sont sur B0 et B1
          // les bits de poids faibles sur PortD
          PORTD= k & 0x00FF; // les 8 bits de poids faible sur D
          PORTB= (unsigned char)( k >> 8); // les 2 bits de poids fort sur PORTB
    // les 2 lignes ci dessous sont juste pour les tests
          ByteToHex(PORTB,txt); UART1_Write_Text( txt);   UART1_Write(TAB);
          ByteToHex(PORTD,txt); UART1_Write_Text( txt); CRLF();   
         
        buffer[0]=0;  
        Drapeaux.Full=0;
        Index1=0;
        i1=0;   
       
       }
    Dernière modification par paulfjujo ; 03/07/2014 à 15h24.

  3. #3
    invite5637435c

    Re : Liaison USART du PIC 16F877

    Bonsoir,

    quitte à utiliser des flottants, évite la division:
    1024.0/5.0 est équivalent à 204.8, donc une multiplication de flottants suffit amplement, ton pauvre PIC ne s'en portera que mieux.

  4. #4
    paulfjujo

    Re : Liaison USART du PIC 16F877

    suite test dernier programme
    Probleme sur init ADCON1 .. avec 0x8E seule ANA0 est valide
    Numero de channel incompatible .. 6, 7 .. concerne le port E
    modifié.. ADCON1=0x82;
    a moins de changement au niveau hardware...

    modif: comparaison à zero sur entier au lieu de flottant.


    Code:
    
    // rev 9 juillet 2014
    // modif init ADC et voies ADC RA0,RA1,RA2,RA3
    
    // rev 7 juillet 2014
    
    
    #define CR 13
    #define LF 10
     
    
    //#define MAXLEN 10
    //  probleme pour la conversion flotant to string
    // Destination string should be at least 14 characters in length.
    //donc
    #define MAXLEN 15
    
    char buffer[MAXLEN], b;
    unsigned int i=0,j,k,l,n;
    double ff;
    float temp_res;
    unsigned char TEXTE[6];
    char *txt;
    long tlong, L1;
    unsigned int M;
    volatile int Index1, CptErr,i1;
    volatile struct chbits {  unsigned Full:1;
                   }Drapeaux ;
    
    //---------------------LES PROCEDURES---------------------------
    void UART1_Write_CText(const char *txt)
     {while (*txt)
      UART1_Write(*txt++);
     }
     void Write_String()
    {
    short int i1,j1,k;
     j1=strlen(TEXTE);
       i1=0;
       do
       {
       k=TEXTE[i1];
       UART1_Write(k);
       i1++;
       }while (i1<j1);
    }
    //-------------------ROUTINE D'INTERRUPTION----------------
    
     void interrupt()
     {
        unsigned char c1;
        if ((RCIE_bit) && (RCIF_bit))
        {
           if (RCSTA.OERR==1)
          {
           RCSTA.CREN = 0 ;
           c1 = RCREG;
           c1 = RCREG;
           RCSTA.CREN = 1 ;
           CptErr++;
           c1=0;
           }
          if(RCSTA.FERR==1 )
          {
          RCSTA.SPEN = 0 ;
          RCSTA.SPEN= 1 ;
          CptErr++;
          c1 = RCREG;
          c1=0;
          }
          c1 = RCREG;     // lecture registre => RAZ RCIF
         if ((c1==CR) || (i1>=MAXLEN))
          {
          Drapeaux.Full=1;
          buffer[i1]=0;
          Index1=i1;
          i1=0;
          c1=0;
         }
         else
         {
            buffer[i1]=c1;
            Index1=i1;
           i1++;
          }
        }
     }
    
    //--------------------PROGRAMMES PRINCIPALES----------------
    void main() {
      PORTC = 0;
      PORTB = 0;
      TRISB  = 0x3F; 
      PORTA = 0xFF;
      PORTD = 0;
      TRISA = 0xFF;         
      TRISE=0;
      PORTE=0xFF;
      TRISD=0x00; 
      PORTC = 0xFF;     
      TRISC = 0b11000000; 
      TMR0 = 0;
      OPTION_REG =0;
    //  PIE1.RCIE = 1;
    
      //ADC_Init();
      ADCON1 = 0x82;
      INTCON=0;
      UART1_Init(9600);   // RS232
    
     
        UART1_Write_CText("\n\r  ACQUISITION ET TRANSMISSION DES DONNEES \r\n ");
        //Condition du PORTA.RA0
        if(PORTB.RB0 == 0)
        {
        M=   Adc_Read(0);
        temp_res = M*0.00489;                //0.00489= 5/1023
        if(M == 0){
              UART1_Write_CText("\n\r  Entrée 1: 0");
               UART1_Write(13);        
               UART1_Write(10);       
           }else{
               FloatToStr(temp_res,buffer);
               UART1_Write_CText("\n\r  Entrée 1: - ");
               UART1_Write_Text(buffer);
               UART1_Write(13);       
               UART1_Write(10);      
           }
       }
       if(PORTB.RB0 == 1)
       {
              temp_res = Adc_Read(0)*0.00489;
              FloatToStr(temp_res,buffer);
              UART1_Write_CText("\n\r  Entrée 1:   ");
              UART1_Write_Text(buffer);
              UART1_Write(13);       
              UART1_Write(10);       
       }
       if (PORTB.RB1 == 0)
       {
             M=   Adc_Read(1);
             temp_res = M*0.00489;                //0.00489= 5/1023
             if(M == 0){
              UART1_Write_CText("\n\r  Entrée 2: 0");
               UART1_Write(13);       
               UART1_Write(10);       
           }else{
           FloatToStr(temp_res,buffer);
             UART1_Write_CText("\n\r  Entrée 2: -  ");
             UART1_Write_Text(buffer);
             UART1_Write(13);        
             UART1_Write(10);      
           }
       }
       if(PORTB.RB1 == 1)
       {
              temp_res = Adc_Read(1)*0.00489;
            FloatToStr(temp_res,buffer);
              UART1_Write_CText("\n\r  Entrée 2:   ");
              UART1_Write_Text(buffer);
              UART1_Write(13);       
              UART1_Write(10);     
       }
       if (PORTB.RB2 == 0)
       {
             M=   Adc_Read(2);
             temp_res = M*0.00489;                //0.00489= 5/1023
             if(M == 0){
              UART1_Write_CText("\n\r  Entrée 3: 0");
               UART1_Write(13);    
               UART1_Write(10);       
           }else{
            FloatToStr(temp_res,buffer);
              UART1_Write_CText("\n\r  Entrée 3: - ");
              UART1_Write_Text(buffer);
              UART1_Write(13);       
              UART1_Write(10);      
           }
       }
       if (PORTB.RB2 == 1)
       {
               temp_res = Adc_Read(2)*0.00489;
               FloatToStr(temp_res,buffer);
               UART1_Write_CText("\n\r  Entrée 3:   ");
               UART1_Write_Text(buffer);
               UART1_Write(13);      
               UART1_Write(10);     
       }
    
     
       if (PORTB.RB3 == 0)
       {
              M=   Adc_Read(3);
             temp_res = M*0.00489;                //0.00489= 5/1023
             if(M == 0){
                UART1_Write_CText("\n\r  Entrée 4: 0");
                 UART1_Write(13);        
               UART1_Write(10);     
            }else{
              FloatToStr(temp_res,buffer);
                UART1_Write_CText("\n\r  Entrée 4: - ");
                UART1_Write_Text(buffer);
                UART1_Write(13);        
                UART1_Write(10);      
            }
       }
       if(PORTB.RB3 == 1)
       {
       temp_res = Adc_Read(3)*0.00489;
            FloatToStr(temp_res,buffer);
              UART1_Write_CText("\n\r  Entrée 4:   ");
              UART1_Write_Text(buffer);
              UART1_Write(13);        
              UART1_Write(10);      
       }
       
    
      j=0;
      i1=0;
      Index1=0;
      buffer[0]=0;
      Drapeaux.Full=0;
      RCIE_bit=1;     //activation de la reception et transmission USART
      PEIE_bit=1;
      GIE_bit=1;
      
       UART1_Write_CText ("\n\r Veuillez entrer les valeurs des sorties   \r\n  ");
         while(1) {
               if( Drapeaux.Full==1){
                      i++;
                      txt=TEXTE;
          //          CRLF();
                      l=strlen(buffer);
                      // version avec flottant
                      ff=atof(buffer)*1024.0/5.00;      
                      k=(unsigned int)ff;
                      PORTD= k & 0x00FF; 
                      PORTB= (unsigned char)( k >> 2); 
                      if(i==1){     //Sélection de la sortie1
                           PORTC.RC2=1;
                           PORTC.RC5=0;
                           UART1_Write_CText("\r   Sortie 1 = ");
                           UART1_Write_Text( buffer); 
                           UART1_Write(13);       
                      }
                      if(i==2){     
                           PORTC.RC3=1;
                           UART1_Write_CText("\r   Sortie 2 = ");
                           UART1_Write_Text( buffer); 
                           UART1_Write(13);        
                      }
                      if(i==3){     
                           PORTC.RC4=1;
                           UART1_Write_CText("\r   Sortie 3 = ");
                           UART1_Write_Text( buffer); 
                           UART1_Write(13);        
                      }
                      if(i==4){   
                           PORTC.RC5=1;
                           UART1_Write_CText("\r   Sortie 4 = ");
                           UART1_Write_Text( buffer);
                           UART1_Write(13);      
                           i=0;
                           PORTC.RC2=0;
                           PORTC.RC3=0;
                           PORTC.RC4=0;
                    }
                    buffer[0]=0;
                    Drapeaux.Full=0;
                    Index1=0;
                    i1=0;
              }  
      } 
    
    }
    
    /*
    
      ACQUISITION ET TRANSMISSION DES DONNEES
    
      Entrée 1:   2.381429
      Entrée 2:   1.158929
      Entrée 3:   9.926698e-1
      Entrée 4:   8.899799e-1
    
     Veuillez entrer les valeurs des sorties
    
       Sortie 1 = 4.965
       Sortie 2 = 1.2
       Sortie 3 = 0.1
       Sortie 4 = 0.15
    
       *******************************************
    
       0 1 mikroCPIC1618.exe -MSF -DBG -pP16F877 -DL -O11111114 -fo10 -N"C:\_MickroC\_MesProjets_MickroC\_16F877_Platine\16F877_Platine.mcppi" -EH"C:\_MickroC\_MesProjets_MickroC\_16F877_Platine\16F877_Platine_EEPROM.ihex"
    -SP"C:\Program Files\Mikroelektronika\mikroC PRO for PIC\defs\"
    -SP"C:\Program Files\Mikroelektronika\mikroC PRO for PIC\Uses\P16\"
    -SP"C:\_MickroC\_MesProjets_MickroC\_16F877_Platine\" "16F877_to_Test_.c" "
    _Lib_Math.mcl" "
    _Lib_MathDouble.mcl" "
    _Lib_System.mcl" "
    _Lib_Delays.mcl" "
    _Lib_CType.mcl" "
    _Lib_CString.mcl" "
    _Lib_CStdlib.mcl" "
    _Lib_Conversions.mcl" "
    _Lib_SoftI2C.mcl" "
    _Lib_ADC_A_C.mcl" "
    _Lib_FLASH_RW.mcl" "
    _Lib_UART_c67.mcl"
    0 1139 Available RAM: 352 [bytes], Available ROM: 8192 [bytes]
    0 122 Compilation Started 16F877_to_Test_.c
    111 1509 Generated baud rate is 9615 bps (error = 0.16 percent) 16F877_to_Test_.c
    264 123 Compiled Successfully 16F877_to_Test_.c
    32 1164 Variable 'k' has been eliminated by optimizer 16F877_to_Test_.c
    0 127 All files Compiled in 109 ms
    0 1144 Used RAM (bytes): 85 (24%)  Free RAM (bytes): 267 (76%) Used RAM (bytes): 85 (24%)  Free RAM (bytes): 267 (76%)
    0 1144 Used ROM (program words): 3574 (44%)  Free ROM (program words): 4618 (56%) Used ROM (program words): 3574 (44%)  Free ROM (program words): 4618 (56%)
    0 125 Project Linked Successfully 16F877_Platine.mcppi
    0 128 Linked in 188 ms
    0 129 Project '16F877_Platine.mcppi' completed: 375 ms
    0 103 Finished successfully: 07 juil. 2014, 18:34:47 16F877_Platine.mcppi
       
      */
    [/CODE]

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

    Re : Liaison USART du PIC 16F877

    Bonjour!
    Non il s'agit bien de Adc_Read 4, 5, 6.
    En faite le code que tu m'as fournis ne peut pas lire les valeurs négatives et oui, tu as raison sur la configuration de ADCON1 mais moi, j'ai configurer les ports A et E en analogique!
    Donc j'ai is 0x80!

  7. #6
    paulfjujo

    Re : Liaison USART du PIC 16F877

    bonjour,

    En faite le code que tu m'as fournis ne peut pas lire les valeurs négatives
    Les ADC ne peuvent effectivement pas lire de valeurs analogiques negatives ..
    sauf si la valeur analogique à lire est isolee galvaniquement et qu'on inverse les polarités
    entre le 0V commum et l'entree ADC!

    donc c'est le pourquoi du test sur la valeur ADC et le rajout du signe '-' devant le resultat...

    la transformation flottant vers ascii via la bibliotheque MikroC
    a l'inconvenient de modifier l'affichage en notation scientifique pour les valeurs proches de zero
    c'est pourquoi je prefere utiliser une fonction externe qui permet de choisir le nombre de decimale
    affichée.. A toi de voir si c'est plus pratique ou non dans ton cas..

    Code:
    // declaration
     unsigned int M;
     unsigned char ConvRam1[20];
     float f1;
    
    Float2Ascii (float x, unsigned char *str,char precision)
    {
     /* converts a floating point number to an ascii string */
     /* x is stored into str, which should be at least 30 chars long */
     int ie, i, k, ndig;
     double y;
     ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
     ie = 0;
     /* if x negative, write minus and reverse */
     if ( x < 0)
     {
       *str++ = '-';
       x = -x;
     }
     /* put x in range 1 <= x < 10 */
     if (x > 0.0) while (x < 1.0)
     {
       x *= 10.0;                // a la place de =*
       ie--;
     }
     while (x >= 10.0)
     {
       x = x/10.0;
       ie++;
     }
     // in f format, number of digits is related to size
     ndig += ie;                                // a la place de =+
     //round. x is between 1 and 10 and ndig will be printed to
     // right of decimal point so rounding is ...
     for (y = i = 1; i < ndig; i++)
     y = y/10.;
     x += y/2.;
     if (x >= 10.0) {x = 1.0; ie++;}
     if (ie<0)
     {
       *str++ = '0'; *str++ = '.';
       if (ndig < 0) ie = ie-ndig;
       for (i = -1; i > ie; i--)  *str++ = '0';
     }
     for (i=0; i < ndig; i++)
     {
       k = x;
       *str++ = k + '0';
       if (i ==  ie ) *str++ = '.';
       x -= (y=k);
       x *= 10.0;
      }
     *str = '\0';
    }
    
    
    // exemple d' usage dans le main
          M = Adc_Read(0);
         f1=(float)M *-0.00485;    // signe - ici 
         Float2Ascii (f1,ConvRam1,3);  // 3 = 3 decimales
         UART1_Write_CText(" Entrée Ana RA0 :   ");
         UART1_Write_Text(ConvRam1);
         UART1_Write(13);
         UART1_Write(10);
    test Resultat , plus besoin de faire le test mesure ADC==0 ou >0


    Entrée Ana RA0 : 0.000
    Entrée Ana RA0 : 0.000
    Entrée Ana RA0 : -0.078
    Entrée Ana RA0 : -0.122
    Entrée Ana RA0 : -0.200
    Entrée Ana RA0 : -0.220
    Entrée Ana RA0 : -0.298
    Entrée Ana RA0 : -0.811
    Entrée Ana RA0 : -1.109
    Entrée Ana RA0 : -1.426
    Entrée Ana RA0 : -1.788
    Entrée Ana RA0 : -2.467
    Entrée Ana RA0 : -3.405
    Entrée Ana RA0 : -4.480
    Entrée Ana RA0 : -4.997
    Entrée Ana RA0 : -4.997
    Entrée Ana RA0 : -4.997
    Entrée Ana RA0 : -4.997
    Entrée Ana RA0 : -4.997

    Dernière modification par paulfjujo ; 10/07/2014 à 11h53.

  8. #7
    invitecc1144c9

    Re : Liaison USART du PIC 16F877

    bonjour! merci pour le code.
    Je l'ai essayé et il y a une erreur sur la conversion Float2Ascii. Est ce que je dois faire une déclaration avant de l'utiliser?

  9. #8
    paulfjujo

    Re : Liaison USART du PIC 16F877

    bonsoir,

    tout depend du type d'erreur !
    peut etre le void manquant devant la fonction ..qui ne retourne rien.
    La bonne regle de programmation voudrait que TOUTES les fonctions soient declarées en debut de programme..mais..

    Je te propose une autre facon diminuant le nombre de tests..
    unsigned int M est passé en
    int M; pour pouvoir en changer le signe ..

    Code:
    // rev 10 juillet 2014
    
    #define CR 13
    #define LF 10
       // rev 7 juillet 2014
    
    //#define MAXLEN 10
    //  probleme pour la conversion flotant to string
    // Destination string should be at least 14 characters in length.
    //donc
    #define MAXLEN 15
    
    char buffer[MAXLEN], b;
    unsigned int i=0,j,k,l,n;
    double ff;
    float temp_res;
    unsigned char ConvRam1[20];
    float f1;
    unsigned char TEXTE[6];
    char *txt;
    long tlong, L1;
    int M;
    volatile int Index1, CptErr,i1;
    volatile struct chbits 
    {  unsigned Full:1;
      }Drapeaux ;
    
    void UART1_Write_CText(const char *txt);
    void Print_Result(void);
    void Write_String(void);
    void CRLF(void);
    void Float2Ascii (float x, unsigned char *str,char precision);
    void Print_Result(void);
    
    //---------------------LES PROCEDURES---------------------------
    void UART1_Write_CText(const char *txt)
     {while (*txt)
      UART1_Write(*txt++);
     }
    
    void CRLF()
    {
     UART1_Write(13);
     UART1_Write(10);
    }
    
    //-------------------ROUTINE D'INTERRUPTION----------------
    
     void interrupt()
     {
        unsigned char c1;
        if ((RCIE_bit) && (RCIF_bit))
        {
           if (RCSTA.OERR==1)
          {
           RCSTA.CREN = 0 ;
           c1 = RCREG;
           c1 = RCREG;
           RCSTA.CREN = 1 ;
           CptErr++;
           c1=0;
           }
          if(RCSTA.FERR==1 )
          {
          RCSTA.SPEN = 0 ;
          RCSTA.SPEN= 1 ;
          CptErr++;
          c1 = RCREG;
          c1=0;
          }
          c1 = RCREG;     // lecture registre => RAZ RCIF
         if ((c1==CR) || (i1>=MAXLEN))
          {
          Drapeaux.Full=1;
          buffer[i1]=0;
          Index1=i1;
          i1=0;
          c1=0;
         }
         else
         {
            buffer[i1]=c1;
            Index1=i1;
           i1++;
          }
        }
     }
    
    void Float2Ascii (float x, unsigned char *str,char precision)
    {
     /* converts a floating point number to an ascii string */
     /* x is stored into str, which should be at least 30 chars long */
     int ie, i, k, ndig;
     double y;
     ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
     ie = 0;
     /* if x negative, write minus and reverse */
     if ( x < 0)
     {
       *str++ = '-';
       x = -x;
     }
     /* put x in range 1 <= x < 10 */
     if (x > 0.0) while (x < 1.0)
     {
       x *= 10.0;                // a la place de =*
       ie--;
     }
     while (x >= 10.0)
     {
       x = x/10.0;
       ie++;
     }
     // in f format, number of digits is related to size
     ndig += ie;                                // a la place de =+
     //round. x is between 1 and 10 and ndig will be printed to
     // right of decimal point so rounding is ...
     for (y = i = 1; i < ndig; i++)
     y = y/10.;
     x += y/2.;
     if (x >= 10.0) {x = 1.0; ie++;}
     if (ie<0)
     {
       *str++ = '0'; *str++ = '.';
       if (ndig < 0) ie = ie-ndig;
       for (i = -1; i > ie; i--)  *str++ = '0';
     }
     for (i=0; i < ndig; i++)
     {
       k = x;
       *str++ = k + '0';
       if (i ==  ie ) *str++ = '.';
       x -= (y=k);
       x *= 10.0;
      }
     *str = '\0';
    }
    
    void Print_Result()
    {   temp_res =(float)M *0.00485;
        Float2Ascii (temp_res,ConvRam1,3);  // 3 = 3 decimales
        UART1_Write_Text(ConvRam1);
        UART1_Write(13); // ou  CRLF();
     }
     
    //--------------------PROGRAMMES PRINCIPALES----------------
    void main()
    {
      PORTC = 0;
      PORTB = 0;
      TRISB  = 0x3F; 
      PORTA = 0xFF;
      PORTD = 0;
      TRISA = 0xFF;         
      TRISE=0x3F;   // <-- B7 B6 as output other as input and analog
      PORTE=0xFF;
      TRISD=0x00; 
      PORTC = 0xFF;     
      TRISC = 0b11000000; 
      TMR0 = 0;
      OPTION_REG =0;
    //  PIE1.RCIE = 1;
    
        ADC_Init();
       ADCON1 = 0x80;
       INTCON=0;
       UART1_Init(9600);   // RS232
    
         UART1_Write_CText("\n\r  ACQUISITION ET TRANSMISSION DES DONNEES \r\n");
        //Condition du PORTA.RA0
        M= Adc_Read(0);
        UART1_Write_CText("  Entrée 1:   ");
        if (PORTB.RB0==1) M=-M;
        Print_result();
    
        M= Adc_Read(4);
        UART1_Write_CText("  Entrée 2:   ");
        if(PORTB.RB1 == 1)M=-M;
        Print_result();
    
        M= Adc_Read(5);
        UART1_Write_CText("  Entrée 3:   ");
        if(PORTB.RB2 == 1)M=-M;
        Print_result();
    
        M= Adc_Read(6);
        UART1_Write_CText("  Entrée 4:   ");
        if (PORTB.RB3 == 1)M=-M;
        Print_result();
    
    
      j=0;
      i1=0;
      Index1=0;
      buffer[0]=0;
      Drapeaux.Full=0;
      RCIE_bit=1;     //activation de la reception et transmission USART
      PEIE_bit=1;
      GIE_bit=1;
       CRLF();
       UART1_Write_CText (" Veuillez entrer les valeurs des sorties   \r\n  ");
       while(1) 
       {
           if( Drapeaux.Full==1)
          {
              i++;
              txt=TEXTE;
           // CRLF();
              l=strlen(buffer);
           // version avec flottant
              ff=atof(buffer)*1024.0/5.00;
              k=(unsigned int)ff;
              PORTD= k & 0x00FF;
              PORTB= (unsigned char)( k >> 2);
              if(i==1)
              {     //Sélection de la sortie1
                 PORTC.RC2=1;
                 PORTC.RC5=0;
                 UART1_Write_CText("  Sortie 1 = ");
                 UART1_Write_Text( buffer);
                 UART1_Write(13);  // ou CRLF();
                }
              if(i==2)
               {
                 PORTC.RC3=1;
                 UART1_Write_CText("   Sortie 2 = ");
                 UART1_Write_Text( buffer);
                 UART1_Write(13);   // ou CRLF();
                }
              if(i==3)
                {
                 PORTC.RC4=1;
                 UART1_Write_CText("   Sortie 3 = ");
                 UART1_Write_Text( buffer);
                 UART1_Write(13);  // ou CRLF();
                }
               if(i==4)
                {
                 PORTC.RC5=1;
                 UART1_Write_CText("   Sortie 4 = ");
                 UART1_Write_Text( buffer);
                 UART1_Write(13);  // ou CRLF();
                 i=0;
                 PORTC.RC2=0;
                 PORTC.RC3=0;
                 PORTC.RC4=0;
                }
                buffer[0]=0;
                Drapeaux.Full=0;
                Index1=0;
                i1=0;
              }  
      } 
    
    }

    resultat !


    /* avec RB1=0 RB0,2,3=1

    ACQUISITION ET TRANSMISSION DES DONNEES
    Entrée 1: -2.362
    Entrée 2: 2.279
    Entrée 3: -3.540
    Entrée 4: -3.846

    Veuillez entrer les valeurs des sorties
    Sortie 1 = 4.98
    Sortie 2 = 0.025
    Sortie 3 = 1.896
    Sortie 4 = 3.333
    */



    Nota: certains terminaux se contante de un suel <CR> pour faire un retour en debut de ligne suivante
    sinon un <CR><LF>. peut etre interpreté comme 2 sauts de lignes.
    Dernière modification par paulfjujo ; 11/07/2014 à 19h10.

  10. #9
    invitecc1144c9

    Re : Liaison USART du PIC 16F877

    tu utilise quel PIC au juste? 16F877?
    car apparemment tous tes programmes sont trop long pour mon PIC!
    j'aimerai seulement être sûre pour ne pas perdre mon temps à voir de toues les côtés!
    toujours ce problème de plantage!
    lorsque je compile, pas d'erreur et lorsque je simule sur proteus et bien ça dit: "stack underflow executing RETLV instruction", je sais que tu n'utilise pas proteus mais t'as pas une idée par hasard ce que cela veut dire?
    Pour visualiser le résultat sur PC, tu utilise l'hyperterminal ou un logiciel spécifique!

    Merci!

  11. #10
    paulfjujo

    Re : Liaison USART du PIC 16F877

    oui,c'est bien le 16F877..reel.
    je ne connais pas Proteus..
    mais si il fait appel au compilo mikroC bride a 2K, cela doit poser probleme.

    J'utilise le terminal Vbray.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/01/2014, 15h07
  2. PIC 18F et USART
    Par invitecd702d98 dans le forum Électronique
    Réponses: 9
    Dernier message: 18/11/2013, 16h43
  3. création de 2 ème liaison série PIC 16f877
    Par invite0c1863e7 dans le forum Électronique
    Réponses: 6
    Dernier message: 17/10/2012, 18h02
  4. pic 16F877 USART
    Par invite184126ed dans le forum Électronique
    Réponses: 13
    Dernier message: 05/01/2011, 22h48
  5. Probleme liaison I2C PIC 16F877
    Par invitecd367060 dans le forum Électronique
    Réponses: 8
    Dernier message: 18/03/2009, 08h17
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...