cchemin.de.fer.free.fr
wagon de nuit

 

 

 

 

Navigation:

 

 

 

retour
précédent
Programme du microcontroleur pour la commande du relevage du réseau
/
N° de broche
Repère composant
Désignation
Fonction
Etat 1 Etat 0
2
RA0
EFCH
Action fin de course haut
Pas d'action fin de course
3
RA1
EFCB
Action fin de course bas Pas d'action fin de course
4
RA2
MONT
Commande relais montée
Pas de commande
5
RA3
DESC
Commande relais descente Pas de commande
13
RC2
SPWM
Passant
Bloqué
14
RC3
ERADIO
Repos
Commande
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"