Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

commander des LED avec un clavier



  1. #1
    Voltron

    Question commander des LED avec un clavier


    ------

    bonsoir,

    dans une partie de mon projet je voudrais allumer des LED avec un 16F877 via un clavier 16 touches (relié à l'encodeur 74C922) et qui a chaque touche allume un certains nombre de diodes LED.


    le programme en C :

    Code:
     
    
    encodeur=input_b() >> 4 ;
    
    switch (encodeur)
    
       {
    case (0x04) :     // bouton (ligne 2,colonne 1) appuyé
    
    output_high(R1) ;  // LED allumée
    output_low(R2)  ;  // LED éteinte
    output_low(R3)  ;  // LED éteinte
    output_high(R4) ; // LED allumée
    
     break;}
    
    
    case (0x05) : 
    
       {
    output_high(R1) ;
    output_low(R2)  ;
    output_low(R3)  ;
    output_low(R4)  ;
    
    break;}
    
    bla, bla, bla...
    
    
    }

    encodeur, variable de type byte, est le signal que recoit le PIC par l'encodeur


    lorseque j'ai réalisé la simulation sur ISIS certainnes Diodes ne s'allumaient pas, d'autres clignotaient à une fréquence constante,et même parfois celles qui s'allumaient ne corresspondaient pas à la combinaison attendue.

    d'après vous,l'erreur viedrait-t-elle de mon code au niveau de l'allumage/extinction des LED:

    Code:
    output_high(R1) ;
    output_low(R2)  ;
    output_low(R3)  ;
    output_low(R4)  ;
    dois-je le changer avec output_c(0x01) par exemple??

    et dans ce cas quel fichier header dois-je mettre dans l'entête car mon compilateur (CCS) a ignoré l'instruction output_c() et output_d() mais a reconnu output_a() !




    voici d'ailleurs l'entête de mon programme, qu'est ce qui manque d'apès vous ? :

    Code:
    #include <16F877.h>
    #device adc=8                  
    #use delay(clock=4000000)
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
    
    
    #define DEM1      PIN_A0  // pin reliée au démultiplexeur
    #define DEM2      PIN_A1   
    #define DEM3      PIN_A2
    #define DEM4      PIN_A3
    #define A4        PIN_A4
    #define A5        PIN_A5
    
    
    #define R1          PIN_C0  
    #define R2          PIN_C1  
    #define R3          PIN_C2  
    #define R4          PIN_C3  
    #define LED_isol    PIN_C4  
    #define LED_temp    PIN_C5
    #define C6          PIN_C6
    #define C7          PIN_C7

    autre chose,mon compilateur ignore aussi la commande setup_adc_ports(NO_ANALOG) , bien que j'utilise les ports A comme sorties numériques (vers un Démulitiplexeur) , bizarre , non ?


    Rque : dans ce projet les LED que je voudrait allumer sont en réalité des relais , mais j'utilise des LED en simulation pour pouvoir visualiser l'exécution de ma commande .


    et merci d'avance pour vos aides .

    -----

  2. Publicité
  3. #2
    Voltron

    Re : commander des LED avec un clavier

    alors..., une idée ?

  4. #3
    RISC

    Re : commander des LED avec un clavier

    Voltron,

    Ou as-tu initalisés les ports en sortie et les broches en multiplexées ANx/RAx en digital ?
    Si tu utilises des broches du portA en sortie, il faut initialiser le registre ADCON1 pour déclarer les broches en digital puis initialiser les broches sur TRISA en E ou S ...(bien lire le user manual du PIC16F877, et les chapitres sur les "I/O ports" et sur le "A/D converter").

    Cherches sur le NET, il y a des centaines d'exemples pour ce micro ;=)

    a+

  5. #4
    Voltron

    Re : commander des LED avec un clavier

    salut RISC,

    mais c'est que je programme en C sous CCS, je ne touche pas aux registres à ma connaissance...

    ou bien c'est le syntaxe qui diffère,...

  6. A voir en vidéo sur Futura
  7. #5
    SiNeRgY

    Re : commander des LED avec un clavier

    Citation Envoyé par Voltron Voir le message
    autre chose,mon compilateur ignore aussi la commande setup_adc_ports(NO_ANALOG) , bien que j'utilise les ports A comme sorties numériques (vers un Démulitiplexeur) , bizarre , non ?
    Salut
    Voila, j'utilise le même compilateur que toi et l'intruction est "setup_adc_ports(NO_ANALOGS)", il manquait un "S", un ptit tour sur 16F877.h m'a donné la solution, ca pourrai te servire ulterieurement.
    Pour les output_c() et output_d(), chez moi ça marche très bien.
    Peut etre que ce n'est qu'un oublie de points virgules ou une erreur dans le device, je suis sure que c'est une erreur bête.
    Envoie nous tout ton code, on essayera de chercher avec toi

  8. #6
    Voltron

    Re : commander des LED avec un clavier

    salut SiNeRgY

    j'ai vérifié que j'ai pas oublié les point-virgule et même avec le S dans NO_ANALOGS mon compilateur continue à ignorer l'instruction, comme j'ai dis en haut, il s'agirait peut-être d'un fichier header qui manque .


    voici le code complet du programme, au fait le projet consiste à réaliser un banc de test (test d'isolement et test de montée en température) pour capteurs de température (thermpocouples) de 2 types (simplex et duplex) . le rôle du PIC est de recevoir une commande d'un clavier 20 touches via un encodeur (ici j'ai utiliser un encodeur clavier à 16 touches pour la simultaion car j'ai pas trouvé un à 20 touches dans la librairie d'ISIS) , et ensuite de fermer et d'ouvrir des relais en fonction de la touche appuyée (en simulation j'ai remplacé les relais par des diodes).


    l'entête du programme

    Code:
    #include <16F877.h>
    #device adc=8
    #use delay(clock=4000000)
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
    
    
    
    #define DEM1      PIN_A0
    #define DEM2      PIN_A1   // pin reliée au démultiplexeur
    #define DEM3      PIN_A2
    #define DEM4      PIN_A3
    #define A4        PIN_A4
    #define A5        PIN_A5
    
    #define TIS       PIN_E0  // pin relié au relais de choix Temp/Isol pour Simplexe
    #define TID       PIN_E1  // pin relié au relais de choix Temp/Isol pour Duplexe
    #define CTD       PIN_E2  // pin relié au relais de choix test de température C1/C2 pour Duplexe
    
    #define R1        PIN_C0  // pin reliée au  relais 1 
    #define R2        PIN_C1  // pin reliée au  relais 2 
    #define R3        PIN_C2  // pin reliée au  relais 3 
    #define R4        PIN_C3  // pin reliée au  relais 4 
    #define LED_isol  PIN_C4  // pin reliée a une LED qui indique que le test en cours est un test d'isolement
    #define LED_temp  PIN_C5
    #define C6        PIN_C6
    #define C7        PIN_C7
    
    
    #define D0        PIN_D0
    #define D1        PIN_D1
    #define D2        PIN_D2
    #define D3        PIN_D3
    #define D4        PIN_D4   
    #define D5        PIN_D5
    #define SIM       PIN_D6
    #define DUP       PIN_D7
    
    #define B0        PIN_B0
    #define B1        PIN_B1
    #define B2        PIN_B2
    #define B3        PIN_B3
    #define B4        PIN_B4  
    #define B5        PIN_B5
    #define B6        PIN_B6
    #define B7        PIN_B7
    
    
    
    int simpl, dupl, isol, temp ;


    voici la configuration des touches du clavier :

    *******les choix primaires********

    [ON/C]-----------> SIMPL
    [7] ------------> DUPL
    [8] ------------> ISOL
    [9] -------------> TEMP

    *********contrôle en isolement**********

    [+/-] ------------> C1m
    [4] --------------> C1M
    [5] --------------> mM
    [6]---------------> C2m

    **********Séléction de voie*********

    [%] -------------> 1
    [1 ]--------------> 2
    [2] --------------> 3
    [3] --------------> 4
    [racine]----------> 5
    [0] -------------> 6
    [1] --------------> 7
    [=] --------------> 8


    Le Programme principale


    Code:
    void main()
    {
    
    byte  encodeur;
    
    encodeur=input_b() >> 4 ;
    
    
    output_low(LED_isol) ; // LED éteinte
    output_low(LED_temp) ;
    
    
    while (1)
       {
    
    encodeur=input_b() >> 4 ;
    
    choix_simplex_duplex(encodeur) ;
    
    choix_isol_temp(encodeur) ;
    
    choix_et_affich_isol(encodeur) ;
    
    select_voie(encodeur);
    
    
       }
    
    }


    les fonctions :

    Fonction void choix_simplex_duplex(encodeur) (simpl/dupl)

    Code:
    void choix_simplex_duplex(byte encodeur) 
    {
    reset(encodeur);  
    
    switch (encodeur) {
    
     case (0x00) :  // bouton simplexe
      {
    output_high(SIM) ;  
      simpl=1;
      dupl=0;
      break;
      }
    
     case  (0x01) : // bouton duplexe
      {
    output_high(DUP) ;
      dupl=1;
      simpl=0;
      break;}
    
      }
    }

    Fonction de choix du type de test (isol/temp): choix_isol_temp(encodeur)

    Code:
    void  choix_isol_temp(byte  encodeur)
    
    {
    
    switch (encodeur) {
    
    
     case (0X02) :  // bouton isolement appuyé
    
        { output_high(LED_isol) ;  // LED de visualisation
          output_low(LED_temp) ;
    
      isol=1;
      temp=0;
    
       if (simpl==1)
       { output_low(TIS) ;}     // déexciter le relais ---> passer d'un eventuel test en Temp au test d'isolement
        if (dupl==1)
       { output_low(TID) ;}     // passer d'un eventuel test en Temp
    
       break;
        }
    
     case (0X03) :    // bouton temperature appuyé
        {  output_low(LED_isol) ;
           output_high(LED_temp) ;
    
      temp=1;
      isol=0;
    
      if (simpl==1)
       {  output_high(TIS) ; }   // passer à un test en Temp
      if (dupl==1)
      { output_high(TID) ; }
    
       break;
        }
    }
    
    }
    Fonction de réintialisation : reset(encodeur) ---> lorseque on appuye sur SIMPL ou DUPL on revient àau début (comme si aucune touche n'est appuyé)

    Code:
    void reset(byte encodeur)
    
    {
    
     if ( (encodeur==0x00) || (encodeur==0x01) )
      {
        simpl=0 ;
        dupl=0;
        isol=0;
        temp=0;
        output_low(LED_isol);
        output_low(LED_temp);
        output_low(TIS);
        output_low(TID);
        output_low(CTD);
        output_a(0x00);
      }
    
    }
    Fonction de sélection de voie : select_voie(encodeur) (8 voies simplex + 8 voies duplex)


    Code:
    void select_voie(byte encodeur)
    
    {
     if (simpl==1) {
    
      switch (encodeur) {
     case (0x08)  :             {
    
    output_a(0x00) ;
    
    break; }
    
     case  (0b00001001)  :  //     0b00001101 : // voie 2, simplexe
    
        {
    output_a(0x01) ;
    
    break; }
    
     case (0b00001010) : //   0b00001110 : // voie 3, simplexe
    
        {
    
    output_a(0x02) ;
    
    break; }
    
     case (0b00001011) : // voie 4, simplexe
    
        {
    output_a(0x03) ;
    break; }
    
     case (0b00001100) : // voie 5, simplexe
    
        {
    output_a(0x04) ;
    break;}
    
     case (0b00001101) : // voie 6, simplexe
     
        {
    
    output_a(0x05) ;
    
    break; }
    
     case (0b00001110) : // voie 7, simplexe
    
        {
    
    output_a(0x06) ;
    
    break; }
    
     case (0b00001111) : // voie 8, simplexe
    
        {
    
    output_a(0x07) ;
    
    break; }
    
    } // fin pour switch
    
         } // pour if
    
    
         if (dupl==1) {
    
     switch (encodeur) {
    
     case (0b00001000) : // voie 1, duplexe
     
        {
    output_a(0x08) ;
    
    break; }
    
     case (0b00001001) : // voie 2, duplexe
    
        {
    
    output_a(0x09) ;
    
    break;  }
    
     case (0b00001010) : // voie 3, duplexe
    
        {
    
    output_a(0x0a) ;
    
    break; }
    
     case (0b00001011) : // voie 4, duplexe
    
        {
    
    output_a(0x0b) ;
    
    break; }
    
     case (0b00001100) : // voie 5, duplexe
    
        {
    
    output_a(0x0c) ;
    
    break; }
    
     case (0b00001101) : // voie 6, duplexe
     
        {
    
    output_a(0x0d) ;
    
    break; }
    
     case (0b00001110) : // voie 7, duplexe
    
        {
    
    output_a(0x0e) ;
    
    break; }
    
     case (0b00001111) : // voie 8, duplexe
    
        {
    
    output_a(0x0f) ;
    
    break; }
    
      }  // fin pour switch
    
     }  //fin pour if
    
    }
    Dernière modification par Voltron ; 20/08/2007 à 20h09.

  9. Publicité
  10. #7
    Voltron

    Re : commander des LED avec un clavier

    voici le code en C exécutable (PCW de CCS)+ la simulation sur ISIS en pièce jointe



    vous pouvez essayer les touches clavier (suivant la configuration que j'ai écris en haut).dans un certain ordre ,

    je m'explique,

    au début: touches DUPL ou SIMPL -----------> une LED jaune s'allumera

    puis : touches ISOL ou EMP

    Si ISOL -----------> LED Bleue va clignoter
    Si TEMP ----------> LED Rouge //


    en suite:

    n'importe quelle touche de la 2ème ligne ( C1m, C1M, mM ou C2m)

    ------> des LED vertes ( du Bloc) s'allumeront à tort et à travers


    enfin vient la séléction de la voie du capteur à tester (vous pouvez essayer plusieurs touches):-----> n'importe quelle touches des 2 dernières lignes

    -------> une seule LED verte (du Bloc) s'allumera à chaque appuie (c'est correct)


    j'attends vos commentaires, et merci


    .
    Dernière modification par gienas ; 20/08/2007 à 20h49.

  11. #8
    gienas
    Modérateur

    Re : commander des LED avec un clavier

    Bonsoir Voltron et tout le groupe

    La pièce que tu as jointe, un fichier zip, a été supprimé par moi.

    Certes, il n'était pas atteint d'un virus (j'ai cependant procédé à un contrôle en ligne), mais il comportait une erreur, qui le rendait inutilisable.

    Peux-tu vérifier qu'il était bien valide?

    Comme sa taille n'était que de 22k, je pense qu'il est "démesuré" d'utiliser un zip pour cela. Historiquement, cela a été demandé pour des gros fichiers.

    Choisis des extensions utilisables "plus directement" sans contrôle pour le publier ici.

    Merci pour ta compréhension.

  12. #9
    Voltron

    Re : commander des LED avec un clavier

    salut gienas, j'ai mis les 2 fichier en zip car leurs extensions ne sont pas valides pour le gestionnaire des pièces jointes .

    Lien pour uploder mon code en C (PCW de CCS) + simulation sur ISiS :
    ------------>cliquez ici

  13. #10
    Voltron

    Re : commander des LED avec un clavier

    est ce que quelqu'un a essayé la simulation ?

  14. #11
    Voltron

    Re : commander des LED avec un clavier

    aucun ?

  15. #12
    SiNeRgY

    Re : commander des LED avec un clavier

    Bonjour
    Je n'ai pas pu accedé a tes fichiers, je ne sais pas pourquoi, je crois que c mon fournisseur internet qui le bloque.
    J'ai essayé de copier/coller ton code et de le complier, j'ai quelques erreurs, undifined...une de tes fonction
    Je n'ai malheureusement pas vraiment le temps pour lire et comprendre tout ton programme mais a premiere vu ( et ca n'explique pas pourquoi il ne reconnait pas output_c() ) tu n'as pas mis les instruction set_tris_a() et set_tris_B()...
    C'est avec que tu définit si tes port sont en entrée ou en sortie
    exemple:
    Code:
    SET_TRIS_B( 0x0F );
    
       // B7,B6,B5,B4 sorties
    
       // B3,B2,B1,B0 entrée

  16. Publicité
  17. #13
    Voltron

    Re : commander des LED avec un clavier

    salut Sinergy,

    voici fonction que j'ai oublié de mettre :

    Code:
    void choix_et_affich_isol(byte encodeur) 
    
    {
    if (isol==1)
    
     {
    
    
      switch (encodeur)
       {
    
    case (0x04) :   // test d'isolement C1m
    
         {
         output_c(0X09) ;   //printf("maintenant test d'isolement C1m") ;
         break;
         }
    
    
    case (0x05) :  // test d'isolement C1M
    
         {
         output_c(0X01) ;
         break;
         }
    
    
    
    case (0x06) :  // test d'isolement mM
    
          {
          output_c(0X08) ;
          break;
          }
    
    
    case (0x07) :  // test d'isolement C2m
    
          {
          output_c(0XA) ;
          break;
          }
    
       }
    
     }
    
    }
    le problème c'est que mon fichier <16F877.h> est apparrament défectueux, car quand je l'ai remplacé par <16F877a.h> les instructions input_b(), set_tris_b() et set_adc_ports() fonctionnent correctement (de même pour les pins c,d et e) ,

    en ce qui concerne le clignotement dans le bloc des LED (isolement), j'ai corrigé ca en remplacant , dans la fonction ci dessus,

    Code:
    output_high(R1) ;
    output_low(R2) ;
    output_low(R3) ;
    output_high(R4) ;
    par

    Code:
    output_c(0x09)
    depuis il n'y a plus de clignotement, j'ai pas encore compris la raison ?, alors si qcq'un pourrait me l'expliquer ...



    j'ai fait de même pour les LED d'isolement et de température, mais au début je les ai connectées à RC4 et RC5 et mis output_c(0x10) et output_c(0x20) pour les allumer, à l'appuie sur les touches ISOL et TEMPles LED s'allumaient correctement mais lorseque j'appuyais sur les touches C1m, C2M,C1M et C2m la LED de ISOL s'éteigne sans raison ?


    alors je les ai connectés respectivement aux pins RD0 et RD1 et j'ai mis comme commande pour les allumer

    Code:
    output_d(0x01) ;
    et 
    output_d(0x02) ;
    à la place de la fonction output_high()

    voici une capture d'écran de la simulation sur ISIS


  18. #14
    Voltron

    Re : commander des LED avec un clavier

    personne n'a essayé ?

  19. #15
    Voltron

    Re : commander des LED avec un clavier

    quelque chose n'est pas assez claire ou quoi ?

Discussions similaires

  1. commander une LED par ethernet
    Par JphenixB dans le forum Électronique
    Réponses: 14
    Dernier message: 25/12/2009, 18h57
  2. commander des relais avec MC68HC705KJ1
    Par freinsch dans le forum Électronique
    Réponses: 4
    Dernier message: 30/03/2007, 18h24
  3. Commander Des Moteurs Avec Un Pc ?
    Par PASCAL6604 dans le forum Électronique
    Réponses: 2
    Dernier message: 15/12/2006, 18h44
  4. commander les led de puissances
    Par buzz_45 dans le forum Électronique
    Réponses: 32
    Dernier message: 12/05/2006, 20h23
  5. commander un/des servo/s avec un/des potard/s
    Par Tix dans le forum Électronique
    Réponses: 2
    Dernier message: 01/02/2005, 11h35
Découvrez nos comparatifs produits sur l'informatique et les technologies.