Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

pic16f84a et afficheur 7 segments



  1. #1
    kevin8z

    pic16f84a et afficheur 7 segments


    ------

    bonjour, j'ai fait un programme qui devrer afficher les chiffres de 0 a 9 toute les seconde, mais le programme reste bloquer sur le chiffre 1 je ne comprend pas d'ou vien l'erreu et je re lu le programme plusieurs fois et je ne voi toujour pas ou est le probleme.

    voici le code:
    // afficheur 7 segments
    void main() {
    char seconde = 0xC0; //afficherer 0 au depart
    PORTB = 0;
    TRISB = 0;
    while (1){
    PORTB = seconde;
    delay_ms (1000); //affiche le chiffre pendant 1 seconde
    if (seconde = 0x90) {seconde = 0xC0; delay_ms (1000);} //affichera 0
    if (seconde = 0x80) seconde = 0x90; //affichera 9
    if (seconde = 0xF8) seconde = 0x80; //affichera 8
    if (seconde = 0x82) seconde = 0xF8; //affichera 7
    if (seconde = 0x92) seconde = 0x82; //affichera 6
    if (seconde = 0x99) seconde = 0x92; //affichera 5
    if (seconde = 0xB0) seconde = 0x99; //affichera 4
    if (seconde = 0xA4) seconde = 0xB0; //affichera 3
    if (seconde = 0xF9) seconde = 0xA4; //affichera 2
    if (seconde = 0xC0) seconde = 0xF9; //affichera 1
    }
    }

    -----

  2. Publicité
  3. #2
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    je vais faire autrement ce qui me permettra d'avoir un programme beaucoup plus petit et plus simple, je vais utiliser un decodeur bcd -> 7segment mais le probleme c'est que je ne trouve pas de decodeur pouvent afficher les caractere: ° et c c'est pour cela que je ne voulais pas en utiliser, auriez vous une reference d'un decodeur pouvent afficher c'est deux caracteres en plus?
    merci

  4. #3
    antoine6

    Re : pic16f84a et afficheur 7 segments

    Salut,

    Faudrait apprendre les bases du C, et etre un peu logique...

    Tu commence avec seconde = 0, tu l'incrémente où? nullepart, sauf!

    L'opérateur pour tester l'égalité de deux valeurs est le ==. Avec un simple =, le IF est validé, et tu change la valeur de seconde.

    Arrange ces deux trucs et ca marchera

    Ensuite, un if, suivi de 9 else if serait plus performant (meme si ca sert à rien dans ce cas précis)

    Mieux, crée un tableau à 10 entrées qui correspond au code 7 segment

    A+

  5. #4
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    bonjour,

    merci de votre reponse, mais au depart seconde est egale a 0xC0 et non pas a 0, je vais faire ce que vous m'avai dit et je vous direr si cela marche mieu.
    merci

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

    Re : pic16f84a et afficheur 7 segments

    par contre je ne comprend pas ce qu'est un tableau a 10 entrées.
    merci

  8. #6
    antoine6

    Re : pic16f84a et afficheur 7 segments


  9. Publicité
  10. #7
    Poseidon88

    Re : pic16f84a et afficheur 7 segments

    Y'a beaucoup plus simple et plus propre à faire.

    - Une boucle "for" pour incrémenter une variable toutes les secondes.
    - Un tableau qui répertorie les segments à allumer pour afficher le chiffre. En gros une table de conversion.
    - Et une fonction "switch case " qui te dis que si ta variable = 1, aller chercher la valeur 1 du tableau, etc...
    Dernière modification par Poseidon88 ; 09/11/2011 à 13h09.

  11. #8
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    merci, je vais lire la page internet du lien que vous m'aver envoyer, et poseidon88 justement je ne c'est pas comment faire pour que cela soit plus simple.

  12. #9
    _asm_

    Re : pic16f84a et afficheur 7 segments

    Salut
    Comme dis plus haut change le = , par == pour les if.

    Si tu veux arriver rapidement à un résultat
    le code suivant devrait marcher :
    // afficheur 7 segments
    void main() {
    char seconde = 0xC0; //afficherer 0 au depart
    PORTB = 0;
    TRISB = 0;
    while (1){
    PORTB = seconde;
    delay_ms (1000); //affiche le chiffre pendant 1 seconde
    if (seconde == 0x90) {seconde = 0xC0; delay_ms (1000);} //affichera 0
    if (seconde == 0x80) seconde = 0x90; //affichera 9
    if (seconde == 0xF8) seconde = 0x80; //affichera 8
    if (seconde == 0x82) seconde = 0xF8; //affichera 7
    if (seconde == 0x92) seconde = 0x82; //affichera 6
    if (seconde == 0x99) seconde = 0x92; //affichera 5
    if (seconde == 0xB0) seconde = 0x99; //affichera 4
    if (seconde == 0xA4) seconde = 0xB0; //affichera 3
    if (seconde == 0xF9) seconde = 0xA4; //affichera 2
    if (seconde ==0xC0) seconde = 0xF9; //affichera 1
    }
    }


    Bonne chance

  13. #10
    antoine6

    Re : pic16f84a et afficheur 7 segments

    Citation Envoyé par Poseidon88 Voir le message
    Y'a beaucoup plus simple et plus propre à faire.

    - Et une fonction "switch case " qui te dis que si ta variable = 1, aller chercher la valeur 1 du tableau, etc...
    Une fonction qui dit si seconde vaut 1, selectione la valeur 1, si seconde vaut 2, selectionne la valeur 2, et ca en 10 exemplaires, je trouve pas vraiment propre

    Tu commence à 0, et tu incrémente. Si t'arrive à 10, tu remet à 0. Pour l'affichage, tu prend la valeur tableau[seconde], pas besoin de passer par des tests

  14. #11
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    voici le nouveau programme beaucoup plus simple et plus lisible:

    // afficheur 7 segments
    void main() {

    char segments [10];
    char seconde = 0;
    PORTB = 0;
    TRISB = 0;

    segments [0] = 0xC0;
    segments [1] = 0xF9;
    segments [2] = 0xA4;
    segments [3] = 0xB0;
    segments [4] = 0x99;
    segments [5] = 0x92;
    segments [6] = 0x82;
    segments [7] = 0xF8;
    segments [8] = 0x80;
    segments [9] = 0x90;

    while (1){

    PORTB = segments [seconde];
    delay_ms (1000);
    seconde = seconde +1;
    if (seconde == 10) seconde = 0;
    }
    }

    maintenant il me reste plus qu'a acheter un deuxieme afficheur 7 segments et a reussir le multiplexage, d'ailleur si quelqu'un aurai un site qui explique, tout d'abord je sais qu'il faut utiliser le timer donc pour ca je ne pensse pas qu'il y aura beaucoup de probleme j'ai trouver un cour la dessus.

  15. #12
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    Attention avec le multiplexage, ca necessite une maitrise temporelle du programme sous peine d'avoir a chaque operation importante un scintillement de l'affichage voir un blocage sur un afficheur...
    L'utilisation d'interruptions pour le cyclage de l'affichage a intervale periodique (par exemple changement de l'afficheur eclairé tous les 10mS) permettra de faire les autres operations entre deux affichages, et de mettre a jour des registres qui seront lus a chaque interruption d'affichage.
    Dernière modification par Franck-026 ; 09/11/2011 à 18h39.

  16. Publicité
  17. #13
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    j'ai reussi a faire un affichage multiplexer avec 2 afficheurs 7 segments, seul probleme c'est que je les fait sans le timer0 et je ne c'est pas l'utiliser je croyer que c'etait simple et enfaite non, j'ai trouver un cour mais impossible de comprendre que pourai je faire avec mon programme, j'ai changer de pic le programme fonctionne maintenant sur un pic 16f887 car il possible plus de E/S car mon schema finil comportera 8 afficheurs. voici mon programme :
    Code:
    void main() {
     char segments [10], seconde1 = 0, seconde2 = 0, i =0;
     PORTA = 0;
     TRISA = 0;
     PORTB = 0;
     TRISB = 0;
    
     segments [0] = 0xC0, [1] = 0xF9, [2] = 0xA4, [3] = 0xB0, [4] = 0x99, [5] = 0x92, [6] = 0x82, [7] = 0xF8, [8] = 0x80, [9] = 0x90; 
      while (1){
    
       PORTA.RA1 = 0;
       PORTA.RA0 = 1;
       PORTB = segments [seconde1];
       delay_ms (10);
       PORTA.RA0 = 0;
       PORTA.RA1 = 1;
       PORTB = segments [seconde2];
       delay_ms (10);
       i = i + 1;
    
        if ( i == 50){
           seconde1 = seconde1 + 1;
           i = 0;
           }
    
        if (seconde1 == 10){
    
           seconde1 = 0;
           seconde2 = seconde2 + 1;
    
            if (seconde2 == 6){
    
                seconde2 = 0;
               }
           }
    
    
     }
    }
    et petite precision je travail avec microC et avec easypic6.
    Dernière modification par kevin8z ; 09/11/2011 à 22h38.

  18. #14
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    8 afficheurs 7 segments, ca fait maxi 15 sorties du PIC, moins en astuçant un peu et en rajoutant un ci externe...

    Bien sur que le multiplexage est pas evident a realiser. Pour un affichage permanent, le multiplexage est en priorité maximale, et on traite le reste du programme entre les interruptions de rafraichissement de l'afficheur... c'est une autre tournure d'esprit...

  19. #15
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    pour l'instant je pensse que je vais plutot utiliser les 15 sorties du pic car je ne sais pas comment faire autrement, mais pour le timer je ne vois toujour pas comment l'utiliser.

  20. #16
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    je recommence:

    tu vas sauter d'afficheur au suivant (affichage de chaque chiffre) au rythme de 500Hz, soit toutes les 2ms via une interruption qui se repete toutes les 2ms.
    Pourquoi 500Hz, pour ne pas avoir de defauts visuels. Tu peux meme pousser jusqu'a 800 herts pour avoir un taux de rafraichissement de chaque afficheur assez rapide pour le confort visuel.
    Donc chaque 2ms, ton interruption (Timer0) va faire ceci
    eteindre l'afficheur allumé (en cours), envoyer sur le port des segments communs aux afficheurs le contenu de la variable affectee a cet afficheur a allumer (donnees deja au format 7 segments, allumer le nouvel afficheur. et ainsi de suite. Ca c'est la routine prioritaire.
    Entre chaque interruption, tu vas lire les données de ton timer 1 qui est controlé par un quartz a 32.768KHz pour avoir un comptage toutes les 1 secondes, et decoder le registre en une suite de 8 variables correspondant a tes 8 afficheurs.
    Je te conseille d'utiliser dans certains cas le 8eme digit des afficheurs (DP, ou point digital) pour separer les heures des minutes des secondes.
    Ce qui fait qu'aui moment ou tu chages d'heure, de minute ou de seconde (cela se calcule en dehors des interruptions d'affichage), a la prochaine serie d'interruption, ton heure nouvelle s'affiche sur les LEDS...
    L'avantage de pouvoir coder tes afficheurs a la mano, c'est que tu peux afficher des caracteres non prevus par le jeu BCD ou hexa:
    - le ° sera comme le "o" minuscule mais en haut de l'afficheur
    - le C de celsius sera ecrit C a la mano... Tres facile...
    Pour generer les routines, tu peux utiliser des variables comme LED.0 qui contiendra "0" en decodé a envoyer sur le port

  21. #17
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    merci de votre explication donc je comprend bien ce que vous expliquer mais le probleme c'est que je ne c'est pas comment utiliser les timers, j'essayerer de faire des test pour arriver a cela.
    maintenant autre probleme tout a l'heure mon programme ce compiler normalement et la il ne veut plus il me dit a la ligne:
    segments [0] = 0xC0, [1] = 0xF9, [2] = 0xA4, [3] = 0xB0, [4] = 0x99, [5] = 0x92, [6] = 0x82, [7] = 0xF8, [8] = 0x80, [9] = 0x90;
    invalid expression
    pointer required
    je ne comprend pas pourquoi il me dit une erreur a cette endroit alors que sela marcher avant.

  22. #18
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    voir le cours de Mr bigonoff, la reference en la matiere

  23. Publicité
  24. #19
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    oui j'irai regarder les cour, mais pourquoi cette erreur? alors que avant ca ne la faisait pas.

  25. #20
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    pas mis malencontreusement un o au lieu d'un zero????

  26. #21
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    non, j'ai meme supprimer tout les 0 que j'avais mi et j'ai remi des 0 a la place pour etre sur qu'il n'y avai pas de o et ca ne marche toujours pas.

  27. #22
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    du coup j'ai ecrit comme cela et ca fonctionne:
    segments [0] = 0xC0, segments [1] = 0xF9, segments [2] = 0xA4, segments [3] = 0xB0, segments [4] = 0x99, segments [5] = 0x92, segments [6] = 0x82, segments [7] = 0xF8, segments [8] = 0x80, segments [9] = 0x90;

  28. #23
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    Je ne pourrai t'aider, le C et moi, il y a un monde...

  29. #24
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    j'essaye d'utiliser le timer0 mais impossible d'y arriver , j'ai confirer OPTION_REG mais il y a aussi ITCON et je ne voi pas dans le datasheete comment il faut le regler. je vais utiliser le timer0 et tout les 1seconde il y aura une impulsion sur la pate RA4 TOCKI et ca incrementera seconde de +1.
    si quelqu'un aurai un example du timer0 avec un pic 16f887 pour m'inspirer.

  30. Publicité
  31. #25
    Franck-026

    Re : pic16f84a et afficheur 7 segments

    bis repetita: va lire LE COURS de Mr bigonoff... Excelent moyen d'apprendre a te servir des interruptions. C'est en assembleur, mais ca se transpose en C facilement.

  32. #26
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    mais seul probleme c'est qu'en assembleur je ne connais rien du tout. jver aller lire son cour sur les interruption et le timer0.

  33. #27
    RISC

    Re : pic16f84a et afficheur 7 segments

    Salut,

    Il y a aussi des tutoriels et des exemples en C pour les PIC16 sur ces sites :
    * http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    * http://www.ac-limoges.fr/sti_ge/spip.php?rubrique4

    a+
    Ma marotte ? les microcontrôleurs ;=)

  34. #28
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    je vien de configurer le timer0 sur le pin T0CKI sur front montant, mais impossible de rentrer dans l'interruption voici mon code:
    Code:
    char seconde = 0;
    
    void main() {
     char segments [11], minute = 0, heure = 0, i =0;
     PORTA = 0;
     TRISA.RA4 = 1;
     PORTC = 0;
     TRISC = 0;
     PORTB = 0;
     TRISB = 0;
     T0CS_BIT = 1;
     T0SE_BIT = 0;
     T0IE_BIT = 1;
     TMR0 = 0;
     T0IF_BIT = 0;
     GIE_BIT = 1;
     segments [0] = 0xC0, segments [1] = 0xF9, segments [2] = 0xA4, segments [3] = 0xB0, segments [4] = 0x99, segments [5] = 0x92, segments [6] = 0x82, segments [7] = 0xF8, segments [8] = 0x80, segments [9] = 0x90, segments [10] = 0xBF;
    
       while (1){
    
         PORTC = 0b00000001;
         PORTB = segments [(seconde % 10)];
         delay_us (500);
         PORTC = 0b00000010;
         PORTB = segments [(seconde / 10)];
         delay_us (500);
         PORTC = 0b00000100;
         PORTB = segments [10];
         delay_us (500);
         PORTC = 0b00001000;
         PORTB = segments [(minute % 10)];
         delay_us (500);
         PORTC = 0b00010000;
         PORTB = segments [(minute / 10)];
         delay_us (500);
         PORTC = 0b00100000;
         PORTB = segments [10];
         delay_us (500);
         PORTC = 0b01000000;
         PORTB = segments [(heure % 10)];
         delay_us (500);
         PORTC = 0b10000000;
         PORTB = segments [(heure / 10)];
         delay_us (500);
    
    
             if (seconde == 60){
                seconde = 0;
                minute++;
    
                if (minute == 60){
                   minute = 0;
                   heure++;
    
                   if (heure == 24) heure = 0;
    
                }
             }
          }
       }
     
    void interrupt(void)
    {
    
    if(T0IF_BIT == 1)
    {
    seconde++;
    TMR0=0;
    T0IF_BIT =0;
    }
    }

  35. #29
    kevin8z

    Re : pic16f84a et afficheur 7 segments

    bonsoir,

    comment peut on faire pour creer une macro? car je ne vois pas du tout comment faire.
    ps: j'utilise mickroC

    merci

  36. #30
    Poseidon88

    Re : pic16f84a et afficheur 7 segments

    Tu vas trop loin trop vite !

    Avant de gérer des afficheurs 7 segments, commence par gérer des LED, ensuite essaye de faire clignoter une LED avec le TIMER.
    Tu verras qu'une fois que t'auras fais ca, le multiplexage sera facile.

Sur le même sujet


Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Afficheur 4 x 7 segments
    Par JeromineV dans le forum Électronique
    Réponses: 2
    Dernier message: 01/12/2009, 21h52
  2. afficheur 7 segments
    Par tibibs dans le forum Électronique
    Réponses: 6
    Dernier message: 23/11/2009, 17h27
  3. Réponses: 5
    Dernier message: 24/09/2009, 20h53
  4. afficheur 7 segments
    Par okchancy dans le forum Électronique
    Réponses: 4
    Dernier message: 28/05/2009, 22h13
  5. afficheur 7 segments
    Par wamania dans le forum Électronique
    Réponses: 1
    Dernier message: 08/01/2003, 19h55
Découvrez nos comparatifs produits sur l'informatique et les technologies.