summaryrefslogtreecommitdiff
path: root/n/es/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'n/es/src/main.c')
-rw-r--r--n/es/src/main.c292
1 files changed, 215 insertions, 77 deletions
diff --git a/n/es/src/main.c b/n/es/src/main.c
index 2c31122..9f3ecb5 100644
--- a/n/es/src/main.c
+++ b/n/es/src/main.c
@@ -33,11 +33,13 @@
/* +AutoDec */
/* -AutoDec */
+void proto_callback (uint8_t cmd, uint8_t size,uint8_t* args);
+
uint8_t etat = 1; // etat de fonctionnement du module
uint8_t sens = 1; // sens du scan
uint8_t continu = 0; // demande fait d'un envoi en continu sur le RS232
uint8_t envoie = 0; // demande fait par I2C d'un envoi
-uint8_t clk = 0; // clock de la machine d'état.
+volatile uint8_t clk = 0; // clock de la machine d'état.
char buffer_serie ; // buffer RS232
const uint16_t prescaler = 8;// prescaler
uint16_t tableau_longueur[25];
@@ -45,96 +47,232 @@ uint16_t SEUIL = 0x0100;
uint8_t mesure = 0;
uint8_t ascenseur = 0;
uint8_t pont;
-uint8_t vitesse_ascenseur=0;
+uint8_t vitesse_ascenseur_m = 0;
+uint8_t vitesse_ascenseur_d = 0;
+uint8_t vitesse_ascenseur = 0;
uint8_t commande = 0;
+uint8_t vitesse_montee_max = 0;
+uint8_t vitesse_descente_max = 0;
+uint8_t accel_montee = 0;
+uint8_t accel_descente = 0;
+uint8_t decel_montee = 0;
+uint8_t decel_descente = 0;
int main (void)
{
- uint8_t temp_sens = 1;
- uint8_t compteur = 0;
- uint16_t tableau_sharp[3];
-
- /// intialisation
- DDRD = 0x80;
- rs232_init ();
- rs232_putc('R');
- twi_init (0x02);
- tourelle_init (prescaler);
- adc_init ();
- ascenseur = 1;
- pont = 1;
-
- sei (); // on met les interruptions
-
- rs232_putc('I'); // fin de l'initialisation
-
- /// programme principal
-
- while(1) // boucle principale
- {
- if(clk == 1)
+ uint8_t temp_sens = 1;
+ uint8_t compteur = 0;
+ uint16_t tableau_sharp[3];
+
+ /// intialisation
+ DDRD = 0xC0;
+ DDRA = 0x00;
+ DDRB = 0x11;
+ DDRC = 0x00;
+
+ rs232_init ();
+ proto_send0('z');
+ twi_init (0x02);
+ tourelle_init (prescaler);
+ ascenseur_init ();
+ // adc_init ();
+ ascenseur = 1;
+ pont = 0;
+ mesure = 0;
+ etat = 1;
+ clk = 1;
+ commande = 10;
+
+
+ sei (); // on met les interruptions
+
+ rs232_putc('I'); // fin de l'initialisation
+
+ /// programme principal
+
+ while(1) // boucle principale
+ {
+ if(clk == 1 ) // rajouter etat
+ {
+ while (rs232_poll ())
+ proto_accept (rs232_getc ());
+ clk = 0;
+ TCNT1 = 350; //(65535L - ((20L*14745600L)/(1024L*1000L))); // LE PASSER EN COMPARATEUR.
+
+ if(temp_sens != sens)
+ {
+ temp_sens = sens; // permet de savoir quand on a fini un tour
+ }
+ TIMSK |= 0x04;
+ if(mesure == 1)
+ {
+ tableau_longueur[2]=tableau_longueur[1];
+ tableau_longueur[1]=tableau_longueur[0];
+ tableau_longueur[0]=mesurer();
+ if(tableau_longueur[0] > SEUIL && tableau_longueur[1] > SEUIL && tableau_longueur[2] > SEUIL)
+ {
+ proto_send1w ('S',tableau_longueur[0]);
+ cli ();
+ }
+ // else
+ // proto_send1w ('P','0');
+ TournerTourelle();
+ }
+ if(pont == 1)
+ {
+ for(compteur=0;compteur<3;compteur++)
+ {
+ adc_start (compteur); // pin selectionnee
+ while(!adc_checkf()){}
+ tableau_sharp[compteur]=adc_read();
+
+ twi_update ((uint8_t *) tableau_sharp,6); // renoie des valeurs sur le I2C
+ }
+ }
+ if(ascenseur == 1)
+ {
+
+ switch(commande)
{
- clk = 0;
- TCNT1 = 350; //(65535L - ((20L*14745600L)/(1024L*1000L))); // LE PASSER EN COMPARATEUR.
-
- if(temp_sens != sens)
+ case MONTE:
+
+ if(!capteur_haut())
{
- temp_sens = sens; // permet de savoir quand on a fini un tour
+ if(vitesse_ascenseur > 0xF0)
+ {
+ asc_stable(vitesse_ascenseur);
+ }
+ else
+ {
+ vitesse_ascenseur += accel_montee;
+ asc_haut(vitesse_ascenseur);
+ }
}
- TIMSK |= 0x04;
- if(mesure == 1)
+ else
{
- tableau_longueur[2]=tableau_longueur[1];
- tableau_longueur[1]=tableau_longueur[0];
- tableau_longueur[0]=mesurer();
- if(tableau_longueur[0] > SEUIL && tableau_longueur[1] > SEUIL && tableau_longueur[2] > SEUIL)
- {
- proto_send1w ('S',tableau_longueur[0]);
- cli ();
- }
-// else
-// proto_send1w ('P','0');
- TournerTourelle();
+ if(vitesse_ascenseur > vitesse_montee_max) vitesse_ascenseur -= decel_montee;
+ asc_haut(vitesse_ascenseur);
+ proto_send1b('O',vitesse_ascenseur);
}
- if(pont == 1)
+ break;
+ case DESCEND:
+
+ if(!capteur_bas())
{
- for(compteur=0;compteur<3;compteur++)
- {
- adc_start (compteur); // pin selectionnee
- while(!adc_checkf()){}
- tableau_sharp[compteur]=adc_read();
-
- twi_update (tableau_sharp,6); // renoie des valeurs sur le I2C
- }
+
+
+ if(vitesse_ascenseur > 0xF0)
+ {
+ asc_stable(vitesse_ascenseur);
+ }
+ else
+ {
+ vitesse_ascenseur += decel_descente;
+ asc_bas(vitesse_ascenseur);
+ }
}
- if(ascenseur == 1)
+
+ else
{
- if(commande == MONTE)
- {
- if(capteur_haut())
- {
- asc_haut(vitesse_ascenseur - 10);
- }
- else asc_haut(vitesse_ascenseur + 2);
- }
- else
- {
- if(commande == DESCEND)
- {
- if(capteur_bas())
- {
- asc_bas(vitesse_ascenseur - 10);
- }
-
- else asc_bas(vitesse_ascenseur + 2);
-
- }
- else asc_stable(vitesse_ascenseur);
-
- }
+ if(vitesse_ascenseur > vitesse_descente_max) vitesse_ascenseur -= accel_descente;
+ asc_bas(vitesse_ascenseur);
+ proto_send1b('O',vitesse_ascenseur);
}
+
+ break;
+ case STABLE :
+ asc_stable(vitesse_ascenseur);
+ proto_send1b('O',vitesse_ascenseur);
+
+ break;
+ case MONTE_M :
+ asc_haut(vitesse_ascenseur);
+ proto_send1b('O',vitesse_ascenseur);
+ break;
+ case DESCEND_M :
+ asc_bas(vitesse_ascenseur);
+ proto_send1b('O',vitesse_ascenseur);
+ break;
}
-
+
+ }
}
+
+ }
+ return 0;
+}
+
+
+void proto_callback (uint8_t cmd, uint8_t size,uint8_t* args)
+{
+#define c(cmd, size) (cmd << 8 | size)
+ switch (c (cmd, size))
+ {
+ case c ('z', 0): reset (); break;
+
+ /* Commands. */
+
+ case c ('c', 0):{ // continu
+ etat = 1;
+ continu = 1;
+ }break;
+
+ case c ('u',0):{ // unique
+ proto_send1w ('V',0);
+ etat = 1;
+ }break;
+
+ case c ('S',0): { // ordre de Stopper
+ etat = 0;
+ }break;
+
+ case c ('m',0): { // ordre de monter l'ascenseur
+ etat = 1;
+ ascenseur = 1;
+ vitesse_ascenseur = vitesse_ascenseur_m;
+ commande = MONTE;
+
+ }break;
+
+ case c ('d',0): { // ordre de descendre l'ascenseur
+ etat = 1;
+ ascenseur = 1;
+ vitesse_ascenseur = vitesse_ascenseur_d;
+ commande = DESCEND;
+ }break;
+
+ case c ('s',0): { // ordre de stabiliser l'ascenseur
+ etat = 1;
+ ascenseur = 1;
+ commande = STABLE;
+ }break;
+ case c ('M',1):{ // unique
+ vitesse_ascenseur = args[0];
+ ascenseur = 1;
+ commande = MONTE_M;
+ etat = 1;
+ }break;
+ case c ('D',1):{ // unique
+ vitesse_ascenseur = args[0];
+ ascenseur = 1;
+ commande = DESCEND_M;
+ etat = 1;
+ }break;
+
+ case c ('P',6):{ // unique
+ ascenseur = 1;
+ vitesse_ascenseur_m = args[0];
+ vitesse_ascenseur_d = args[1];
+ vitesse_montee_max = args[2];
+ vitesse_descente_max = args[3];
+ accel_montee = args[4];
+ accel_descente = args[5];
+
+ }break;
+
+ default:
+ proto_send0 ('?');
+ }
+ proto_send (cmd, size, args);
}