Aller au contenu


Photo
- - - - -

Code C++ Digicode pour pic16f84a


  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1 dav2mars

dav2mars

    Nouveau membre

  • Membres
  • 9 messages

Posté 04 octobre 2013 - 01:37

Bonjour,

je suis en train de faire un programme pour faire un digicode sur pic 16f84a:

Mon but est d'allumer une lumiere verte durant 0,5 sec lorsque je fais le bon code. J'ai reussi avec un numero, mais avec deux numero sa ne marche pas meme en ajoutant une variable. Donc je vous recopie mon code, et sur celui ci le bon chiffre qui fait allumer la lumiére verte est le 4. Donc je travail avec mikroC pro for pic et Proteus pour la simulation.

Je remerci d'avance toute les personnes qui montreront un soupçon d'aide.

voici le code et le schema du circuit est ci joint:

// declaration variable a pour la valeur du clavier

void main()
{
     int a;
     int c;
     int active;
     PORTA=0;  //initialisation de ports
     PORTB=0;
     TRISA=0x00;  // configuration du port A comme sortie
     TRISB=0xf0;  // port B comme entree/sortie

     while(1)
             {

             a=99; // initialisation de a par une valeur differente

             portb.f0=1;
             if(portb.f4) a=1;
             if(portb.f5) a=4;
             if(portb.f6) a=7;
              portb.f0=0;

              portb.f1=1;
             if(portb.f4) a=2;
             if(portb.f5) a=5;
             if(portb.f6) a=8;
             if(portb.f7) a=0;
              portb.f1=0;

              portb.f2=1;
             if(portb.f4) a=3;
             if(portb.f5) a=6;
             if(portb.f6) a=9;
              portb.f2=0;



              if(a!=99)
             {


                     PORTA=a;
                      if(a==4){portb.f3=1; delay_ms(500);}
                      portb.f3=0;
              }

             }

     }

Fichier(s) joint(s)



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 188 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 05 octobre 2013 - 02:13

Salut,

si je te propose ça tu m'en dis quoi ? =)

// declaration variable a pour la valeur du clavier

void main()
{
     int a;
     TRISA=0x00;  // configuration du port A comme sortie
     TRISB=0xf0;  // port B comme entree/sortie
     PORTA=0;  //initialisation de ports
     PORTB=0;
     
     while(1)
             {

             a=99; // initialisation de a par une valeur differente

             portb.f0=1;
             if(portb.f4) a=1;
             if(portb.f5) a=4;
             if(portb.f6) a=7;
              portb.f0=0;

              portb.f1=1;
             if(portb.f4) a=2;
             if(portb.f5) a=5;
             if(portb.f6) a=8;
             if(portb.f7) a=0;
              portb.f1=0;

              portb.f2=1;
             if(portb.f4) a=3;
             if(portb.f5) a=6;
             if(portb.f6) a=9;
              portb.f2=0;



              if(a==4)
                       {
                       PORTA=a;
                       a=99;
                       while (a==99)
                       {
                        portb.f0=1;
                        if(portb.f4) a=1;
                        if(portb.f5) a=4;
                        if(portb.f6) a=7;
                        portb.f0=0;

                        portb.f1=1;
                        if(portb.f4) a=2;
                        if(portb.f5) a=5;
                        if(portb.f6) a=8;
                        if(portb.f7) a=0;
                        portb.f1=0;

                        portb.f2=1;
                        if(portb.f4) a=3;
                        if(portb.f5) a=6;
                        if(portb.f6) a=9;
                        portb.f2=0;

                       if(a==7)
                       {
                       PORTA=a;
                       portb.f3=1; 
                       delay_ms(500);
                       portb.f3=0;
                       }

                     }

                    }
 }
}

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPip
  • 1 212 messages
  • Gender:Male
  • Location:Autriche

Posté 05 octobre 2013 - 11:21

Salut,

je ne connais pas les PIC, mais d'après ce que je comprends du code, est-ce que tu n'aurais pas un problème de bufférisation ? En gros, tu as une chance que ta première condition soit vérifiée (le premier caractère est bon) mais rien ne prouve que le deuxième caractère sera tapé dans l'intervalle de temps (très court) durant lequel ton code est dans la deuxième condition. Donc, à moins que la lecture des ports soit bloquante, tu ne pourras jamais lire mieux qu'un caractère avant remise à 99 de a.
Par ailleurs, tu recopies le code qui te permet de tester l'appui sur tes boutons. Est-ce qu'il ne serait pas judicieux d'utiliser une fonction (factorisation du code) ou des interruptions pour capturer tous les digits appuyés ?

À mon avis, tu devrais plutôt fonctionner comme suit (en pseudo code) :

<type> Code //initialisation d'un buffer de taille suffisamment grande pour tester ton code / de taille dynamique si possible.

Début Boucle
      Lecture des ports
          Ajout de la variable lue à la suite de buffer.

        Si longueur(Code) == LongueurAttendue & Code.dernierElement == CaractereDeControle //Test de la viabilité du code (taille et caractère de fin par exemple)
        Alors
               Si Code == CodeAttendu
                         Allumage LED verte
                         Envoi du signal d'ouverture de porte
              Sinon
                        Allumage LED rouge
              Fin Si

              RAZ de Code
        Sinon
              rien // On permet à l'utilisateur de compléter le code à taper
        Fin Si
Fin Boucle

Bien entendu, il faut détailler la lecture des ports, qui est sûrement spécifique aux PIC.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 188 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 06 octobre 2013 - 03:07

Salut,

