Statistics
| Revision:

root / branch / najib_idzim / tp_info6 / Emb_App / programme_principal_etud.c @ 341

History | View | Annotate | Download (11.7 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 simlateur, 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
void vitesseTourelle(int vitesse);        // commande vitesse tourelle en 10e de degre/sec
124
unsigned short posTourelle();             // lit position de la tourelle en 10e de degre
125
unsigned short disTelem();                // lit distance du telemetre en cm
126
unsigned short disMur();                  // lit distance du vehicule au mur en cm
127
void vitesseVoiture(int vitesse);         // commande vitesse du vehicule en rad/sec
128
void cmdRoue(unsigned short angle);       // commande angle des roues en 10e de degre
129
int lireCapt();
130
char typeCapteur();
131
int lireEvent();
132

    
133
unsigned short distance = 56;
134
int capt = 0;
135
int even = 0;
136
void main()
137
{
138
        ports_mcu();
139
    lcd_init();
140
        periph_init();
141
        periph_nom("#Ferrari");
142
          
143
    can_init();
144
    clavier_init(1);
145
        capture_init();
146

    
147
        sta_cyc(ID_acqui);
148
        sta_tsk(ID_periph_rx); // tache de tri de reponse du simulateur
149
        
150
        
151
        
152
    
153
        sta_tsk(ID_asserv_tour);
154
        dly_tsk(1000);
155
        
156
        sta_tsk(ID_asserv_direction);
157
        dly_tsk(1000);
158
        
159
        vitesseVoiture(40);
160
        
161
    while(1)
162
    {
163
                capt = lireCapt();
164
                even = lireEvent();
165
                dly_tsk(100);
166
                
167
    }
168
}
169

    
170

    
171
void acqui()
172
{
173
        LED_V=!LED_V;
174
}
175

    
176

    
177

    
178

    
179

    
180

    
181
// fonction de tourelle
182
unsigned short posTourelle()
183
{
184
        CanFrame requete;
185
        UINT flag;
186
        
187
        requete.data.id = 'R';
188
        requete.data.rtr = 1;          // Requete de lecture 
189
        periph[ADDR('R')].ev =0x01;
190
        snd_dtq(CanTx, requete.msg);
191
        
192
        wai_flg(ev_periph, 0x01, TWF_ANDW, &flag);
193
        
194
        return  periph[ADDR('R')].val; 
195
}
196

    
197
void vitesseTourelle(int vitesse)
198
{
199
        CanFrame comm;
200
        
201
        comm.data.id = 'T';
202
        comm.data.rtr = 0; //ecriture
203
        comm.data.val = vitesse;
204
        
205
        snd_dtq (CanTx,comm.msg);
206
}
207

    
208

    
209
unsigned short disTelem()
210
{
211
        CanFrame requete;
212
        UINT flag;
213
        
214
        requete.data.id = 'U';
215
        requete.data.rtr = 1;          // Requete de lecture 
216
        periph[ADDR('U')].ev =0x02;
217
        snd_dtq(CanTx, requete.msg);
218
        
219
        wai_flg(ev_periph, 0x02, TWF_ANDW, &flag);
220
        
221
        return  periph[ADDR('U')].val; 
222
}
223

    
224
unsigned short disMur()
225
{
226
        unsigned short longeurTelem, pos, distanceMur; 
227
        
228
        longeurTelem = disTelem();
229
        pos = posTourelle();
230
        
231
        distanceMur = longeurTelem * sin( 3.14*(pos/10)/180.0 );
232
        return distanceMur; 
233
}
234

    
235

    
236

    
237

    
238

    
239

    
240

    
241

    
242

    
243

    
244

    
245
// fonction direction et vitesse vehicule
246

    
247

    
248
void vitesseVoiture(int vitesse)
249
{
250
        CanFrame comm;
251
        
252
        comm.data.id = 'V';
253
        comm.data.rtr = 0; //ecriture
254
        comm.data.val = vitesse;
255
        
256
        snd_dtq (CanTx,comm.msg);
257
}
258

    
259
void cmdRoue(unsigned short angle)
260
{
261
        CanFrame comm;
262
        
263
        comm.data.id = 'D';
264
        comm.data.rtr = 0;     //ecriture
265
        comm.data.val = angle;
266
        
267
        snd_dtq (CanTx,comm.msg);
268
        
269
}
270

    
271

    
272

    
273
// capteur
274

    
275
int lireCapt()
276
{
277
        CanFrame requete;
278
        UINT flag;
279
        
280
        requete.data.id = 'C';
281
        requete.data.rtr = 1;          // Requete de lecture 
282
        periph[ADDR('C')].ev =0x03;
283
        snd_dtq(CanTx, requete.msg);
284
        
285
        wai_flg(ev_periph, 0x03, TWF_ANDW, &flag);
286
        return  periph[ADDR('C')].val;
287
}
288

    
289
char typeCapteur()
290
{
291
        int lsb, msb;
292
        int capteur = lireCapt();
293
        char val;
294
        
295
        lsb &= 0b00001111;
296
        msb &= 0b11110000; 
297
        
298
        if (lsb == 6)
299
        {
300
                if (msb == 'C')
301
                {
302
                        return 'C';
303
                }
304
        }
305
        return 0;
306
}
307

    
308
// les evenements
309

    
310
// Si le simulateur envoi un evenement sur 16 bits il est recu grace a:
311
// par exemple:  wai_flg(event,(FLGPTN) 0x0007,TWF_ORW,&flag); // Declarer la variable flag comme : FLGPTN flag
312
// Attention l'evenement n'est pas efface apres reception, il faut donc utiliser clr_flg(event,~flag); par example
313
//Bit   Information associee            Remarque
314
//0     Capteur Vert,                   remis a zero lors de la lecture du peripherique 'C'
315
//1     Capteur Jaune,                  remis a zero lors de la lecture du peripherique 'C'
316
//2     Capteur Rouge,                  remis a zero lors de la lecture du peripherique 'C'
317
//3     Capteur Bleu,                   remis a zero lors de la lecture du peripherique 'C'
318
//4     Capteur Cyan,                   remis a zero lors de la lecture du peripherique 'C'
319
//5
320
//6     Collision avec le sol,          remise a zero au changement de piste.
321
//7     Fin de course (capteur vert),   remis a zero lors de la lecture du peripherique 'C'
322
//8     La piste a change ,             remis a zero lors de la lecture du peripherique 'M'
323
//9     Le mode de course a change ,    remis a zero lors de la lecture du peripherique 'M'
324
//10
325
//11    Le vehicule a termine un tour,   remis a zero au changement du mode de course.
326
//12    Sortie de la piste,
327
//13    Teleportation a ete utilisee,   remis a zero au changement de piste ou du mode de course.
328
//14    Faux depart                     remise a zero au changement du mode de course.
329

    
330
int lireEvent()
331
{
332
        
333
        FLGPTN flag;
334
        int even;
335
        
336
        wai_flg(event,(FLGPTN) 0x0007,TWF_ORW,&flag);
337
        even = flag;
338
        clr_flg(event,~flag);
339
        
340
        return  even;
341
        
342
}
343

    
344
// les asservissement
345

    
346
void asserv_tour()
347
{
348
        unsigned short posCons,posSortie;
349
        short k,vit;
350
        
351
        k = 3;         //gain definni experimentalement
352
        posCons = 450;
353
        
354
        while(1)
355
        {
356
                posSortie = posTourelle();         
357
                vit = k*( posCons - posSortie);  //correcteur Prop
358
                vitesseTourelle(vit);
359
                
360
                dly_tsk(100);
361
        }
362

    
363
}
364

    
365

    
366
void asserv_direction()
367
{
368
        long distanceCons , distanceMesure, k;
369
        int angle;
370
        
371
        
372
        k = 2.8;                //gain definni experimentalement
373
        distanceCons = 500;//disMur(); //Pos initiale milieu de piste
374
        
375
        while(1)
376
        {
377
                distanceMesure = disMur();
378
                
379
                if ( distanceMesure >= 1000)   // detection des trous
380
                {
381
                        cmdRoue(0);
382
                }
383
                else{
384
                                
385
                        angle = -k*( distanceCons - distanceMesure );  //correcteur P
386
                        cmdRoue(angle);
387
                        
388
                }
389
                dly_tsk(25);
390
        }
391
}