Home
Intro
Corps
Electronique
Mécanique
Programme
Le code source

Voici le code source du programme.
Le programme est codée en C puis le compilateur le passe en assembleur.
//----------------------------------------------------------------------
//tenk.c V 1.0(béta)
//PIC 16F84
//début : 2/03/2004
//dernière modif : 14/5/04
//
//entrées/sorties:
//
//RAO: Commande 86203 Moteur gauche vers l'avant.
//RA1: Commande 86203 Moteur gauche vers l'arrière.
//RA2: Commande 86203 Moteur droit vers l'avant.
//RA3: Commande 86203 Moteur droit vers l'arrière.
//
//   
//
//RBO: Capteur de proximité du compte tours gauche.
//RB1: Capteur de proximité du compte tours droit.
//RB2: DEL cycle en cours. (pull-up la sortie du pic
//est l'inverse de l'état de la DEL)
//RB4: Bouton départ cycle.
//----------------------------------------------------------------------


#include <pic.h>

#include <delay.c>


<pic.h>      //bibliothèque des pic
<delay.c>    //composant de temporisation


#define PORTBIT(adr, bit) ((unsigned) (&adr)*8+(bit)) //définition des noms
                                                      //de variables en entrée.
static bit capt_pas_dr @ PORTBIT(PORTB, 1);           //capteur de proximité
                                                      //du compte tours droit.
static bit capt_pas_ga @ PORTBIT(PORTB, 0);           //capteur de proximité
                                                      //du compte tours gauche
static bit capt_dcy @ PORTBIT(PORTB, 4);              //capteur bouton dcy.

void init_pic(void);                                  //définition des prototypes
void avancer(unsigned char nb_pas_eff);
void reculer(unsigned char nb_pas_eff);
void tourner_ga_ga(unsigned char nb_pas_eff);
void tourner_ga_dr(unsigned char nb_pas_eff);
void tourner_dr_dr(unsigned char nb_pas_eff);
void tourner_dr_ga(unsigned char nb_pas_eff);
void tourner_cen_ga(unsigned char nb_pas_eff);
void tourner_cen_dr(unsigned char nb_pas_eff);
void main(void);

//----------------------------------------------------------------------
//
//    Processus de niveau intermédaire.
//    initialisation du pic
//    
//
//----------------------------------------------------------------------

void init_pic(void)                    //processus d'initialisation du pic
{

 

  TRISA = 0bl000;    //config 10 port A: RAO-RA3 en sorties et RA4 en entrée.
  TRISB = 0blll;     //config 10 port B: RB3 en sortie et RBO-RB2 en entrée.



  RA0=0;             //mise à 0 de toutes les sorties moteurs
  RAl=0;
  RA2=0;
  RA3=0;
  RB2=1;             //mise à 0 de la DEL cycle en cours.


  while(!(capt_pas_dr))  //init position du capteur de rotation droit
  {
    RA2=1;
  }
  RA2=0;

  while(!(capt_pas_ga)) //init position du cateur de position gauche
  {
    RA0=1;
  }
  RA0=0;


}

//----------------------------------------------------------------------
//
//     Processus de niveau intermédaire.
//     gestion des maneuvres
//
//----------------------------------------------------------------------



void avancer(unsigned char nb_pas_eff)
{	                  //fonction avancer [paramètre nombres pas à effectuer]
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  unsigned char pas_mot_dr_done=0;  //variable temp de fin de pas mot droit
  unsigned char pas_mot_ga_done=0;  //variable temp de fin de pas mot gauche

  while(nb pas par < nb pas eff);   //boucle d'avance jusqu'à
  {                                 //ce que tout les pas parcourus
    RA2=1;   //moteur droit vers l'avant
    RA0=1;   //moteur gauche vers l'avant
    pas_mot_dr_done=0;  //init variable fin de pas
    pas_mot_ga_done=0;

    while(!(pas_mot_dr_done && pas_mot_ga_done)) //boucle effectuant un pas
     {
       if (capt_pas_dr)      //si pas moteur droit effectué
       {
         RA2=0;              //éteindre le moteur droit
         pas_mot_dr_done;    //mettre la variable de controle à 1
       }
       if (capt_pas_ga)      //si pas moteur gauche effectué
       {
         RA0=0;              //éteindre le moteur gauche
         pas_mot_ga_done;    //mettre la variable de controle à 1
       }
     }
   }
   nb_pas_par++;   //incrémentation de la variable de pas déja effectués.
  }
}

