summaryrefslogtreecommitdiff
path: root/n/accel/accel.c
diff options
context:
space:
mode:
Diffstat (limited to 'n/accel/accel.c')
-rw-r--r--n/accel/accel.c152
1 files changed, 99 insertions, 53 deletions
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 <avr/io.h>
-#include <inttypes.h>
-#include <avr/signal.h>
-#include <avr/interrupt.h>
-#include <string.h>
-#include <n/avr/rs232/rs232.h>
-#include <n/avr/proto/proto.h>
-#include <n/avr/utils/utils.h>
-
-#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)
{