Placez ici le co
// remarque: ce programme est prévu pour un compilateur de PIC CCS (www.ccsinfo.com)
#include <16F876.h>
#use delay(clock=4000000)
#fuses HS,NOWDT
#use standard_io(A)
#use standard_io(c)
#fuses XT,NOWDT,NOLVP // Quartz, pas de chien de garde, pas de débuggeur
#define EFCH input(PIN_A0) // affecte à l'entrée RA0 (pin 2) à l'entrée fin de course haut
#define EFCB input(PIN_A1) // affecte à l'entrée RA1 (pin 3) à l'entrée fin de course bas
#define MONT PIN_A2 // affecte la sortie RA2 à la commande de montée
#define DESC PIN_A3 // affecte la sortie RA3 à la commande de descente
#define SPWM PIN_C2 // affecte la sortie RC2 à la commande du PWM
#define ERADIO input(PIN_C3) // affecte à l'entrée RC3la commande radio
#define HIGH_START 7
byte high_count;
unsigned int flag=0,dirdesc=1,arret=0, montee=0, descente=0, fch=0,fcb=0,cde=0,radio=0;
int pwm=0;
unsigned int t=0;
//routine d'interruption
#INT_RTCC
clock_isr() //toutes les 4ms
{
if(--high_count==0) //toutes les 7 fois
{
high_count=HIGH_START;
if(t<100) t=t+1; // Le timer incrémente tous les 4*7ms
}
}
void lire(void) // lire toutes les entrées
{if (EFCH) fch=1; else fch=0;
if (EFCB) fcb=1; else fcb=0;
if (!(ERADIO)) radio=1; else radio=0 ;
}
void dir (void) // détermination du sens de marche
{
if (pwm==0) // si le moteur est à l'arrêt
{
if ((fch==0)&& (fcb==0)) // si aucun fin de course n'est actionné
{if (dirdesc==1) montee=1; // le sens est inversé
else descente=1;
}
else
{if (fcb==1) montee=1; // si un fin de course est actionné
else descente=1; // le sens est celui opposé au fin de c.
}
}
else arret=1; // si le moteur est en marche alors arrêt du moteur
}
void stop (void) // ralentissement et arrêt
{
if(t) // tempo à chaque pas de réduction de vitesse
{pwm--;t=0; // pwm est décrémenté de 1
if (!pwm) // quand pwm est à zéro arrêt
{
arret=0;
output_bit(MONT,0);
output_bit(DESC,0);
//le sens de marche est enregistré
if (montee==1) dirdesc=0;
else dirdesc=1;
montee=0;
descente=0;
}
}
}
void accelere (void) // démarrage progressif
{
if(t) // tempo à chaque pas d'accélération
{
pwm++;t=0; // pwm est incrémenté de 1
if (pwm>70) pwm=70; // pwm est à la vitesse maxi
}
}
void main() {
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,99,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_OFF);
enable_interrupts(INT_RTCC);
enable_interrupts(global);
output_bit(MONT,0); //initialisation des ES
output_bit(DESC,0);
output_bit(PIN_C4,0);//essais
output_bit(PIN_C5,0);//essais
high_count=HIGH_START;
while(1) //boucle sans fin.
{set_pwm1_duty(pwm);
lire(); // lire toutes les entrées.
// détection de l'impulsion de cde.
cde=0; // l'état 1 d'une commande ne reste
{ // qu'un cycle puis est effacée.
if(flag==0) // l'impulsion était précédemment à 0.
{ // output_bit(PIN_C5,0);//essais
if(radio==1)
{cde=1;flag=1; // une commande a été détectée.
}
}
else
{ // output_bit(PIN_C5,1);//essais
// l'impulsion doit d'abord être à 0
if (radio==0) flag=0; // avant d'être prise en compte.
}
}
{
if (cde==1)dir(); // impulsion de commande détectée
// déterminer le sens de marche
else
{
if (arret==1) {stop(); // si demande d'arrêt
// output_bit(PIN_C4,1);//essais
}
else
{ // output_bit(PIN_C4,0);//essais
if (montee==1) // si demande de montée
{if (fch==1) arret=1; // arrêt sur fin de course
else
{output_bit(MONT,1);
accelere(); // accélérer
} //jusqu'à la vitesse maxi
}
else
{if (descente==1) // si demande de descente
{if (fcb==1) arret=1; // arrêt sur fin de c.
else
{output_bit(DESC,1);
accelere(); // accélérer
} //jusqu'à la vitesse maxi
}
}
}
}
}
}
}
ntenu de id "zoneeditable"