Projet

Général

Profil

« Précédent | Suivant » 

Révision 350

Ajouté par maantourou il y a plus de 6 ans

reprise des fonctions du programme

Voir les différences:

branch/Antourou/Emb_App/SessionM32C_E8a_system.ini
[Target]
M32C E8a SYSTEM=Renesas Communications
[USER_DATA]
RESET=ff0024
RESET=ff0022
branch/Antourou/Emb_App/programme_principal_etud.c
CanFrame requete;
UINT flag;//FLGPTN flag
// short position, distance; // valeur de l'angle renvoy?e par le simulateur
//
// Potentiometre: lire les registres ad00 et ad01, les valeurs sont sur 10 bits.
// Clavier: vrcv_dtq(QdmTouche,&code_touche) pour lire la derniere touche appuyee sur le clavier.
// la variable code_touche doit etre du type short.
// la variable code_touche doit etre du type short.
// Bouton poussoir: Bp_G, Bp_M, Bp_D permettent de lire l'etat des boutons de la carte I/O
......
// Exemple:
// CanFrame comm;
// comm.data.id='T'; comm.data.rtr=0; comm.data.val=-100;
// comm.data.id='T';
// comm.data.rtr=0;
// comm.data.val=-100;
// snd_dtq (CanTx,comm.msg);
// Pour interroger un peripherique et recuperer les donnees brutes renvoyees simulateur:
......
// snd_dtq (CanTx,demande.msg); // Interrogation du peripherique
// rcv_dtq (CanRx,&reponse.msg); // Attente de la reponse
// reponse.data.val contient la valeur de retour du simulateur.
// ATTENTION: Ne pas utiliser rcv_dtq(CanRx... si la tache ID_periph_rx est active
///////////////////////////////////// ATTENTION: Ne pas utiliser rcv_dtq(CanRx... si la tache ID_periph_rx est active////////////////////////////////////////
// Lors de l'utilisation de la tache de reception et distribution des messages ID_periph_rx
// Demarrer cette tache : sta_tsk(ID_periph_rx);
// Pour lire la valeur d'un peripherique:
// Il faut envoyer une demande de lecture:
// CanFrame comm;
// comm.data.id='R'; comm.data.rtr=1;
// comm.data.id='R';
// comm.data.rtr=1;
// snd_dtq (CanTx,comm.msg);
//
// Des l'arrivee de la reponse du simlateur, les variables suivantes sont mises a jour:
......
// disponible. 0xab avec a-> nombre de couleurs bien plac?es et b -> couleurs pr?sentes mais mal plac?es.
//'I'/73/Ox49 : D?finition du nom du v?hicule. Doit d?buter par le caract?re '#' et entraine le chargement de la configuration de piste
// correspondant au nom du v?hicule si le nom se termine par '*'
// NOTE MR LAFFONT !!!!!!
/* passage piste verte :
1: asserv_tourelle dans le while(1) du main
2: mettre asserv_tourelle dans une tache
......
*/
// fonction du programme:
void acquivitessetourelle(int vitesse);// acquisition de la vitesse de la tourelle
unsigned short acquipositiontourelle();// acquisition de la position de la tourelle
unsigned short longeurtel();// acquisition de la distance mesur? par le t?lem?tre
unsigned short mesuredistance();// lecture de la distance des roues au mur
void Avancementvoit(int vitesse);// vitesse de la voiture en r/s
void rouedirectrices(unsigned short angleroue);//angle des roues en 10e de degre
void Asservissment_tourelle();// asservissment de la tourelle
void acquivitesse_Tour(int vit); //vitesse tourelle
unsigned short position_tourelle(); // lire la position de la tourelle
unsigned short acqui_distance_Telem(); // acquisition distance du telemetre en cm
unsigned short distanceaumur(); //acquisition distance des roues au mur en cm
void vitesse_vehicule(int vitesse); // r?glage de la vitesse du vehicule
void roue_directrices(unsigned short angle); // commande des roues (angle des en 10e de degre)
unsigned short alpha;
unsigned short distancemesure;
// commande de la tourelle+acquisition de la distance avec le t?l?m?tre
unsigned short acquipositiontourelle()
{
CanFrame requete ;
UINT flag ;
//acquisition de l'angle mesur?e par la tourelle
requete.data.id='R'; //angle de la tourelle
requete.data.rtr=1; //req de lecture
snd_dtq(CanRx, requete.msg);
//rcv_dtq(CanRx, &repon.msg);
periph[ADDR('R')].ev=0x01;
snd_dtq(CanTx,requete.msg);
wai_flg(ev_periph, 0x01, TWF_ANDW,&flag);
alpha=periph[ADDR('R')].val;
return alpha;
}
void acquivitessetourelle(int vitessetourelle)
{ int vitessetourelle;
//asservissement de la tourelle
comm.data.id='T';
comm.data.rtr=0;// commande d'?criture
comm.data.val=vitessetourelle;
snd_dtq(CanTx,comm.msg);
dly_tsk(100);
unsigned short position_Tourelle() // lire la position de la tourelle
{
CanFrame req;
UINT flag;
req.data.id = 'R';
req.data.rtr = 1; // Requete de lecture
periph[ADDR('R')].ev =0x01;
snd_dtq(CanTx, req.msg);
wai_flg(ev_periph, 0x01, TWF_ANDW, &flag);
return periph[ADDR('R')].val;
}
unsigned short longeurtel()// acquisition de la distance mesur? par le t?lem?tre
{
CanFrame req, longtourn ;
int distancecons,k;
UINT flag;
req.data.id='U';
req.data.rtr=1; //requ de lecture
snd_dtq(CanRx, req.msg);
//rcv_dtq(CanRx, &repon.msg);
periph[ADDR('U')].ev=0x02;
snd_dtq(CanTx,req.msg);
wai_flg(ev_periph, 0x02, TWF_ANDW,&flag);
return periph[ADDR('U')].val;
void acquivitesse_Tour(int vit)//vitesse tourelle
{
CanFrame comm;
comm.data.id = 'T';
comm.data.rtr = 0; //ecriture
comm.data.val = vit;
snd_dtq (CanTx,comm.msg);
}
unsigned short distanceaumur()// lecture de la distance des roues au mur
unsigned short acqui_distance_Telem()// acquisition distance du telemetre en cm pour le calcul de la distance
{
unsigned short distance, longtourn,alpha;
distance=longtourn * sin( 3,14 * (alpha/10) * 180.0 );
return distance;
CanFrame requete;
UINT flag;
requete.data.id = 'U';
requete.data.rtr = 1;// Requete de lecture
periph[ADDR('U')].ev =0x02;
snd_dtq(CanTx, requete.msg);
wai_flg(ev_periph, 0x02, TWF_ANDW, &flag);
return periph[ADDR('U')].val;
}
void rouedirectrices(unsigned short angleroue)//angle des roues en 10e de degre
{
CanFrame comm;
comm.data.id = 'D';//
comm.data.rtr = 0; //ecriture
comm.data.val = angleroue;// ?criture dans angleroue la valeur de l'angle des roues directrices
snd_dtq (CanTx,comm.msg);
void vitesse_vehicule(int vitesse)// r?glage de la vitesse du vehicule
{
CanFrame comm;
comm.data.id = 'V';
comm.data.rtr = 0; //requete d'ecriture
comm.data.val = vitesse;
snd_dtq (CanTx,comm.msg);
}
void Avancementvoit() //(ne pas toucher)// vitesse du v?hicule
unsigned short distanceaumur()//acquisition distance des roues au mur en cm
{
CanFrame requete;
requete.data.id='V';
requete.data.rtr=0;
requete.data.val=30;// valeur de la vitesse
snd_dtq(CanTx,requete.msg);
unsigned short longtelem, pos_tourelle, distanceaumur;
longtelem = acqui_distance_Telem();
pos_tourelle = position_Tourelle();
distanceaumur= longtelem * sin( 3.14*(pos_tourelle/10)/180.0 );
return distanceaumur;
}
void roue_directrices(unsigned short angleroue)// commande des roues (angle des en 10e de degre)
{
CanFrame comm;
comm.data.id = 'D';
comm.data.rtr = 0; //commande d'ecriture
comm.data.val = angleroue;
snd_dtq (CanTx,comm.msg);
}
void Asservissment_tourelle()// asservissment de la tourelle
void regulation_roue()
{
unsigned short pos_tourelle;
int k, vites;
k=3;
while(1)
unsigned short dConsigne , distance, k;
int angleroue;
k = 3; //gain dpour l'asservissment
dConsigne = 500;//position au d?but
while(1)
{
pos_tourelle = acquipositiontourelle();
vites = k*( 450 - pos_tourelle); //correcteur Prop
acquivitessetourelle(vites);
distance = distanceaumur();
if ( distance >= 800) // s'il y'a des trous dans les bords
{
roue_directrices(0);
}
else
{ angleroue = -k*( dConsigne - distance ); //Corection de la direction
roue_directrices(angleroue);
}
dly_tsk(25);
}
}
void asservissment_tour()
{
unsigned short posConsigne,posf;
short k,vit;
k = 3; //gain definni experimentalement
posConsigne = 450;
while(1)
{
posf = position_Tourelle();
vit = k*( posConsigne - posf); //correcteur Prop
acquivitesse_Tour(vit);
dly_tsk(100);
}
}
void regul_roue()
{ //asservissment v?h
int k, distancecons;
int angleroue;
k=3;// gain pour asservissement
distancecons=500;
while(1)
{
distancemesure=distanceaumur();
angleroue=-k*(distancecons-distancemesure);// correction
rouedirectrices(angleroue);
dly_tsk(25);
}
}
}
}
void main ()
// MAIN:
void main()
{
CanFrame requete,reponse,comm;
ports_mcu();
lcd_init();
periph_init();
periph_nom("#TEST001*");
can_init();
clavier_init(1);
capture_init();
ports_mcu();
lcd_init();
periph_init();
periph_nom("#mimi001");// changement du nom du v?hicule
can_init();
clavier_init(1);
capture_init();
sta_cyc(ID_acqui);
sta_tsk(ID_periph_rx);
sta_tsk(ID_asservissment_tour);
dly_tsk(500);
sta_tsk(ID_regulation_roue);
dly_tsk(500);
vitesse_vehicule(45);
sta_cyc(ID_acqui);// //Var g utlis?es par les asservissements
sta_tsk(ID_periph_rx);
Avancementvoit();
sta_tsk(ID_Asservissment_tourelle);
sta_tsk(ID_regul_roue);
while(1)
{
LED_J=1;
LED_J=1;
dly_tsk(100);
LED_J=0;
dly_tsk(100);
}
}
void acqui()
{
LED_V=!LED_V;
......
branch/Antourou/Emb_App/conf_noyau.cfg
exinf = 0x0;
};
task[]{
entry_address = Asservissment_tourelle();
name = ID_Asservissment_tourelle;
entry_address = asservissment_tour();// tache d'asservissment de la tourelle
name = ID_asservissment_tour;
stack_size = 256;
stack_section = stack;
priority = 6;
......
};
task[]{
entry_address = regul_roue();
name = ID_regul_roue;
entry_address = regulation_roue();// assr'vissement de la direction des roues directices
name = ID_regulation_roue;
stack_size = 1024;
stack_section = stack;
priority = 7;

Formats disponibles : Unified diff