void reculer(unsigned char nb_pas_eff)
{	                  //fonction reculer [paramètre nombres pas à effectuer]
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  unsigned char pas_mot_dr_done=0;  //variable temp de fin de pas mot droit
  unsigned char pas_mot_ga_done=0;  //variable temp de fin de pas mot gauche

  while(nb pas par < nb pas eff);   //boucle de recul jusqu'à
  {                                 //ce que tout les pas parcourus
    RA3=1;   //moteur droit vers l'arrière
    RA1=1;   //moteur gauche vers l'arrière
    pas_mot_dr_done=0;  //init variable fin de pas
    pas_mot_ga_done=0;

    while(!(pas_mot_dr_done && pas_mot_ga_done)) //boucle effectuant un pas
     {
       if (capt_pas_dr)      //si pas moteur droit effectué
       {
         RA3=0;              //éteindre le moteur droit
         pas_mot_dr_done;    //mettre la variable de controle à 1
       }
       if (capt_pas_ga)      //si pas moteur gauche effectué
       {
         RA1=0;              //éteindre le moteur gauche
         pas_mot_ga_done;    //mettre la variable de controle à 1
       }
     }
   }
   nb_pas_par++;   //incrémentation de la variable de pas déja effectués.
  }
}

void tourner_ga_ga(unsigned char nb_pas_eff)
{                      //fonction tourner à gauche de centre roue gauche
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  RA2=1;                            //moteur droit vers l'avant
  while(nb_pas_par < nb_pas_eff)    //boucle pour la rotation
  {
    if(capt_pas_dr)                 //si pas effectué
    {
      nb_pas_par++;                 //incrémenter variable de pas
      DelayMs(1);                   //petite tempo pour pas
    }                               //recompter le même pas
  }
  RA2=0;           //arrêt moteur droit
}

void tourner_ga_dr(unsigned char nb_pas_eff)
{                       //fonction tourner à droite de centre roue gauche
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  RA3=1;                            //moteur droit vers l'arière
  while(nb_pas_par < nb_pas_eff)    //boucle pour la rotation
  {
    if(capt_pas_dr)                 //si pas effectué
    {
      nb_pas_par++;                 //incrémenter variable de pas
      DelayMs(1);                   //petite tempo pour pas
      }                             //recompter le même pas
  }
  RA3=0;           //arrêt moteur droit
}

void tourner_dr_dr(unsigned char nb_pas_eff)
{                  //fonction tourner à droite de centre roue droite
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  RA0=1;                            //moteur gauche vers l'avant
  while(nb_pas_par < nb_pas_eff)    //boucle pour la rotation
  {
    if(capt_pas_ga)                 //si pas effectué
    {
      nb_pas_par++;                 //incrémenter variable de pas
      DelayMs(1);                   //petite tempo pour pas
    }                               //recompter le même pas
  }
  RA0=0;           //arrêt moteur droit
}

void tourner_dr_ga(unsigned char nb_pas_eff)
{                 //fonction tourner à gauche de centre roue droite
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  RA1=1;                            //moteur gauche vers l'arrière
  while(nb_pas_par < nb_pas_eff)    //boucle pour la rotation
  {
    if(capt_pas_ga)                 //si pas effectué
    {
      nb_pas_par++;                 //incrémenter variable de pas
      DelayMs(1);                   //petite tempo pour pas
    }                               //recompter le même pas
  }
  RA1=0;           //arrêt moteur droit
}

