Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chenillard à entassement à base de PIC16f887

    12 mars 2011 à 0:14:58

    Salut,
    J'aimerai avoir votre aide pour terminer un TP de micro contrôleur PIC16f887.Donc voici le cahier de charger on à des leds relier à tout le PORTC.On doit allumer une led et la faire déplacé et l'accumulé en bas. j'ai fait un petit bout de se programme mais j'ai comme un petit problème je sais pas comment le résoudre...
    void main()
    {
    unsigned char A=1,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;
    PORTC=0x00;
    TRISC=0x00;
            while(1)
           {
            PORTC=A|B|C|D|E|F|G|H|I;delay_ms(50);
            A=A<<1;
            if(A==0x01)B=A;
            if(A==0x02)C=A;
            if(A==0x04)D=A;
            if(A==0x08)E=A;
            if(A==0x10)F=A;
            if(A==0x20)G=A;
            if(A==0x40)H=A;
            if(A==0x80)I=A;
            if(A==0)A=1;
            }
    }
    

    PS: je suis très nul en programmation... c'est pas notre spécialité mais on doit faire se truc :s :s
    • Partager sur Facebook
    • Partager sur Twitter
      12 mars 2011 à 12:16:45

      J'aurais tendance à faire défiler un '1' sur les bits du port à utiliser jusqu'à arriver au dernier, et recommencer avec un bit de moins, genre (en utilisant plein de variables pour détailler le calcul :
      #define DELAY_DURATION 250
      #define NB_OF_BITS 8
      
      int current_value;
      int next_value;
      int working_bits_mask;
      
      int i=NB_OF_BITS;
      PORTC=0;
      for(;;)
      {
          //je calcule un mask pour ne conserver que les bits encore utilisés
          working_bits_mask = ((1<<i)-1);
      
          //je récupère la valeur des bits en cours de parcours
          current_value = PORTC & working_bits_mask;
      
          //je calcule la prochaine valeur pour le parcours
          if (current_value)
              next_value = current_value << 1;
          else //si il n'y a pas de bit dans la course, j'en insère un
              next_value = 1;
          //j'affiche la valeur
          PORTC = (PORTC & (~(working_bits_mask))|next_value;
      
          //j'attends pour qu'on ait le temps de la voir
          delay_ms(DELAY_DURATION);
      
          //je regarde si mon bit est arrivé
          if (next_value == (1<<i))
          {
              //si oui, je réduit le nombre de bits de travail
              i--;
      
              //si j'ai remplis tout mon port
              if(i==0)
              {
                  //je réinitialise tout
                  i=NB_OF_BITS;
                  PORTC=0;
                  //je laisse le port vide s'afficher
                  delay_ms(DELAY_DURATION);
              }
          }
      }
      



      PS : c'est un problème de langage C, je fais une requête pour changer le sujet de section
      • Partager sur Facebook
      • Partager sur Twitter
      64kB de mémoire, c'est tout ce dont j'ai besoin
        13 mars 2011 à 10:28:03

        Salut Nathalya,
        merci pour le coup de main mais il y a t'il pas un moyen de faire plus simple il y a un petit soucis lors de la premier itération le bit décent et s'accumule pas faut attendre le 2eme.mais après sa marche très bien :))
        • Partager sur Facebook
        • Partager sur Twitter
          13 mars 2011 à 12:51:03

          Effectivement, il faut remplacer i par (i-1) en ligne 36.

          Quant à la simplicité, j'ai indiqué que je faisais une implémentation découpant les calculs. Si je devais l'implémenter, je préfèrerais une écriture de ce style :

          #include <p16f887.h>
          
          #define DELAY_DURATION 250
          #define NB_OF_BITS 8
          
          void chase_run(void)
          {
              static int value=0;
              static int storage=0;
              static int nb_of_working_bits=0;
          
              value = (value?(value<<1):1);
          
              //ici, on utilise + et non | pour permettre l'affichage du chenillard vide
              PORTC = ~((1<<nb_of_working_bits)-1) + value;
          
              if ((!nb_of_working_bits) || (value == 1<<(nb_of_working_bits-1)))
              {
                  value=0;
                  nb_of_working_bits = (nb_of_working_bits)?(nb_of_working_bits-1):NB_OF_BITS;
              }
          }
          
          int main (void)
          {
              TRISC=0x00;
          
              for(;;)
              {
                  chase_run();
                  delay_ms(DELAY_DURATION);
              }
          }
          


          On constatera que les opérations sont les même. Par contre j'ai sorti le delay de la fonction, ce qui permet de la cadencer comme on le souhaite, à partir d'une IT par exemple.
          • Partager sur Facebook
          • Partager sur Twitter
          64kB de mémoire, c'est tout ce dont j'ai besoin
            13 mars 2011 à 14:57:21

            J'ai changé le i que tu m'a dit mais le résultat restait le même.Par contre le second programme marche à merveille :),je pense que je vais garder le second merci bien :D
            • Partager sur Facebook
            • Partager sur Twitter
              14 février 2019 à 1:58:59

              bonsoir est-il possible d'utiliser ce programme pour tous les micro-controlleur ???
              • Partager sur Facebook
              • Partager sur Twitter

              Chenillard à entassement à base de PIC16f887

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown