Statistics
| Revision:

root / branch / sotty / Emb_App / programme_principal_etud.c @ 252

History | View | Annotate | Download (10.1 KB)

1
/***********************************************************************/
2
/*                                                                     */
3
/*  FILE        :test_compil.c                                         */
4
/*  DATE        :Fri, Sep 29, 2006                                     */
5
/*  DESCRIPTION :main program file.                                    */
6
/*  CPU GROUP   :87                                                    */
7
/*                                                                     */
8
/*  This file is generated by Renesas Project Generator (Ver.4.5).     */
9
/*   m308                                                                                                                           */
10
/*   nc308lib                                                                                                                   */
11
/*   c308mr                                                                                                                           */
12
/*   nc382lib                                                                                                                   */
13
/*                                                                     */
14
/***********************************************************************/
15
#include "sfr32c87.h"
16
#include <stdio.h>
17
#include <stdlib.h>
18
#include <itron.h>
19
#include <kernel.h>
20
#include "kernel_id.h"
21
#include "lcd.h"
22
#include "clavier.h"
23
#include "periph.h"
24
#include "uart0.h"
25
#include "can.h"
26
#include "carte_io.h"
27
#include "carte_m32.h"
28
#include <math.h>
29

    
30
// Potentiometre: lire les registres ad00 et ad01, les valeurs sont sur 10 bits.
31

    
32
// Clavier: vrcv_dtq(QdmTouche,&code_touche) pour lire la derniere touche appuyee sur le clavier.
33
//                         la variable code_touche doit etre du type short.
34

    
35
// Bouton poussoir: Bp_G, Bp_M, Bp_D permettent de lire l'etat des boutons de la carte I/O
36

    
37
// Leds: LED_R=1 ou LED_R=0 Pour allumer ou eteindre les leds (LED_R, LED_J, LED_V).
38

    
39
// Pour communiquer avec le simulateur utiliser une variable de type CanFrame,
40
// Definir les differents champs en utilisant la structure (S)eparee (comm.data)
41
// Envoyer le message complet en utilisant l'union (comm.msg)
42

    
43
// Exemple:
44
//                 CanFrame comm;
45
//                        comm.data.id='T'; comm.data.rtr=0; comm.data.val=-100;
46
//                        snd_dtq (CanTx,comm.msg);
47

    
48
// Pour interroger un peripherique et recuperer les donnees brutes renvoyees simulateur:
49
//                CanFrame demande;
50
//                CanFrame reponse;
51
//
52
//                        demande.data.id='R'; demande.data.rtr=1;
53
//                        snd_dtq (CanTx,demande.msg); // Interrogation du peripherique
54
//                         rcv_dtq (CanRx,&reponse.msg); // Attente de la reponse
55
//                         reponse.data.val contient la valeur de retour du simulateur.
56
// ATTENTION: Ne pas utiliser rcv_dtq(CanRx... si la tache ID_periph_rx est active
57

    
58
// Lors de l'utilisation de la tache de reception et distribution des messages ID_periph_rx
59
// Demarrer cette tache : sta_tsk(ID_periph_rx);
60
// Pour lire la valeur d'un peripherique:
61
// Il faut envoyer une demande de lecture:
62
//         CanFrame comm;
63
//                 comm.data.id='R'; comm.data.rtr=1;
64
//                 snd_dtq (CanTx,comm.msg);
65
//
66
// Des l'arrivee de la reponse du simulateur, les variables suivantes sont mises a jour:
67
// periph[ADDR('R')].val : contient la derniere valeur renvoyee par le simulateur.
68
//
69
// Pour verifier si une nouvelle valeur a ete recue utiliser:
70
// periph[ADDR('R')].maj (incremente a chaque reception).
71

    
72
// Pour qu'un evenement soit declenche lors de la reception d'une donnee pour un peripherique:
73
// periph[ADDR('R')].ev=0x01;
74
// Pour se mettre en attente de l'evenement: wai_flg (ev_periph,0x01,TWF_ORW,&flag); // Declarer la variable flag comme : FLGPTN flag
75
// Attention l'evenement n'est pas efface apres reception, il faut donc utiliser clr_flg(ev_periph,~0x01); par example
76

    
77
// Les evenements:
78
// Si le simulateur envoi un evenement sur 16 bits il est recu grace a:
79
// par exemple:  wai_flg(event,(FLGPTN) 0x0007,TWF_ORW,&flag); // Declarer la variable flag comme : FLGPTN flag
80
// Attention l'evenement n'est pas efface apres reception, il faut donc utiliser clr_flg(event,~flag); par example
81
//Bit   Information associee            Remarque
82
//0     Capteur Vert,                   remis a zero lors de la lecture du peripherique 'C'
83
//1     Capteur Jaune,                  remis a zero lors de la lecture du peripherique 'C'
84
//2     Capteur Rouge,                  remis a zero lors de la lecture du peripherique 'C'
85
//3     Capteur Bleu,                   remis a zero lors de la lecture du peripherique 'C'
86
//4     Capteur Cyan,                   remis a zero lors de la lecture du peripherique 'C'
87
//5
88
//6     Collision avec le sol,          remise a zero au changement de piste.
89
//7     Fin de course (capteur vert),   remis a zero lors de la lecture du peripherique 'C'
90
//8     La piste a change ,             remis a zero lors de la lecture du peripherique 'M'
91
//9     Le mode de course a change ,    remis a zero lors de la lecture du peripherique 'M'
92
//10
93
//11    Le vehicule a termine un tour,   remis a zero au changement du mode de course.
94
//12    Sortie de la piste,
95
//13    Teleportation a ete utilisee,   remis a zero au changement de piste ou du mode de course.
96
//14    Faux depart                     remise a zero au changement du mode de course.
97
//15
98

    
99

    
100
// Peripheriques disponibles:
101
//'V'/86/0x56 : Commande en vitesse des roues motrices du vehicule (en radian /secondes).
102
//'D'/68/0x44 : Commande de l'angle des roues directrices (en 1/10 de degre).
103
//'T'/84/0x54 : Commande en vitesse de la tourelle portant le telemetre (en 1/10 de degre/secondes).
104
//'R'/82/0x52 : Lecture de l'angle effectif de la tourelle portant le telemetre (en 1/10 de degre).
105
//'U'/85/0x55 : Distance mesuree par le telemetre (1/100 de metre)
106
//'N'/78/0x4E : Numero de la voiture (en fonction de l'ordre de connexion)
107
//'E'/69/0x45 : Lecture des evenements,
108
//'H'/72/0x48 : Donne le temps de course actuel
109
//'S'/83/0x53 : Temps du tour precedent
110
//'M'/77/0x7D : Mode de course :
111
//  Bit 15 : Etat feu tricolore ( 1 -> Vert, 0 -> Orange ou Rouge),
112
//  Bits 14-8 : 1 Attente, 2 course, 3 essais libres)
113
//  Bits 7-0 : numero de la piste
114
//'C'/67/0x43 : Informations sur le dernier capteur touche :
115
//  8 bits de poids faible : numero du capteur
116
//  8 bits de poids fort : couleur ('C','R','J','B' ou 'V')
117
//'J'/74/0x4A : Proposition d'un code de d?v?rouillage.
118
//'j'/106/06A : R?cup?ration du r?sultat de dernier code envoy?. 0x77 si aucun code n'a ?t? soumis. <0 si la r?ponse n'est pas
119
//                                disponible. 0xab avec a-> nombre de couleurs bien plac?es et b -> couleurs pr?sentes mais mal plac?es.
120
//'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
121
//                                correspondant au nom du v?hicule si le nom se termine par '*'
122

    
123
// Definition des codes commandes et requetes
124
#define VITESSE_ROUES 'V'
125
#define ANGLE_ROUES 'D'
126
#define VITESSE_TOURELLE 'T'
127
#define ANGLE_TOURELLE 'R'
128
#define DISTANCE_TELEMETRE 'U'
129
#define MODE_COURSE 'M'
130
#define INFO_CAPTEUR 'C'
131

    
132

    
133
void init(void);
134
void rotation_tourelle(short angle);
135
int position_tourelle(void);
136
void asserv_tourelle(VP_INT stacd);
137
short distance_telemetre(void);
138
void vitesse_roue(char vitesse);
139
void angle_roue(short angle);
140
void asserv_roue(VP_INT stacd);
141
int send_requete(unsigned char id_periph);
142
void send_commande(unsigned char id_periph, short val);
143

    
144

    
145
short distance_mur = 0;
146
short angle_tourelle = 450;
147

    
148
short vit_roue = 15;
149
short K_roue = 1;
150
short ang_roue = 0;
151
short capteur = 0;
152

    
153
char num_piste;
154

    
155

    
156
void main()
157
{
158
        int k;
159
        
160
        init();
161

    
162
        //Obtention de la couleur du feu
163
        while ( (send_requete('M')>>15)==0 ){ //Attente que le feu soit vert
164
                dly_tsk(50);
165
        }
166

    
167
        sta_tsk(ID_asserv_roue);
168
        for(k=1 ; k<30 ; k++) {
169
                vit_roue = k;
170
                dly_tsk(100);
171
        }
172

    
173
        //Obtention de la piste
174
    num_piste = send_requete('M') & 0x00FF;
175

    
176
    while(1)
177
    {
178
                LED_J=1;
179
                dly_tsk(100);
180
                LED_J=0;
181
                dly_tsk(100);
182
    }
183
}
184

    
185
void maj_variables(void){
186
        //Angle des roues 
187
        distance_mur = distance_telemetre()*sin(3.1415*angle_tourelle/1800.0);
188
        if(distance_mur > 1200) {        //Trou dans le mur
189
                ang_roue = 0;
190
        }
191
        else {
192
                ang_roue = K_roue*(distance_mur-500);
193
        }
194
        capteur = send_requete(INFO_CAPTEUR);
195
        if(capteur == 0x6301){
196
                ang_roue = 0;        
197
                vit_roue = 50;
198
        }
199
        
200
}
201

    
202
void asserv_roue(VP_INT stacd){
203
//Maintient de la voiture au centre de la piste
204
        while(1){
205
                maj_variables();
206
                
207
                angle_roue(ang_roue);
208
                vitesse_roue(vit_roue);
209
                
210
                dly_tsk(50);
211
        }
212
}
213

    
214
void asserv_tourelle(VP_INT stacd){
215
//Maintient de la tourelle orientee a 45 degre
216
        CanFrame comm;
217
        short vitesse_tourelle;
218
        char K = 2;
219

    
220
        while(1){
221
                vitesse_tourelle =        K*(angle_tourelle - position_tourelle());
222
                send_commande(VITESSE_TOURELLE, vitesse_tourelle);
223
                dly_tsk(50);
224
        }
225
}
226

    
227

    
228

    
229

    
230

    
231
void rotation_tourelle(short angle){
232
        send_commande(VITESSE_TOURELLE,angle);
233
}
234

    
235
int position_tourelle(){
236
//Renseigne sur la position de la tourelle (angle en dizieme de degre)
237
        int angle;
238

    
239
        angle = send_requete(ANGLE_TOURELLE);
240
        return angle;
241
}
242

    
243
short distance_telemetre(void){
244
//Renseigne la distance mesuree par le telemetre
245
        short distance;
246

    
247
        distance = send_requete(DISTANCE_TELEMETRE);
248
        return distance;
249
}
250

    
251
void vitesse_roue(char vitesse){
252
        send_commande(VITESSE_ROUES,vitesse);
253
}
254

    
255
void angle_roue(short angle){
256
        send_commande(ANGLE_ROUES,angle);
257
}
258

    
259
int send_requete(unsigned char id_periph){
260
        //Envoi la requete correspondant a lidentifiant id_periph
261
        CanFrame req;
262
        int val;
263
        UINT flag;
264

    
265
        req.data.id = id_periph;
266
        req.data.rtr = 1; // envoie d'une requete de lecture
267
        periph[ADDR(id_periph)].ev = 0x01; //declenche un evenement quand mise a jour du peripherique id_periph
268
        //dly_tsk(5);
269
        
270
        snd_dtq(CanTx, req.msg); // attente de la reponse
271
        wai_flg(ev_periph, 0x01, TWF_ANDW, &flag);
272
        periph[ADDR(id_periph)].ev = 0x00;
273
        val = periph[ADDR(id_periph)].val;
274
        return val;
275
}
276

    
277
void send_commande(unsigned char id_periph, short val){
278
        //Envoi la commande correspondant a lidentifiant id_periph avec la valeur val
279
        CanFrame comm;
280

    
281
        comm.data.id = id_periph;
282
        comm.data.rtr = 0;                                 //Ecriture
283
        comm.data.val =        val;
284
        snd_dtq(CanTx, comm.msg);
285
}
286

    
287
void acqui()
288
{
289
        LED_V = !LED_V;
290
}
291

    
292
void init(void) {
293
        //Initialise tous les peripheriques, taches et cycliques handler
294

    
295
        ports_mcu();
296
    lcd_init();
297
        periph_init();
298
        periph_nom("#Camobile*");
299

    
300
    can_init();
301
    clavier_init(1);
302
        capture_init();
303

    
304

    
305
        sta_tsk(ID_periph_rx);
306
        sta_cyc(ID_acqui);
307
        dly_tsk(100);
308
        sta_tsk(ID_asserv_tourelle);
309
        
310
        
311
}