je ne connais pas les PIC, mais d'après ce que je comprends du code, est-ce que tu n'aurais pas un problème de bufférisation ? En gros, tu as une chance que ta première condition soit vérifiée (le premier caractère est bon) mais rien ne prouve que le deuxième caractère sera tapé dans l'intervalle de temps (très court) durant lequel ton code est dans la deuxième condition. Donc, à moins que la lecture des ports soit bloquante, tu ne pourras jamais lire mieux qu'un caractère avant remise à 99 de a.
Par ailleurs, tu recopies le code qui te permet de tester l'appui sur tes boutons. Est-ce qu'il ne serait pas judicieux d'utiliser une fonction (factorisation du code) ou des interruptions pour capturer tous les digits appuyés ?

À mon avis, tu devrais plutôt fonctionner comme suit (en pseudo code) :

<type> Code //initialisation d'un buffer de taille suffisamment grande pour tester ton code / de taille dynamique si possible.

Début Boucle
      Lecture des ports
          Ajout de la variable lue à la suite de buffer.

        Si longueur(Code) == LongueurAttendue & Code.dernierElement == CaractereDeControle //Test de la viabilité du code (taille et caractère de fin par exemple)
        Alors
               Si Code == CodeAttendu
                         Allumage LED verte
                         Envoi du signal d'ouverture de porte
              Sinon
                        Allumage LED rouge
              Fin Si

              RAZ de Code
        Sinon
              rien // On permet à l'utilisateur de compléter le code à taper
        Fin Si
Fin Boucle

Bien entendu, il faut détailler la lecture des ports, qui est sûrement spécifique aux PIC.


En fait son code fonctionne très bien pour un code qui contient un seul chiffre, je pense qu'il avait juste un problème d'algorithmique pour faire un autre code qui fonctionne pour deux chiffres et plus. Je lui ai donné un code ( non optimisé ) qui fonctionne pour deux chiffre en reprenant ce qu'il avait déjà fait, du coup normalement il doit pouvoir à partir de ce que je lui ai donné savoir faire pour 3 chiffres et plus ! J'espère ainsi l'avoir débloqué du point de vue algorithme =)
Ensuite si tu as un doute par rapport à mon code : " intervalle de temps très court par rapport à la seconde condition " sache qu'en fait il y a un while ( a == 99 ) qui est "blocant" c'est à dire que tant qu'on appuis pas sur une touche on restera dans cette seconde condition en testant en boucle l'appuis sur une touche... donc pas de soucis de ce côté là.

Par contre en effet il serait judicieux de faire une fonction " testclavier()" qui reprendra en une fonction les 16 lignes contenant les 10 if.
Ensuite utiliser les interruptions serait aussi un choix judicieux.

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#5 dav2mars

dav2mars

    Nouveau membre

  • Membres
  • 9 messages

Posté 06 octobre 2013 - 11:07

Salut les gars,

Merci de votre dévouement.
Alors pour mes test selon vos conseils, dans l'ordre:

- Mike118: Donc j'ai testé ta proposition et merci çà marche,et c'est un peu bête de ma part de ne pas avoir compris avant, car si j'ai bien compris il s'agit de redéfinir les touches a chaque pression de chiffre. En effet maintenant pour la condition de while(a==99) c'est dire que si je n'ai pas appuyer sur la seconde bonne touche il ne m'affichera pas le chiffre sur le "7segments". De plus tu me parles d'interruptions, oui en effet on m'en a parlé également mais il se trouve que je ne sait pas du tout comment sa marche, j'ai chercher sur internet, mais ma recherche fut infructueuse... donc sais-tu ou pourrai-je apprendre de manière assez facile l'utilisation de l'interrupt et savoir a quoi sa sert exactement et quand les utiliser vu que je ne suis pas encore un utilisateur confirmé en programmation lol ? :)

- R1D1: En effet ta proposition de taper le code semble beaucoup intelligente que ma méthode assez primitive et bourine lol, je vais pour l'instant essayer de continuer sur ma méthode un peu bête pour bien comprendre la base, car ta manière me semble un petit peu confirmé en tant que débutant. Si après cela je n'arrive pas a arriver a ma destination voulu il semble que je devrais être obliger d’écrire dans la manière que tu me proposes, celle ci me semble plus ordonnée et plus efficace. Me reste il cependant a connaitre l'utilisation d'interruptions....

Merci beaucoup a vous d'avoir consacrer de votre temps pour m'aider :ignat_02:

#6 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPip
  • 1 212 messages
  • Gender:Male
  • Location:Autriche

Posté 06 octobre 2013 - 11:17

- R1D1: En effet ta proposition de taper le code semble beaucoup intelligente que ma méthode assez primitive et bourine lol, je vais pour l'instant essayer de continuer sur ma méthode un peu bête pour bien comprendre la base, car ta manière me semble un petit peu confirmé en tant que débutant. Si après cela je n'arrive pas a arriver a ma destination voulu il semble que je devrais être obliger d’écrire dans la manière que tu me proposes, celle ci me semble plus ordonnée et plus efficace. Me reste il cependant a connaitre l'utilisation d'interruptions....


Justement, d'expérience, je te conseille au maximum de factoriser ton code. Tu développes et testes une fonctionnalité (par exemple lire les entrées, ou faire un calcul particulier), dès qu'elle fonctionne correctement dans des cas simples (tests unitaires), ça vaut le coup d'en faire une fonction (ça t'oblige à généraliser un peu ton code et éviter les magic numbers). Ca facilite le déboguage (il n'y a qu'une source d'erreur) et ça clarifie le code.

Une chose importante à comprendre quand on programme sur microprocesseur ou pour une application complexe, c'est que le code doit être non pas dépendant du nombre de tour de boucles mais de l'état dans lequel le programme doit être.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#7 dav2mars

dav2mars

    Nouveau membre

  • Membres
  • 9 messages

Posté 06 octobre 2013 - 11:29

Ok super Merci R1D1 je vais y travailler avec mon collègue de laboratoire :)




1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users