From 4f4b8796d95cdd5e3ba406fe6a08123d17c2a0f5 Mon Sep 17 00:00:00 2001 From: dalmais Date: Sat, 23 Apr 2005 21:17:41 +0000 Subject: fonction tourelle + pont + ascenseur(en cours mais operationnel) --- n/es/src/ascenseur.c | 55 ++++++---- n/es/src/ascenseur.h | 11 +- n/es/src/main.c | 292 +++++++++++++++++++++++++++++++++++++-------------- n/es/src/tourelle.c | 48 ++------- n/es/src/tourelle.h | 1 - 5 files changed, 265 insertions(+), 142 deletions(-) (limited to 'n') diff --git a/n/es/src/ascenseur.c b/n/es/src/ascenseur.c index 24538be..f540474 100644 --- a/n/es/src/ascenseur.c +++ b/n/es/src/ascenseur.c @@ -21,58 +21,69 @@ * Web: http://perso.efrei.fr/~dalmais * Email: * }}} */ - #include "ascenseur.h" +#include "avr/io.h" + + +extern uint8_t vitesse_ascenseur_m; +extern uint8_t vitesse_ascenseur_d; +extern uint8_t vitesse_montee_max; +extern uint8_t vitesse_descente_max; +extern uint8_t accel_montee; +extern uint8_t accel_descente; +#define TC_STOP 0x00 +#define TC_GO 0x1f /* mode CTC | OC2 | prescaler = 128. */ /* +AutoDec */ /* -AutoDec */ -extern uint8_t clk ; // clock de la machine d'état. -uint8_t sens_ascenseur = 0; - void ascenseur_init() { - sens_ascenseur = 0; - TCCR2 = 0x0C ; // mode CTC | pas de OC2 | prescaler = 128 - - + TCCR2 = TC_STOP; + vitesse_ascenseur_m = 0xF0; + vitesse_ascenseur_d = 0xF0; + vitesse_montee_max = 0x20; + vitesse_descente_max = 0x32; + accel_montee = 3; + accel_descente = 3; } void asc_haut(uint8_t valeur) { - TCNT2 = valeur; - sens_ascenseur = MONTE; - + TCCR2 = TC_GO; + OCR2 = valeur; + PORTB |= _BV(0); // sens + PORTD |= _BV(6); // on enable } void asc_bas(uint8_t valeur) { - TCNT2 = valeur; - sens_ascenseur = DESCEND; - + TCCR2 = TC_GO; + OCR2 = valeur; + PORTB &= ~_BV(0); + PORTD |= _BV(6); } void asc_stable(uint8_t valeur) { - TCNT2 = valeur; - sens_ascenseur = MONTE; - + TCCR2 = TC_STOP; + PORTB |= _BV(0); + PORTD |= _BV(6); } - uint8_t capteur_bas() { -return (PORTA & _BV(CAPTEUR_BAS)) ; + return PINA & _BV(CAPTEUR_BAS); } uint8_t capteur_haut() { -return (PORTA & _BV(CAPTEUR_HAUT)) ; + return PINA & _BV(CAPTEUR_HAUT); } - uint8_t capteur_milieu() { -return (PORTA & _BV(CAPTEUR_MILIEU)) ; + return PINA & _BV(CAPTEUR_MILIEU); } + diff --git a/n/es/src/ascenseur.h b/n/es/src/ascenseur.h index 36957d7..ce809f5 100644 --- a/n/es/src/ascenseur.h +++ b/n/es/src/ascenseur.h @@ -25,16 +25,17 @@ #ifndef ascenseur_h #define ascenseur_h -#define CAPTEUR_BAS 0x01 -#define CAPTEUR_MILIEU 0x02 -#define CAPTEUR_HAUT 0x03 +#define CAPTEUR_BAS 0 +#define CAPTEUR_MILIEU 1 +#define CAPTEUR_HAUT 2 #define MONTE 0 #define DESCEND 1 +#define STABLE 2 +#define MONTE_M 3 +#define DESCEND_M 4 #include -#include "avr/io.h" -//#include "" void ascenseur_init(); void asc_haut(uint8_t valeur); 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); } diff --git a/n/es/src/tourelle.c b/n/es/src/tourelle.c index e2d4ba9..d677c6f 100644 --- a/n/es/src/tourelle.c +++ b/n/es/src/tourelle.c @@ -24,6 +24,9 @@ #include "tourelle.h" #include "avr/signal.h" +#define port_tourelle PORTB +#define pin_tourelle 4 + const uint8_t delayMax = 100; const uint8_t delayMin = 200; const uint8_t pin_sharp = 3 ; @@ -68,24 +71,23 @@ void tourelle_init (uint16_t prescaler) SFIOR |= 0x01; // prescaler autorisé rs232_putc('T'); - crenaux(delay,PORTC,7); // on met le capteur à 0° + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° delay_ms(20L); - crenaux(delay,PORTC,7); + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° delay_ms(20L); - crenaux(delay,PORTC,7); // on met le capteur à 0° + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° delay_ms(20L); - DDRD = 0x80; - crenaux(delay,PORTD,7); + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° delay_ms(20L); - crenaux(delay,PORTD,7); + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° rs232_putc('C'); - crenaux(delay,PORTC,7); // on met le capteur à 0° + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° delay_ms(20L); - crenaux(delay,PORTC,7); + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° delay_ms(20L); pont = 1; @@ -136,34 +138,6 @@ void crenaux(uint8_t temps, uint8_t port, uint8_t pin) PORTD &= ~_BV (7); // on remet l'impulsion à 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; - envoie = 1; -// if(c(0,1)) sendValeur(); /// METTRE LA BONNE FONCTION - }break; - - case c ('u',0):{ // unique - envoie = 0; -// sendValeur(); /// METTRE LA BONNE FONCTION - etat = 0; - }break; - - case c ('s',0): { // stop - etat = 0; - envoie = 0; - }break; - } -} - void TournerTourelle(void) { @@ -183,7 +157,7 @@ void TournerTourelle(void) } delay += 2 * sens; - crenaux(delay,PORTC,0x07); + crenaux(delay,port_tourelle,pin_tourelle); // on met le capteur à 0° } int16_t mesurer(void) diff --git a/n/es/src/tourelle.h b/n/es/src/tourelle.h index 1e6ffca..e4d1de9 100644 --- a/n/es/src/tourelle.h +++ b/n/es/src/tourelle.h @@ -32,7 +32,6 @@ void tourelle_init (uint16_t prescaler); void crenaux(uint8_t temps, uint8_t port, uint8_t pin); -void proto_callback (uint8_t cmd, uint8_t size, uint8_t *args); void TournerTourelle(void); int16_t mesurer(void); void Timer_tourelle(void); -- cgit v1.2.3