USART du PIC16F877
Discussion fermée
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 55

USART du PIC16F877



  1. #1
    misselectro45

    USART du PIC16F877


    ------

    Bonjour à tous!
    Quelqu'un pourrait m'aider s'il vous plait?
    J'aimerais transmettre et recevoir des données venant du PIC 16F877 par la liaison RS232 mais en écrivant le programme adéquat, je n'arrive pas à comprendre la différence entre Soft_USART_init et USART1_init?, c'est quoi le Soft? Logiciel bien sûre mais sur quoi çà fait la différence? Merci d'avance!

    -----

  2. #2
    kevin8z

    Re : USART du PIC16F877

    Je suppose que ton éditeur compilateur est MicroC? Le soft c'est lorsqu'il n'y à pas de UART intégré au PIC. Si ton PIC a un UART il faut utiliser USART1_init

  3. #3
    misselectro45

    Re : USART du PIC16F877

    Merci beaucoup pour ta réponse!
    J'utilise le pic 16F877, donc je présume que le USART1_init fera l'affaire mais une question s'il vous plait!
    En simulant avec proteus, en en utilisant les fonction UART1_Write(data); et UART1_Read(); sur les pins RB6 et RB7 mais lorsque je simule, la pins RB7 est actif mais elle est à 0, et le RB6 est inactif? est ce que c'est normale?

    Voici mon code:
    Code:
    // ---------------------VARIABLES GLOBALES------------------------------
    unsigned int temp_res;
    unsigned int receive;
    unsigned short i=0;
    unsigned char error;
    char temps;    //variable de gestion de temps = à 15 au bout de 1 seconde
    
    //---------------------ROUTINE D'INTERRUPTION---------------------------
      void interrupt (){
         i= i+1;
         if(i=1){
             PORTB = 0b00000001;
         }
         if(i=2){
             PORTB = 0b00000011;
         }
         if(i=3){
             PORTB = 0b00000111;
         }
          if(i=4){
             PORTB = 0b00001111;
         }
        
        // If data is ready, read it:
        if (UART1_Data_Ready() == 1) {
    
        }else{
        receive = 0b1111111111;
        PORTD = receive;       // Send lower 8 bits to PORTD
        PORTB = receive >> 2;  // Send 2 most significant bits to RB7, RB6
        Delay_us(500);       // Le temps de voir les résultats sur les LEDS
        }
    
     TMR1IF_bit = 0;
     }
    
    //---------------------PROGRAMME PRINCIPALE---------------------------
    void main() {
      ADCON1 = 0x80;  // Configure analog inputs and Vref
      TRISA  = 0xFF;  // PORTA is input
      TRISD  = 0;     // PORTD is output
      TRISB = 0;   //configuration en sortie RB6 et RB7
      INTCON = 0xFF; // bit0 : RBIF : flag interruption RB4/RB7 ; bit1 : INTF : flag RB0/Int; bit2 : T0IF : flag tmr0; bit3 : RBIE : masque interruption RB4/RB7; bit4 : INTE : masque interruption RB0/Int; bit5 : T0IE : masque interruption tmr0; bit6 : PEIE : masque autorisation générale périphériques; bit7 : GIE : masque autorisation générale interruption;
      PIE1 = 0x01;  //activation du bit TMR1IE pour autoriser l'interruption du timer1
      TXSTA = 0b00100000; //activation du bit TXEN
      RCSTA = 0b00010000; //activation du bit CREN
    
     //The CAN is begin
      do{
      PORTB = 0;
    
        temp_res = Adc_Read(0); // Get results of AD conversion lecture des données du port A0
        if (temp_res==0b00000000 ){
              temp_res = Adc_Read(1);
              if(temp_res==0b00000000){
                  temp_res= Adc_Read(2);
                  if(temp_res==0b00000000){
                      temp_res= Adc_Read(3);
                      if(temp_res==0b00000000){
                         temp_res= Adc_Read(4);
                         if(temp_res==0b00000000){
                             UART1_Init(9600);    //Inititalisation et etablissement de la communication avec USART
                             Delay_ms(100);
                             UART1_Write(temp_res);
                         }
                      }
                      else{
                        UART1_Init(9600);; //Inititalisation et etablissement de la communication avec USART
                        Delay_ms(100);
                        UART1_Write(temp_res);
                      }
                  }
                  else{
                     UART1_Init(9600); //Inititalisation et etablissement de la communication avec USART
                    Delay_ms(100);
                    UART1_Write(temp_res);
                   }
              }
              else{
                UART1_Init(9600); //Inititalisation et etablissement de la communication avec USART
               Delay_ms(100);
               UART1_Write(temp_res);
              }
        }
        else{
         UART1_Init(9600); //Inititalisation et etablissement de la communication avec USART
         Delay_ms(100);
         UART1_Write(temp_res);
        }
    }while(1);
    
    }
    Quelqu'un peut m'aider svp?

  4. #4
    paulfjujo

    Re : USART du PIC16F877

    bonsoir,


    la différence entre Soft_USART_init et USART1_init?,

    Avec le vrai SOFT UART , la liaison est geree en SOFTWARE uniquement
    et n'importe quel pin du PIC pourrait etre utilisée comme broche TX et RX
    alors qu'avec l' USART1, on se sert du "Materiel" UART inclus dans le PIC
    qui a donc des entrees sortie bien definies
    RC6 pour TX et RC7 pour RX
    pas besoin de calibrere la duree des bots et de compter les bits pour reconstituer le caractere ,
    c'est fait par hardware..
    La gestion par interruption decoule aussi du hardware .. qu'il faut traiter quand meme par un bout de software
    en resumé : on est en mode assisté avec l'UART

    Certains PIC n'ont pas d'UART integré (ex 16F84).. c'est pourquoi il existe la version Software UART.

    dans la version Software,il faudra compter chaque bit et calibrer la duree des bits..
    mais Heureusement MikroC procure toute faite cette librairie
    il n'y a donc qu'à definir les PINs

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

    Re : USART du PIC16F877

    attention, l'UART1 hardware c'est RC6 et RC7 pas RB6 RB7
    Il ne faut initialiser l'UART qu'une seul fois au debut du programme..

  7. #6
    misselectro45

    Re : USART du PIC16F877

    Merci! c'est très clair maintenant! Mais est ce que tu peux m'éclaircir sur ma précédente question stp? juste avant que t'envoie ce message!

  8. #7
    misselectro45

    Re : USART du PIC16F877

    oui oui! bien sûre! une erreur de frappe de ma part! Effectivement c'est sur les pins RC6 et RC7! et je dois les configurer en entrées ou en sortie? ou je les laisse sans déclaration! et Merci, je vais initialiser qu'une seule fois!

  9. #8
    paulfjujo

    Re : USART du PIC16F877

    j'ai pas tout compris dans ton code , mais l'interrupt ,ça va pas du tout
    il faut utiliser les flags d'interruptions et suivant leur etat faire ou pas une action
    et RAZER le flag apres traitement
    sauf pour RCIF qui est razé par la lecture du registre reception UART RCREG...

    il y a surement encore d'autre problemes....

    c'est quoi receive , c'est bien la reception UART ?.. 1 char = 8 bits
    donc on ne peut pas afficher 10 bits ..
    a moins que ce soit le contenu de l'ADC que tu veux afficher
    mais quel rapport avec l'UART ?


    Code:
     void interrupt ()
    {
    
    
     if ( TRM1I_bit==1 )    // si flag interruption armé
     {
         i= i+1;
         if(i=1){
             PORTB = 0b00000001;
          }
         if(i=2){
             PORTB = 0b00000011;
         }
         if(i=3){
             PORTB = 0b00000111;
         }
          if(i=4){
             PORTB = 0b00001111;
         }
        TMR1IF_bit = 0;  // desarmer la cause de l'interrupt
       }
      // If data is ready, read it:
     if (RCIF_bit==1)  
    //  if (UART1_Data_Ready() == 1)
     {
         receive = RCREG   ;  //    0b1111111111;
        PORTD = receive;       // Send lower 8 bits to PORTD
        PORTB = receive >> 2;  // Send 2 most significant bits to RB7, RB6
       //  Delay_us(500);       // Le temps de voir les résultats sur les LEDS   pas de lay dans les IT
        }
     }



    et je dois les configurer en entrées ou en sortie? ou je les laisse sans déclaration!
    tu peux les mettre en entree par defaut, mais l'init UART les reconfigurera correctement
    Dernière modification par paulfjujo ; 15/06/2014 à 18h22.

  10. #9
    invite03481543

    Re : USART du PIC16F877

    Bonsoir,

    on écrit pas:
    Code:
    if(i=2)
    mais:
    Code:
    if(i==2)
    Cette erreur est faite partout dans ton code.

    @+

  11. #10
    paulfjujo

    Re : USART du PIC16F877

    je te conseille de partir sur un code bien plus petit , afin de pouvoir resoudre chaque probleme
    deja afficher simplement la lecture d'une voie ADC ..
    les interruptions, plus tard..


    Code:
    char buffer[30];
    
    // cette fonction permet d'econnomiser de la ram lorsqu'on veut ecrire du texte via le code 
    void UART1_Write_CText(const char *txt)
     {
       while (*txt)
          UART1_Write(*txt++);
    }
    
    
    void main() {
      ADCON1 = 0x80;  // Configure analog inputs and Vref
      TRISA  = 0xFF;  // PORTA is input
      TRISD  = 0;     // PORTD is output
      TRISB = 0;   //configuration en sortie RB6 et RB7
      INTCON = 0x00;
    
    // Non c'est l'init UART qui s'en charge
    //  TXSTA = 0b00100000; //activation du bit TXEN
    //  RCSTA = 0b00010000; //activation du bit CREN
    
      UART1_Init(9600);; //Inititalisation et etablissement de la communication avec USART
       Delay_ms(100);
    
    // 1ere chose , verifier que l'UART fonctionne (au moins en transmission)
     UART1_Write_CText("\n\r  TEST UART \r\n ");   
     ADC_Init();  //  prealable à l'usage de ADC..read
     UART1_Write_CText(" Init ADC \r\n ");   
    
    
    //  Init_Timer1();    // à developper
    
    
    // init interruptions
    //INTCON =>  GIE ,PEIE, T0IE, INTE ,RBIE, T0IF, INTF, RBIF
      INTCON=0;
    //  RCIE_bit=1;   // autorisation interupt UART Rx
    // TMR1IE_bit=1; // autorisation interupt timer1
    //  PEIE_bit=1; // autorise interrupt peripherie
    //  GIE_bit=1; // valide toutes les IT
    
    // TMR1ON_bit=1;  // lance  timer1
    
    
     
     PORTB = 0;
    do
    {          // la 1ere parenthese à gauche permet mieux de verifier l'alignement
              // trait rouge vertical sous MikroC avec la parenthese fermente
    
       temp_res = Adc_Read(0); // Get results of AD conversion lecture des données du port A0
      
     // c'est pourquoi faire cette batterie de tests ?
     // pour l'instant oublie tout ca et fait simplement afficher la mesure ADC via l'UART
    /*
        if (temp_res==0b00000000 ){
              temp_res = Adc_Read(1);
              if(temp_res==0b00000000){
                  temp_res= Adc_Read(2);
                  if(temp_res==0b00000000){
                      temp_res= Adc_Read(3);
                      if(temp_res==0b00000000){
                         temp_res= Adc_Read(4);
                         if(temp_res==0b00000000){
                             UART1_Init(9600);    //Inititalisation et etablissement de la communication avec USART
                             Delay_ms(100);
                             UART1_Write(temp_res);
                         }
                      }
                      else{
                        UART1_Init(9600);; //Inititalisation et etablissement de la communication avec USART
                        Delay_ms(100);
                        UART1_Write(temp_res);
                      }
                  }
                  else{
                     UART1_Init(9600); //Inititalisation et etablissement de la communication avec USART
                    Delay_ms(100);
                    UART1_Write(temp_res);
                   }
              }
              else{
                UART1_Init(9600); //Inititalisation et etablissement de la communication avec USART
               Delay_ms(100);
               UART1_Write(temp_res);
              }
         }
        else
      {
         UART1_Init(9600); //Inititalisation et etablissement de la communication avec USART
         Delay_ms(100);
         UART1_Write(temp_res);
        }
    */
    
        temp_res = Adc_Read(0);
     //   UART1_Write(temp_res);
    //  non,car c'est du binaire et non pas de l'ascii imprimable
    // il faut utiliser la conversion   IntToStr(int input, char *output);
    // donc declarer aussi un buffer de taille suffsante 
    
       IntToStr(temp_res,buffer);
      UART1_Write_Text(buffer);
      UART1_Write(13); // change de ligne
      UART1_Write(10);    // retour à la ligne
      delay_ms(500);
    
    }while(1);
    
    }

  12. #11
    misselectro45

    Re : USART du PIC16F877

    oui t'as surement raison! Bon je résume ce que je dois faire!
    je dois construire une carte d'acquisition de donnée avec 4 entrée (RA0 à RA3 de mon pic) et 4 sortie analogiques. Pour cela, chaque entrée doit être convertit par le CAN du PIC pour pouvoir être transmis vers un PC par RS232. Et lorsque j'envoie une donnée de mon PC vers mon PIC! cette donnée doit donc Etre affichée en 10bits à la sortie de mon PIC. Donc les multiples tests if, ce sont les tests sur mes entrées que j'aimerais envoyer successivement vers mon PC pour pouvoir recevoir ces valeurs sur mon PC. et l'interruption c'est l'interruption pour pouvoir récupérer les valeurs transmis par mon PC tous les 2ms si c'est possibles.
    Vos conseils me seront vraiment précieuses! Merci

  13. #12
    hades1992

    Re : USART du PIC16F877

    bonsoir j ai lu cette conversation, et j ai été attiré par le fait qu on peut etablir une liaison serie entre pic (qui ne contient pas de USART comme le 16F84A) et pc d une maniere software.
    ma question c est est ce que c est possible de le faire en assembleur, vu qu en mikroC ya des fonction predefinies(si j ai bien compris).
    merci
    keep calm and carry on ^^

  14. #13
    misselectro45

    Re : USART du PIC16F877

    Merci beaucoup Pauljujo, tes explications m'ont beaucoup aidé!
    Mais en ce moment, après avoir tapé suivi les étapes que tu m'a dit de faire, j'obtiens en simulant sur Proteus, un résultat bizarre! j'ai relié un virtual terminal sur la liaison RS232 et et le résultat obtenu est identique à cette figure! je te remercie toujours pour tes valeureux conseils!
    Images attachées Images attachées  

  15. #14
    paulfjujo

    Re : USART du PIC16F877

    bonjour,

    Citation Envoyé par hades1992 Voir le message
    ....est ce que c est possible de le faire en assembleur
    Oui, tu devrais trouver multe exemple sur le web..
    sinon je peux te passer un programme utilisant la RS232 (donc les routines correspondantes)..

    Nota: sous mikroC la librairie Soft UART est acceptée ..compilation OK
    mais je ne l'ai pas testée en reel..

    Code:
    const unsigned char Msg1[] =" Velo 16F84 MIKROC";
    
     /*  write the s constant string to RS232  */
    void    Comm_WriteConst(const unsigned char *s)
    {
     while(*s)
      {
      Soft_UART_Write(*s) ;
      s++ ;
      }
    }
    
    void main()
     {
     /*   Init */
     TRISB = 0b00001111 ;  // RB0..RB3 = entrees RB4..RB7= sorties LCD Data
     TRISA = 0b11110111 ;   // RA3 = TX  RA4=RX   RA0..RA2=Sorties LCD CTRL
     OPTION_REG = 0b11011000 ;
      Soft_UART_Init(PORTA, 3, 4, 19200, 0) ; // RS232 on PORTB, bits 1 & 2, 19200bds
     Comm_WriteConst(Msg1) ; // write welcome message
     do
     {}
     while(1);
     }

  16. #15
    paulfjujo

    Re : USART du PIC16F877

    bonjour,

    Citation Envoyé par misselectro45 Voir le message
    Bon je résume ce que je dois faire!
    je dois construire une carte d'acquisition de donnée avec 4 entrée (RA0 à RA3 de mon pic) et 4 sortie analogiques. Pour cela, chaque entrée doit être convertit par le CAN du PIC pour pouvoir être transmis vers un PC par RS232. Et lorsque j'envoie une donnée de mon PC vers mon PIC! cette donnée doit donc Etre affichée en 10bits à la sortie de mon PIC. Donc les multiples tests if, ce sont les tests sur mes entrées que j'aimerais envoyer successivement vers mon PC pour pouvoir recevoir ces valeurs sur mon PC. et l'interruption c'est l'interruption pour pouvoir récupérer les valeurs transmis par mon PC tous les 2ms si c'est possibles.

    Il est TRES IMPORTANT d'etablir un cahier des charges le plus concis possible , en langage clair .
    (eviter de mettre des lignes de texte de plus de 80 caracteres!)
    si je reprends le texte :

    je dois construire une carte d'acquisition de donnée avec
    4 entrée (RA0 à RA3 de mon pic)
    4 entrees logiques ...(Tout ou Rien )
    et 4 sortie analogiques.
    par quel moyen ? ne serait-ce pas plutot des Entrees Analogiques ?

    Pour cela, chaque entrée doit être convertit par le CAN du PIC pour pouvoir être transmis vers un PC par RS232.
    sous quel format ?
    definir la gamme de mesure
    en binaire 0101..0 , en hexadecima 0x3FF , en decimal 1023, en unite physique 4,995 (Volts) ?


    Et lorsque j'envoie une donnée
    definir ce qu'est une donnee
    de mon PC vers mon PIC! cette donnée doit donc Etre affichée en 10bits
    voir commentaire precedent .
    à la sortie de mon PIC.
    la sortie du PIC ? ou via la sortie serie UART du PIC
    .

    Donc les multiples tests if, ce sont les tests sur mes entrées
    entrees logiques ?
    pour definir quelle voie analogique est en cours de mesure ?
    que j'aimerais envoyer successivement vers mon PC pour pouvoir recevoir ces valeurs sur mon PC.
    pas clair ?
    et l'interruption c'est l'interruption pour pouvoir récupérer les valeurs transmis par mon PC tous les 2ms
    Ce serait pas plutot
    et l'interruption à 2mS , c'est pour cadencer les envois du PIC vers mon PC ?


    Le PC doit -il envoyer des commandes au PIC ?
    i

  17. #16
    paulfjujo

    Re : USART du PIC16F877

    Citation Envoyé par misselectro45 Voir le message
    j'obtiens en simulant sur Proteus, un résultat bizarre!
    la config du terminal est bien respectée : 9600,N,8,1 ?
    la frequence d'horloge du PIC ?
    la configuration ..où est definie FOSC , qui doit correspondre avec le quartz utilisé..
    sinon la vitesse en baud ne correpondra pas.

    reposte to code d'essai..

  18. #17
    misselectro45

    Re : USART du PIC16F877

    oui! effectivement le PIC envoie des commandes au PIC!
    Je suis vraiment désolé de la manière dont j'ai rédigé! c'est vrai que c'est un peu flou!

    je dois construire une carte d'acquisition de donnée avec
    4 entrée (RA0 à RA3 de mon pic)

    oui 4 entrées analogiques

    et 4 sorties analogiques.
    oui 4 sorties analogiques.
    donc par exemple, de mon PC, j'envoie un 5V sur la sortie1 et 3V sur la sortie 2. Le PC envoie donc ces valeurs successivement j'imagine sur mon PC par la liaison USART que j'affiche sur les sortie du PIC en 10bits, je les fais ensuite passer dans un convertisseur numérique analogique pour avoir les sorties analogiques. Donc mes données dans ce projet est une valeur comprise entre -5V et 5V mais je ne sais pas si les valeurs négatives sont permises

    Pour cela, chaque entrée doit être convertit par le CAN du PIC pour pouvoir être transmis vers un PC par RS232
    Alors là, le format? je ne sais pas trop! le cahier de charge ne l'a pas préciser! Mon encadreur m'a seulement informé du résultat finale qu'il voudrait avoir avec quelques précisions.

    Donc les multiples tests if, ce sont les tests sur mes entrées
    ce sont les tests sur mes entrées analogiques.
    Là je crois que je me suis un peu trompée car mon but était d'envoyé tous les grandeurs physiques se trouvant sur les 4 entrées analogiques que moi même j'injecte à l'entrée, vers mon PC pour que je puisse les lire et les utilisés avant d'envoyer une nouvelle valeur (toujours entre -5V à 5V ) adéquate.

    Et pour l'interruption de 2ms est effectivement pour cadencer l'envoie du PIC vers Le PC. C'est à dire qu'à chaque 2ms, je dois vérifier si une nouvelle valeur est arrivé pour que je puisse les afficher à l'une des 4 sorties analogiques.

    En résumé. J'injecte une valeur comprise entre (-5V à 5V) que j'envoie ensuite au PC pour que je puisse toutes les lire. Puis à un certain moment, je transmet ensuite une valeur (-5V à 5V) vers le PIC par USART pour qu'il puisse les afficher sur la sortie de PIC en 10bits que je vais convertir en analogique pour obtenir ma sortie analogique.
    J'espère que j'ai dit tous les détails.
    Merci bien pour ton dernier code! je fais le tester!
    Dernière modification par misselectro45 ; 16/06/2014 à 13h34.

  19. #18
    misselectro45

    Re : USART du PIC16F877

    Voici mon code d'essai!
    Code:
    // ---------------------VARIABLES GLOBALES------------------------------
    char buffer[30];
    
    unsigned int temp_res;
    unsigned int receive;
    
    // cette fonction permet d'econnomiser de la ram lorsqu'on veut ecrire du texte via le code
    void UART1_Write_CText(const char *txt)
     {
       while (*txt)
          UART1_Write(*txt++);
    }
    
    
    
    //---------------------PROGRAMME PRINCIPALE---------------------------
    void main() {
      ADCON1 = 0x80;  // Configure analog inputs and Vref
      TRISA  = 0xFF;  // PORTA is input
      TRISC = 0b11000000;   //Configuration des pins RC6 et RC7 en entrée
      TRISD  = 0;     // PORTD is output
      TRISB = 0;   //configuration en sortie RB6 et RB7
      
    
      //Inititalisation et etablissement de la communication avec USART
      UART1_Init(9600);
      Delay_ms(100);
      // 1ere chose , verifier que l'UART fonctionne (au moins en transmission)
     UART1_Write_CText("\n\r  TEST UART \r\n ");
     delay_ms(100);
     ADC_Init();  //  prealable à l'usage de ADC..read
     UART1_Write_CText(" Init ADC \r\n ");
     
     PORTB = 0;
     do{
       temp_res = Adc_Read(0); // Get results of AD conversion lecture des données du port A0
       IntToStr(temp_res,buffer);
      UART1_Write_Text(buffer);
      UART1_Write(13); // change de ligne
      UART1_Write(10);    // retour à la ligne
      delay_ms(500);
     
     }while(1);
     
    }

  20. #19
    paulfjujo

    Re : USART du PIC16F877

    et que donne ce code d'essai en terme de résultat..
    la valeur ADC0 est -elle affichéee sur le terminal du PC ?

    Reponse au post#16 ?


    concernant les reponses du post#17
    je n'ai pas tout compris entre ce qui fait quoi ...
    essaie de faire un synoptique du fonctionnement final attendu
    avec un pavé representant le PIC, un autre le PC
    et quels sont les echanges d'info attendus entre les 2..

    En résumé. J'injecte une valeur comprise entre (-5V à 5V) que j'envoie ensuite au PC pour que je puisse toutes les lire. Puis à un certain moment, je transmet ensuite une valeur (-5V à 5V) vers le PIC par USART pour qu'il puisse les afficher sur la sortie de PIC en 10bits que je vais convertir en analogique pour obtenir ma sortie analogique.
    ce que j'en comprends:
    J'injecte une valeur comprise entre (-5V à 5V) que j'envoie ensuite au PC
    Injectée comment ?
    Le PC aurait des entrees analogiques de -5 à +5V ?
    pour que je puisse toutes les lire
    sur le PC ?
    je transmet ensuite une valeur (-5V à 5V) vers le PIC par USART
    une valeur ? celle de la valeur analogique acquise par le PC ?
    transmise au PIC sous quel format ? en ascii , hexadecimal ..
    ex en ascii : +4,75V , ou -3,25V
    avec un terminateur d'envoi ex: <CR> code Carriage Return = 0x0D pour retour à la ligne ?
    dans ce cas le PIC s'attendrait à recevoir 7 caracteres (incluant le CR).
    si c'est le pC qui envoi la valeur ANA via l'UART,
    pas besoin d' entrees Analogique ADC sur le PIC pour afficher cette valeur .

    Code:
    les afficher sur la sortie de PIC en 10bits
    comments .. sur des leds 8 sur le PORTB et 2 sur le PORTD ?
    si j'en crois les posts precedents.


    que je vais convertir en analogique pour obtenir ma sortie analogique.
    Quelle sortie analogique ?
    Ce PIC n'en a pas !
    A moins que tu convertisse "Avec les yeux" en comptant le poids des leds allumée ?

    que je puisse les afficher à l'une des 4 sorties analogiques.
    il y en a 1 ou 4 ?


    Je ne sais pas si mes reponses sont dans le cadre, mais à toi de bien remettre tout à plat.
    Il y a du pain sur la planche .....

    Tu vois que chacune de tes reponses engendre multe questions..
    c'est ton boulot de definir le cahier des charges, quitte à suriner ton prof..

  21. #20
    misselectro45

    Re : USART du PIC16F877

    comment ça ADCO du PIC? Tu veux parler du USART terminal du PIc ou koi? je ne comprend pas bien!
    Et concernant le schéma synoptique, je vais le faire et te l'envoyer après car t'as raison, j'ai encore du pain sur la planche et je dois tout finir dans 1 mois!

  22. #21
    misselectro45

    Re : USART du PIC16F877

    voilà le schéma synoptique, j'espère que ça t'aiderai à mieux comprendre ce projet!
    Donc le système ici est un générateur par exemple ou encore un système qui délivre une tension comprise entre -5V et 5V qui nous est inconnu. Donc on l'injecte dans notre PIC pour pouvoir lire la valeur sur mon PC.
    Et le retour indique une valeur que moi même j'envoie en retour au système.
    Il s'agit bien d'une carte pour banc de réglage.

    Pièce jointe supprimée
    Dernière modification par JPL ; 16/06/2014 à 17h10.

  23. #22
    JPL
    Responsable des forums

    Re : USART du PIC16F877

    Les schémas doivent être postés dans un format graphique (gif, png ou jpg). Merci.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  24. #23
    misselectro45

    Re : USART du PIC16F877

    Le voilà! désolé, il y a eu une erreur de chargement dans mon dernier message!
    Images attachées Images attachées  

  25. #24
    paulfjujo

    Re : USART du PIC16F877

    avec un dessin , on comprend mieux ( j'espere)

    Le PIC recoit une info -5V à +5V provenant d'un systeme externe
    à traiter sur son entree analogique prevue 0 à +5V => adpatater à prevoir.
    Cette mesure sur 10 bits est envoyéé sur un PC via l'UART TX du PIC
    attention au niveaux TTL/RS232
    mesure au format ascii ou hexa ou ? definir le format de transmission
    Le PC affiche ou traite cette mesure et la renvoie sur l'UART RX du PIC
    attention au niveaux TTL/RS232
    sous quel format ?
    pourquoi faire ?
    le PIC renvoie sur son port D et port B les 10 bits representant xxxx ?
    la valeur qu'il a lue sur lson entree ADC ou la valeur renvoyée par le PC
    Eventuel traitement à prevoir suivant l'excursion de la sortie CNA..
    Eventuelle isolation galvanique, si on ne peut pas relier les 0V des equipements.

    Nom : cep_a.JPG
Affichages : 517
Taille : 32,7 Ko

  26. #25
    misselectro45

    Re : USART du PIC16F877

    Je vais donc d'abord répondre à tes questions sur la figure.
    Oui! là je crois que tu comprend! c'est tous à fait cela, Le PC doit afficher la valeur analogique provenant du système au début.
    Et on renvoie cette valeur car c'est une valeur différente pour pouvoir asservir le système en question et faire multiple tests sur le système.
    Dit est-ce que tu peux m'éclaircir stp sur la valeur adéquate du baude rate à adopter? J'ai lu quelques tutos et si je comprend bien il faut faire quelques configuration dans mon code y compris le RCSTA?

    J'utilise un quartz à 4MHz et comme fréquence du PIC, je ne l'ai pas touché, je l'ai laissé à 1MHz car mon programme allait de fonctionner avec jusqu'à ce problème d'affichage des résultats souhaités sur le virtual terminal. Merci bien!

  27. #26
    misselectro45

    Re : USART du PIC16F877

    Qu'est ce que tu veux dire exactement par "attention au TTL/RS232?" est ce que tu veux parler du MAX232 ou?
    Et quel format? ça je crois que c'était pas préciser, l'intention est de d'effectuer une bonne transmission et reception!

  28. #27
    paulfjujo

    Re : USART du PIC16F877

    Citation Envoyé par misselectro45 Voir le message
    "attention au TTL/RS232?" est ce que tu veux parler du MAX232
    Oui,le MAX232

    Le baud rate doit etre le meme des 2 coté PIC UART et PC
    il est definit au moment de
    Code:
     UART1_Init(9600);   // RS232
    pas besoin de toucher au registre RCSTA

    Tu n'as pas precisé le format des données transmises ( pas le format de la transmission UART!)
    à savoir comment le PIC va envoyer les donnees au PC
    en hexadecimal 0x3FF ? ou en decimal 1023 ? je pense que le format ascii ,
    avec representation decimale serait le plus approprié
    d'autant si on veut visualiser sur le PC.

    notion de trame:
    suivant le niveau de securité des infos transmises, il est quelquefois necessaire d'encapsuler les données
    dans une trame. ex: trame modbus pour automate, trame TCP/IP sur liaison ethernet ..etc..
    il faut que le PC puisse identifier un debut de message et une fin de message pour en deduire qu'il recoit une donnee
    ex: M1023CR> debut='M' valeur sur 4 digit numerique termiateur=<CR> (code 13) et longueur message=6

    Le PC renvoi une donnee modifié ..destinéee au PIC
    sous quel format de donnees (trame)?

    Protocole de dialogue , y a t-il un protocole à respecter, imposé par le PC ?
    ou c'est le PC qui va s'adapter au protocole du PIC .

    Il faudra sans doute gerer la reception UART PIC, via interruption ..

  29. #28
    misselectro45

    Re : USART du PIC16F877

    Merci pour l'explication!
    oui effectivement mes baudes rates sont les mêmes des 2 côtés mais j'obtiens toujours ce résultats bizarre! Mais bon...
    Et toujours concernant le format des données? où est ce que je dois préciser ce format 'ascii'. Je vois bien dans microC, dans USART Terminal, il y a les différents formats mais comment l'insérer dans le code ou dans le virtual terminal du proteus! j'ai pas bien saisi!

  30. #29
    paulfjujo

    Re : USART du PIC16F877

    Protocole de dialogue , y a t-il un protocole à respecter, imposé par le PC ?
    ou c'est le PC qui va s'adapter au protocole du PIC .
    reponse ?

    sinon, pour envoyer une valeur issue de l'ADC en ascii vers le PC
    voir l'exemple dans le post precedent
    IntTo STr conversion entier vers string
    ( un string est une suite d'octet en ascii, normalement terminé par un octet=zero)
    ici la conversion est rangee dans buffer.

    Code:
     temp_res = Adc_Read(0); // Get results of AD conversion lecture des données du port A0
       IntToStr(temp_res,buffer);
      UART1_Write_Text(buffer);
      UART1_Write(13); // change de ligne
      UART1_Write(10);    // retour à la ligne
    Dernière modification par paulfjujo ; 17/06/2014 à 13h12.

  31. #30
    misselectro45

    Re : USART du PIC16F877

    .Protocole de dialogue , y a t-il un protocole à respecter, imposé par le PC ?
    ou c'est le PC qui va s'adapter au protocole du PIC .

    Non, il n'y a aucun protocole à ma connaissance, je ne vois pas aucun protocole et jusqu'à maintenant je ne l'ai pas encore tester en réalité car je suis encore sous Proteus utiliant un virtual terminal. Je me suis un peu documenter et le Proteus dit que le format par défaut est en ascii et si tu dit que le string est aussi en ascii alors ça devrait fonctionner.

    Et ce code, je l'ai déja testé et j'ai obtenu le résultat bizarre que je t'ai envoyé!
    Franchement je ne sais pas ce qui cloche! ça doit marcher non?
    je l'ai envoyé en string en utilisant IntToStrg comme tu me l'as dit mais en vain!

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. PIC 18F et USART
    Par dudu721 dans le forum Électronique
    Réponses: 9
    Dernier message: 18/11/2013, 15h43
  2. Probleme USART PIC16F877
    Par invite2d9e7c03 dans le forum Électronique
    Réponses: 4
    Dernier message: 27/08/2009, 10h49
  3. USART sur PIC
    Par noisyboxes dans le forum Électronique
    Réponses: 6
    Dernier message: 23/04/2007, 07h39
  4. Usart ou I2C?
    Par invite0b3246fe dans le forum Électronique
    Réponses: 45
    Dernier message: 28/02/2007, 14h19
  5. Usart Avr
    Par invite2b4da655 dans le forum Électronique
    Réponses: 13
    Dernier message: 20/05/2006, 23h43
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...