|
|
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)
}
|