aide pour modifier un programme du pic
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

aide pour modifier un programme du pic



  1. #1
    invite8fabcf6d

    Question aide pour modifier un programme du pic


    ------

    s'ils vous plait vous pouvez m'aider a modifier ce programme pour faire sortire la valeur de la distance vers
    un port du pic et non le lcd supprimer tout les code en relation avec le lcd

    voila

    Code:
    /*
     * Project name:
         Test du HC-SR04
     * Test configuration:
         MCU:             PIC16F877A
         Oscillator:      HS, 12.0000 MHz
         Ext. Modules:    Character LCD 2x16
                          HC-SR04
         SW:              mikroC PRO for PIC
    */
    // LCD connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB6_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB6_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD connections
    
    
    char txt1[] = "Test du capteur";
    char txt2[] = "HC-SR04";
    char txt3[] = "Distance :";
    char txt4[7];
    unsigned long Cumul;
    unsigned tWord,tOld, tNew;
    char th,tl;
    char edge = 0;
    char capture = 0;
    float temps = 0;
    float distance = 0;
    float distance2 = 0;
    
    
    void interrupt() {
    
      if(PIR1.CCP1IF){                 //Si PIR1.CCP1IF égal à 1
        if(!edge){                     //Si edge égal à 0
          CCP1CON = 0x04;              // Mode de capture a chaque front descendant
          tOld = 256*CCPR1H + CCPR1L;      //garde la valeur de départ
          edge = 1;                        //edge prend la valeur 1
        }else{
          tNew =256*CCPR1H + CCPR1L;     //garde la valeur de fin
          capture = 1;                   //indicateur capture términée
          edge = 0;                      //edge prend la valeur 0
        }
        PIR1.CCP1IF = 0;               //remise à 0 du flag (PIR1.CCP1IF)
      }
    
    }
    
    
    void main() {
    
      char i;
      TRISB = 0;       // PORTB en sortie
      PORTB = 0;       // Initialisation du PORTB
      TRISA = 0;       // PortA en sortie
      PORTA = 0x00;    // Initialisation du PORTA
      TRISC = 0;       // PortC en sortie
      CCP1CON = 0x05;           // Mode de capture a chaque front montant
      TRISC.F2 = 1;             // RC2 en entré
      T1CON = 0x21;             // timer1 ON, internal clock Fosc/4, prescaler 1:4
      INTCON.GIE = 1;
      INTCON.PEIE =1;
      PIE1.CCP1IE = 1;           // active la capture par interruption
      PIR1.CCP1IF = 0;           //remise à 0 du flag (PIR1.CCP1IF)
    
      Lcd_Init();                        // Initialisation du LCD
    
      Lcd_Cmd(_LCD_CLEAR);               // Effacer le LCD
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Desactivation du curseur
      Lcd_Out(1,2,txt1);                 // Ecrire text 1
      Lcd_Out(2,6,txt2);                 // Ecrire text 2
      Delay_ms(2000);
      Lcd_Cmd(_LCD_CLEAR);               // Effacer le LCD
    
      PORTA = 0x01;                      //    Envoi une impulsion
      Delay_us(10);                      //    de 10 microsecondes
      PORTA = 0x00;                      //    dans la broche RA1
    
      while(1)
      {
        if(capture){
        PIE1.CCP1IE = 0;                //desactive  la capture par interruption
        capture = 0;                    // Capture prend la valeur 0
        tWord = ~tOld + tNew+1;           //Calculer la longueur de l'impulsion de front montant à front montant
        CCP1CON = 0x05;                   // Mode de capture a chaque front montant
        
        // tword contiennent longueur d'impulsion en micro seconde
      
        temps =((float)tWord*4)/3;
        distance = ((float)temps*17)/1000;       //calcul de la distance en cm
        floatToStr(distance,txt4);
      
        Delay_ms(70);
        PIR1.CCP1IF = 0;                 //remise à 0 du flag (PIR1.CCP1IF)
        PIE1.CCP1IE = 1;                 // enable interrupt
        
        if(distance !=distance2){
          Lcd_Cmd(_LCD_CLEAR);               // Effacer le LCD
          Lcd_Cmd(_LCD_CURSOR_OFF);          // Desactivation du curseur
          Lcd_Out(1,1,txt3);                 // Ecrire text 3
          Lcd_Out(2,8,txt4);                 // Afficher distance
        }
        
        distance2 = distance;
        PORTA = 0x01;                      //    Envoi une impulsion
        Delay_us(10);                      //    de 10 microsecondes
        PORTA = 0x00;                      //    dans la broche RA1
        }
      }
    }
    sujet original

    http://forums.futura-sciences.com/el...ic16f877a.html


    merci merci

    -----

  2. #2
    invitef86a6203

    Re : aide pour modifier un programme du pic

    Comment veux tu afficher un float sur un port 8 bits ?
    ou un int16 sur 8 bits ?

  3. #3
    invite8fabcf6d

    Re : aide pour modifier un programme du pic

    merci de votre reponse


    oui je veux supprimer la virgule puis le faire sortir au port

    si le nombre est de 8 bits je le fait sortire sinon reprendre le programme son rien sortire

  4. #4
    invitef86a6203

    Re : aide pour modifier un programme du pic

    on envoie la valeur float convertie en char sur le PORTB
    Ce qui signifie qu'au dela de 255 cm la mesure est fausse !!!

    On pourrait diminué la précision par 2 afin d'aller 2 fois plus loin, mais la valeur sur le port serait toujours de 0 à 255 et il faudrait la x2 pour savoir la vrai valeur...


    Modif non testées...

    Code:
    /*
     * Project name:
         Test du HC-SR04
     * Test configuration:
         MCU:             PIC16F877A
         Oscillator:      HS, 12.0000 MHz
         Ext. Modules:    Character LCD 2x16
                          HC-SR04
         SW:              mikroC PRO for PIC
    */
    
    
    unsigned long Cumul;
    unsigned tWord,tOld, tNew;
    char th,tl;
    char edge = 0;
    char capture = 0;
    float temps = 0;
    float distance = 0;
    float distance2 = 0;
    
    
    void interrupt() {
    
      if(PIR1.CCP1IF){                 //Si PIR1.CCP1IF égal à 1
        if(!edge){                     //Si edge égal à 0
          CCP1CON = 0x04;              // Mode de capture a chaque front descendant
          tOld = 256*CCPR1H + CCPR1L;      //garde la valeur de départ
          edge = 1;                        //edge prend la valeur 1
        }else{
          tNew =256*CCPR1H + CCPR1L;     //garde la valeur de fin
          capture = 1;                   //indicateur capture términée
          edge = 0;                      //edge prend la valeur 0
        }
        PIR1.CCP1IF = 0;               //remise à 0 du flag (PIR1.CCP1IF)
      }
    
    }
    
    
    void main() {
    
      char i;
      TRISB = 0;       // PORTB en sortie
      PORTB = 0;       // Initialisation du PORTB
      TRISA = 0;       // PortA en sortie
      PORTA = 0x00;    // Initialisation du PORTA
      TRISC = 0;       // PortC en sortie
      CCP1CON = 0x05;           // Mode de capture a chaque front montant
      TRISC.F2 = 1;             // RC2 en entré
      T1CON = 0x21;             // timer1 ON, internal clock Fosc/4, prescaler 1:4
      INTCON.GIE = 1;
      INTCON.PEIE =1;
      PIE1.CCP1IE = 1;           // active la capture par interruption
      PIR1.CCP1IF = 0;           //remise à 0 du flag (PIR1.CCP1IF)
    
      
      PORTA = 0x01;                      //    Envoi une impulsion
      Delay_us(10);                      //    de 10 microsecondes
      PORTA = 0x00;                      //    dans la broche RA1
    
      while(1)
      {
        if(capture){
        PIE1.CCP1IE = 0;                //desactive  la capture par interruption
        capture = 0;                    // Capture prend la valeur 0
        tWord = ~tOld + tNew+1;           //Calculer la longueur de l'impulsion de front montant à front montant
        CCP1CON = 0x05;                   // Mode de capture a chaque front montant
        
        // tword contiennent longueur d'impulsion en micro seconde
      
        temps =((float)tWord*4)/3;
        distance = ((float)temps*17)/1000;       //calcul de la distance en cm
      
        Delay_ms(70);
        PIR1.CCP1IF = 0;                 //remise à 0 du flag (PIR1.CCP1IF)
        PIE1.CCP1IE = 1;                 // enable interrupt
        
        if(distance !=distance2){
               PORTB = (unsigned char) distance ;
        }
        
        distance2 = distance;
        PORTA = 0x01;                      //    Envoi une impulsion
        Delay_us(10);                      //    de 10 microsecondes
        PORTA = 0x00;                      //    dans la broche RA1
        }
      }
    }

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

    Re : aide pour modifier un programme du pic

    On affiche 0 au lieu de n'importe quoi si > à sa capacité de 255cm

    Code:
        if(distance !=distance2){
            if (distance <256 )  {
               PORTB = (unsigned char) distance ;
            }
           else  {
              PORTB=0
             }
        }

  7. #6
    invite8fabcf6d

    Re : aide pour modifier un programme du pic

    oui la valeur max est 2 m 55 cm


    si je utilise un quartz de 4 mhz au lieu de 12 mhz la valeur vas être fausse ?
    merci de votre aide

  8. #7
    invitef86a6203

    Re : aide pour modifier un programme du pic

    ça dépend du compilateur normalement on déclare le quartz , mais je ne me vois pas dans ce prog.
    donc à priori si on ne retouche pas le prog, ça sera faux.

    Comme il utilse des delayms etc ... , en déclarant la vitesse le compilo devrait mettre la bonne vitesse.

  9. #8
    invite8fabcf6d

    Re : aide pour modifier un programme du pic

    je pense que si en change le quartz il faut modifier le programme ?

    on a utiliser pour 12 mhz un prescaler 1:4 si on utilise 4 mhz sa change ?

  10. #9
    invitef86a6203

    Re : aide pour modifier un programme du pic

    Pour les timers, oui ça change !
    Mais comme il ne les utilise pas directement ...

    Il compte les pulses qu'il y a dans les 70ms avec la commande delayms , laquelle doit être réglée par le compilateur , avec ou sans timer on ne sait pas, mais c est le problème du compilateur , à mon avis c est des boucles , mais bon, faut voir le code asm.
    ( et si on lui dit la fréquence du quartz ! )

Discussions similaires

  1. Aide pour modif de programme pour PIC
    Par invite4c35b526 dans le forum Électronique
    Réponses: 8
    Dernier message: 24/07/2012, 07h05
  2. Probléme pour modifier un programme
    Par invitea883d7b1 dans le forum Électronique
    Réponses: 5
    Dernier message: 27/04/2011, 11h49
  3. Modifier Un Programme de Pic
    Par invitef894bf53 dans le forum Électronique
    Réponses: 2
    Dernier message: 15/06/2009, 09h36
  4. Aide PIC à programmé pour faire marché un affichage LCD
    Par invite7cbeb964 dans le forum Électronique
    Réponses: 48
    Dernier message: 19/01/2008, 19h40
  5. Aide pour programme PIC18F (PIC-->CNA)
    Par invitefe70cd58 dans le forum Électronique
    Réponses: 1
    Dernier message: 12/06/2006, 22h54
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...