From f4316ec9077a9271f6147f094c3a85b52168e77d Mon Sep 17 00:00:00 2001 From: burg Date: Mon, 13 Dec 2004 01:00:55 +0000 Subject: Profonde modification, la plus part des fichiers a été réecrite. *Pb à la calibration *Pb sur le calule de l'accéleration => immoble = acceleration constante --- n/accel/accel.c | 152 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 53 deletions(-) (limited to 'n/accel/accel.c') diff --git a/n/accel/accel.c b/n/accel/accel.c index ae0f022..875ed82 100644 --- a/n/accel/accel.c +++ b/n/accel/accel.c @@ -28,18 +28,7 @@ * */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "calcul.h" -#include "avrconfig.h" +#include "accel.h" //#define DEBUG @@ -53,9 +42,27 @@ * des données * */ -//enum T_etat {strt_at_Ta, rd_at_Tb, rd_at_Tc, rd_at_Td, calcul }; + + +volatile enum T_etat etat; + volatile uint16_t Tb,Tc,Td; -uint16_t Tx,Ty,T2; +volatile uint8_t calcul_rdy; +/* + * calcul_rdy = 0 Un calcul a été fait, on peut écraser Tx et Ty + * calcul_rdy = 1 Le calcul n'est pas encore terminer interdiction + * d'écraser Tx et Ty + */ +volatile uint8_t mode; +/* mode = 0 Mode normal; + * Mode = 1 Mode Mesure de T2 sur la voix x + * mode = 2 Mode Mesure de T2 sur la voix y + */ + +volatile uint16_t Tx,Ty,T2; +volatile uint16_t T2x=0; +volatile uint16_t T2y=0; + int16_t Gx,Gy; uint16_t Timer1; int16_t Vx,Vy; @@ -69,48 +76,81 @@ uint8_t command; SIGNAL(SIG_INPUT_CAPTURE1) { - //code de l'interruption + //code de l'interruption switch (etat) { case strt_at_Ta : debug_putc('A'); TCNT1 = 0; // remise de TCNT1 (counter 16bits) - TCCR1B &= ~_BV(ICES1); // trigge sur le front descendant - //TIMSK |= 0x20; //autorise les interruptions Input Capture - etat = rd_at_Tb; + if (mode !=0) + { + //va vers le mode config + if(mode ==1 ) + { + etat = rd_at_T2_x; + } + else + { + etat = rd_at_T2_y; + } + } + else + { + //v vers le mode normal + etat = rd_at_Tb; + TCCR1B &= ~_BV(ICES1); // trigge sur le front descendant + } break; case rd_at_Tb : debug_putc('B'); Tb = ICR1; // sauvegarde du registre Input Capture etat = rd_at_Tc; - //TIMSK &= ~0x20; //désactive les interruptions Input Capture ACSR |= 0x04; //change d'entrée : analogue comparator TCCR1B |= _BV(ICES1); //trigge sur le front montant - //TIMSK |= 0x20; // Réactive les interruptions Input Capture break; case rd_at_Tc : debug_putc('C'); Tc = ICR1; // sauvegarde du registre Input Capture - //TIMSK &= ~0x20; //désactive les interruptions Input Capture TCCR1B &= ~_BV(ICES1); // trigge sur le front descendant - //TIMSK |= 0x20; // Réactive les interruptions Input Capture etat = rd_at_Td; break; case rd_at_Td : debug_putc('D'); Td = ICR1; // sauvegarde du registre Input Capture - etat = calcul; - //TIMSK &= ~0x20; //désactive les interruptions Input Capture + etat = record; ACSR &= ~0x04; //change d'entrée : IPC TCCR1B |= _BV(ICES1); //trigge sur le front montant - //TIMSK |= 0x20; // Réactive les interruptions Input Capture break; - case calcul : - // calcul trop long // - proto_send1('E',6); + case record : + if (calcul_rdy == 0 ) + { + Tx = Tb; // Calcul des Ton + Ty = Td - Tc; + // Todo T2 ne doit pas être calculer tout le temps + //T2 = (Td + Tc - Tb) /2; + calcul_rdy = 1; // Autorise le calcul + } + else + proto_send1('E',6);// calcul trop long // + etat = strt_at_Ta; + break; + case rd_at_T2_x : + T2x = ICR1; // sauvegard du registre input capture + etat = record_T2_x; + break; + case record_T2_x: + etat = strt_at_Ta; + break; + case rd_at_T2_y : + T2y = ICR1; // sauvegard du registre input capture + ACSR &= ~0x04; //change d'entrée : IPC + etat = record_T2_y; + break; + case record_T2_y: + etat = strt_at_Ta; break; default :proto_send1('E',3); - break; // Ce cas ne doit pas arriver + break; // Ce cas ne doit pas arriver } } @@ -121,6 +161,8 @@ SIGNAL(SIG_OVERFLOW1) void test_callback (uint8_t c, uint8_t argc, proto_arg_t argv[]) +// fonction de gestion des communications +// {{{ { //proto_send (c, argc, argv); if (argc == 0) @@ -134,7 +176,9 @@ test_callback (uint8_t c, uint8_t argc, proto_arg_t argv[]) break; case 'y' : proto_send2('Y',Ty >> 8, Tx); break; - case 'r' : proto_send2('R',T2 >> 8, T2); + case 'r' : proto_send2('z',T2x >> 8,T2x); + proto_send2('e',T2y >> 8, T2y); + proto_send2('R',T2 >> 8, T2); break; case 't' : proto_send2('T',Timer1 >> 8, Timer1); break; @@ -162,6 +206,7 @@ test_callback (uint8_t c, uint8_t argc, proto_arg_t argv[]) else proto_send1('E',5); //Trop d'argument } } +//}}} int main (void) @@ -176,33 +221,34 @@ main (void) TCCR1B = _BV(ICES1) | _BV(CS12); // Input Capture Interrupt enable & Timer 1 overflow TIMSK = _BV(TICIE1) | _BV(TOIE1); + TCCR1B |= _BV(ICES1); //trigge sur le front montant + etat = strt_at_Ta; sei (); //Boucle while(1) { - if ( rs232_poll() ) - { - /* polling sur la reception serie - * */ - proto_accept(rs232_getc()); - } - // calcul des Tons - if (etat == calcul) - { - Tx = Tb; // Calcul des Ton - Ty = Td - Tc; - // Todo T2 ne doit pas être calculer tout le temps - T2 = (Td + Tc - Tb) /2; - // remise de TCNT1 pour mesurer le temps - TCNT1 = 0; - Gx = calculGb(Tx,T2,T1x_cal); - Gy = calculGb(Ty,T2,T1y_cal); - Vx +=Gx; - Vy +=Gy; - Timer1 = TCNT1; - //remise dans l'état de capture - //Todo : remettre dans cet état plutôt - etat = strt_at_Ta; + //proto_send0('b'); + if ( rs232_poll() ) + { + /* polling sur la reception serie + * */ + proto_accept(rs232_getc()); + } + // calcul si l'on peut + if (calcul_rdy == 1) + { + //proto_send0('c'); + // remise de TCNT1 pour mesurer le temps + TCNT1 = 0; + Gx = calculG(Tx,T1x_cal); + Gy = calculG(Ty,T1y_cal); + + // Tx et Ty ont été utilisé, on peut les écrasés + calcul_rdy = 0 ; + + Vx +=Gx; + Vy +=Gy; + Timer1 = TCNT1; if (command !=0) { -- cgit v1.2.3