void tourner_cen_ga(unsigned char nb_pas_eff)
{                  //fonction tourner à gauche en rotation centrée
  unsigned char nb_pas_par=0;       //variable temp de pas déja parcourus
  unsigned char pas_mot_dr_done=0;  //variable temp de fin de pas mot droit
  unsigned char pas_mot_ga_done=0;  //variable temp de fin de pas mot gauche

  while(nb pas par < nb pas eff);   //boucle d'avance jusqu'à
  {                                 //ce que tout les pas parcourus
    RA2=1;   //moteur droit vers l'avant
    RA1=1;   //moteur gauche vers l'arrière
    pas_mot_dr_done=0;  //init variable fin de pas
    pas_mot_ga_done=0;

    while(!(pas_mot_dr_done && pas_mot_ga_done)) //boucle effectuant un pas
     {
       if (capt_pas_dr)      //si pas moteur droit effectué
       {
         RA2=0;              //éteindre le moteur droit
         pas_mot_dr_done;    //mettre la variable de controle à 1
       }
       if (capt_pas_ga)      //si pas moteur gauche effectué
       {
         RA0=0;              //éteindre le moteur gauche
         pas_mot_ga_done;    //mettre la variable de controle à 1
       }
     }
   }
   nb_pas_par++;   //incrémentation de la variable de pas déja effectués.
  }
}


void tourner_cen_dr(unsigned char nb_pas_eff)
{	               //fonction tourner à droite en rotation centrée
  unsigned char nb_pas_par=0;       // variable temp de pas déja parcourus
  unsigned char pas_mot_dr_done=0;  //variable temp de fin de pas mot droit
  unsigned char pas_mot_ga_done=0;  //variable temp de fin de pas mot gauche

  while(nb pas par < nb pas eff);   //boucle d'avance jusqu'à
  {                                 //ce que tout les pas parcourus

    RA3=1;   //moteur droit vers l'arrière
    RA0=1;   //moteur gauche vers l'avant
    pas_mot_dr_done=0;  //init variable fin de pas
    pas_mot_ga_done=0;

    while(!(pas_mot_dr_done && pas_mot_ga_done)) //boucle effectuant un pas
     {
       if (capt_pas_dr)      //si pas moteur droit effectué
       {
         RA2=0;              //éteindre le moteur droit
         pas_mot_dr_done;    //mettre la variable de controle à 1
       }
       if (capt_pas_ga)      //si pas moteur gauche effectué
       {
         RA0=0;              //éteindre le moteur gauche
         pas_mot_ga_done;    //mettre la variable de controle à 1
       }
     }
   }
   nb_pas_par++;   //incrémentation de la variable de pas déja effectués.
  }
}

//----------------------------------------------------------------------
//
//  Parcours à effectuer
//
//----------------------------------------------------------------------

void main(void);
{
  while(1);             //boucle infinie
  {
    init_pic();         //initialisation du pic
    RB2=0;              //allumer DEL            1
    DelayMs(100);       //tempo 100 ms
    RB2=1;              //éteindre DEL
    DelayMs(100);       //tempo 100 ms
    RB2=0;              //allumer DEL            2
    DelayMs(100);       //tempo 100 ms
    RB2=1;              //éteindre DEL
    DelayMs(100);       //tempo 100 ms
    RB2=0;              //allumer DEL            3

    //------------------------------------------------------------------
    //  Parcours à effectuer:
    //  On appelle d'ici les fonctions  de mouvements en indiquant
    //  en paramètre le nombre de pas à effectuer.
    //  Lorsqu'une maneuvre rend la main, le flux revient ici et
    //  On peut en apeller une nouvelle.
    //  On peut insérer une tempo grace aux commande DelayMs(char) et
    //  DelayUs(char) respectivement en ms et en µs.
    //
    //  ATTENTION à ne pas appeller une maneuvre avec un argument de pas
    //  plus de 255 car l'argument passé est un unsigned char.
    //  Si une maneuvre nescéssite plus de pas, appelez la plusieurs
    //  et en utilisant des boucles.
    //------------------------------------------------------------------

    RB2=1;              //éteindre DEL

    sleep();            //mise en veille du PIC qui se réveille lors d'une
                        //solicitation sur RB4 (BP dcy)
}