Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

programmation pic

Démarré par modeste, Septembre 04, 2018, 06:48:55 PM

« précédent - suivant »

modeste

bonjour et merci à  tout les bidouilleurs.
je suis un peu nouveau en programmation et j'ai commencer par les pic et j'ai monter un petit projet mais je n'arrive pas a trouver la structure de programmation ou la fonction de programmation qui pourrait le faire ,voici le projet:
interrupteur1 =1   alors LED1= 1
interrupteur2 =1   alors LED2= 1
              voici ou je suis bloqué
si interrupteur1  et interrupteur 2 sont enfoncés alors LED3= 1
si interrupteur2  et interrupteur 1 sont enfoncés alors LED4= 1

en passant j'utilise micro.c
aidez moi car c'est très important pour moi
merci d'avance

Électro-Bidouilleur

Vraiment rien de complexe, vous verrez. Mais montrez-nous votre code existant pour qu'on puisse l'augmenter...

modeste

voici un extrait du programme:
       //les entrées
sbit interrupteur1 at RA0_bit;
sbit interrupteur2 at RA1_bit;
   
//LES SORTIES
sbit LED1 at RB0_bit;
sbit LED2 at RB1_bit;
sbit LED3 at RB2_bit;
sbit LED4 at RB3_bit;

//programme principale
void main ()
{
TRISA=0xff;
TRISB=0x00;

  while(1)
  {
    switch(PORTA)
    {
       case 1:          //action sur interrupteur1
             LED1 =1;   //led1 active
            delay_ms(500);
             LED1= 0;
             break;
                case 2:  //action sur interrupteur2
             LED2 =1;  //led2 active
            delay_ms(500);
             LED2= 0;
             break;
}}
maintenant,jevoudrait activer d'autres LED (LED3 et LED4 ) en actionnant sur les 2 interrupteurs comme suite:

if(interrupteur1 && interrupteur2) LED3=1;  //la led3 est active lorsque l'interrupteur1 en PREMIER est actionner puis l'interrupteur2
if(interrupteur2 && interrupteur1) LED4=1;  //la led4 est active lorsque l'interrupteur2 en PREMIER est actionner puis l'interrupteur1
}
aidez moi pardon car le programme ci haut fonctionne parfaitement pour
                  _  action sur l'interrupteur1
                  _ action sur l'interrupteur2
mais il ne fonctionne pas pour
_action sur (interrupteur1 et l'interrupteur2)
_action sur (interrupteur2 et l'interrupteur1)

comment pourrai je bien l'écrire

Électro-Bidouilleur

MikroC, Micro C (AVR), Micro-C.... Pas clair du tout. Pouvez-vous être plus clair sur l'environnement et le language utilisé?

Votre séquence d'interrupteurs combinés va d'abord causer le clignotement de la LED1 ou de la LED2, suivi de la LED3 ou de la LED4. Pas le choix de la façon que les LED1 et LED2 sont activées.

Pour faire un bon travail de validation des interrupteurs, vous ne devriez pas figer le micro-contrôleur avec un delay_ms(500), sinon comment allez-vous valider l'activation en séquence des deux boutons? En présumant que vous ne voulez pas utiliser des fonctions d'interruption, vous devriez plutôt sortir le comptage du délai de cette zone, faire plutôt 500 fois un délai de 1ms (ou 50 fois 10ms), et valider en boucle l'état des interrupteurs à  chaque passage de 1ms. Si une condition nécessitant un délai de 500ms est rencontrée, vous allumez une LED, et réinitialisez le compteur à  500, Plus bas, verifiez si une des LEDs est allumée. Si oui, décrémentez le compteur de 1 chaque passage, et eteignez tous les LED lorque le compteur atteint 0. Je présume ici que le 500ms total n'est pas absolument critique.

Ce qui suit n'est qu'une idée de comment vous pourriez procéder. Ce n'est pas testé! Presque sûr qu'il manque quelque chose.... Mais c'est un bon point de départ.

initialiser le compteur à  500
(Boucle débute ici)
Si interrupteur1 pesé && interrupteur2 non pesé && flag-interrupteur1 pas activé
  allumer LED1
  marquer interrupteur1 comme étant déjà  pesé (activer la variable flag-interrupteur1)
Si interrupteur2 pesé && interrupteur1 non pesé && flag-interrupteur2 pas activé
  allumer LED2
  marquer interrupteur2 comme étant déjà  pesé (activer la variable flag-interrupteur2)
Si flag-interrupteur1 actif && interrupteur2 pesé
  allumer LED3
Si flag-interrupteur2 actif && interrupteur1 pesé
  allumer LED4

LED allumée?
  oui
    compteur--
    delai_ms(1)
    compteur = 0?
      oui
        éteindre tous les LEDs.
        réinitialiser le compteur à  500
        désactiver flag-interrupteur1
        désactiver flag-interrupteur2
(boucle termine ici)

modeste

merci beaucoup t'es génial :) :)   :)

francoisp31

Merci je garde l'exemple
ça sera utile pour moi aussi :)