summaryrefslogtreecommitdiff
path: root/n
diff options
context:
space:
mode:
authordalmais2005-04-23 21:17:41 +0000
committerdalmais2005-04-23 21:17:41 +0000
commit4f4b8796d95cdd5e3ba406fe6a08123d17c2a0f5 (patch)
treebb0db1b5067a5db06476c32c58123f2d44025bec /n
parent67cbbd35248082ea0dd857126072e37c396d4ddb (diff)
fonction tourelle + pont + ascenseur(en cours mais operationnel)
Diffstat (limited to 'n')
-rw-r--r--n/es/src/ascenseur.c55
-rw-r--r--n/es/src/ascenseur.h11
-rw-r--r--n/es/src/main.c292
-rw-r--r--n/es/src/tourelle.c48
-rw-r--r--n/es/src/tourelle.h1
5 files changed, 265 insertions, 142 deletions
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: <dalmais@efrei.fr>
* }}} */
-
#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 <stdint.h>
-#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);