IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Horloge numerique afficheur 7 segments


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Horloge numerique afficheur 7 segments
    Salut,

    Je me suis lancé sur le programme d'une horloge numérique sur 4 afficheurs 7 segments en C sur le compilateur de mikroelektronika. Avant que l'affichage de l'heure ne commence je veux faire le réglage de l'heure donc réglage des minutes et des heures mais le probleme est que quand j'appui sur mon bps (bouton poussoir) connecté au portb (configuré en entrée) pour le réglage je perd l'affichage sur mes afficheurs pendant une fraction de seconde avant qu'il ne réapparaisse avec la bonne valeur incrémentée.
    J'ai essayé de mettre des tempos a gauche et a droite mais ça ne marche pas. quelqu'un a déja rencontré ce problème? sinon l'horloge marche nickel a part ce problème de réglage. Pour l'instant je n'utilise pas d'interruption ni le timer du µc.
    Est ce que le probleme viendrait de mes temporisations j'en ai mis juste apres l'appui sur le bouton poussoir afin de lui laisser le temps de s'incrémenter sinon ça s'incrémente trop vite. mon sous programme réglage fonctionne comme suit:
    1)affichage avec multiplexage (5ms)
    2)appui sur bouton poussoir
    3) incrémentation
    4) tempo (1s) "quand je baisse la tempo ça s'incrémente trop vite"
    5) boucle sur l'affichage (1)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonjour,

    De quel microcontrôleur s'agit-il ?

    Impossible de te donner une réponse valable sans voir ton programme. Apparemment, il fonctionne à peu près correctement par ailleurs, donc il s'agit fort probablement d'un bug dans ton code.

    Je penche pour un anti-rebond logiciel appliqué à ton bouton poussoir. Soit c'est la temporisation elle-même qui monopolise tout le microcontrôleur pendant qu'elle s'exécute, au dépens de l'affichage, donc, soit il y a une boucle qui attend que le bouton soit entièrement relaché avant de continuer et qui provoque les mêmes symptômes.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    J'en suis arrivé a la même conclusion que toi obsidian mais je n'arrive pas a déboguer. j'ai aussi penser a l'anti rebond... mais un vrai casse tête depuis quelques jours. voici le bout de code de mon réglage. J'ai deux boutons que je surveille, un bps pour les minutes et un autre pour le réglage des heures. C'est sur un pic 18f.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    void reglage()
    {
    while(portb!=0x10)
     {
          porta=0x08;                 // Choix des milliers
          portd=t[mheure] ;
          delay_ms(1);
          porta=0x04;               // Choix des centaines
          portd=t[cheure] ;
          delay_ms(1);
          porta=0x02;            //choix dizaine
          portd=t[dminute];           //envoie valeur vers afficheur dizaine
          delay_ms(1);             //tempo affichage
          porta=0x01;         // choix unité
          portd=t[uminute];        // envoie valeur vers afficheur
          delay_ms(1);         // tempo
          switch (portb)                            //valeur appui sur bps 0x20 ou 0x40
          {
           case 0x20 : uminute++;             //reglage minute
                       delay_ms(1000);       // tempo appui touche
                       if (uminute==10)
                       {
                       uminute=0;
                       dminute++;
                       }
                       if (dminute==6)
                       dminute=0;
                        break;
           case 0x40 : cheure++;                        //Réglage heure
                       delay_ms(1000);                // tempo appui touche
                       if (cheure==10)
                       {
                       cheure=0;
                       mheure++;
                       }
                       if (mheure==2 && cheure==4)
                       {
                       mheure=0;
                       cheure=0;
                       }
                       break;
          }
       }
    }

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je travaille depuis un moment sur une application similaire, je fais un compteur / décompteur avec des 7 segments, des boutons poussoirs et un PIC18.

    Je présume que, dans ton main, tu fais une boucle while(1) dans laquelle tu allumes successivement chaque afficheur avec la bonne valeur (ce qu'on appelle souvent "multiplexage" bien que ce ne soit pas vraiment un multiplexage...), puis tu regardes si un bouton a été enfoncé (que tu traites si tel est le cas), et ça recommence. Fais-tu quelque chose dans ce genre là ?

  5. #5
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Citation Envoyé par defjames Voir le message
    le probleme est que quand j'appui sur mon bps (bouton poussoir) connecté au portb (configuré en entrée) pour le réglage je perd l'affichage sur mes afficheurs pendant une fraction de seconde avant qu'il ne réapparaisse avec la bonne valeur incrémentée.
    Sur un autre microcontrôleur que j'ai utilisé, on éteignait tout pour allumer les bons segments, car sans remise à zéro entre chaque chiffre, le microcontrolleur se contentait d'allumer les segments demandés, sans chercher à éteindre les segments qui n'étaient plus nécessaires (donc une commande pour éteindre des leds, une commande pour en allumer, impossible de faire les deux en une seule commande).

    Regarde dans la doc du pic18f (je connais pas ce microcontrôleur) pour voir comment il gère les registres liées à tes led.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    N'étant pas devin, sans schéma et sans tout le soft je suppose comme Bktero que tu travailles en "multiplexage"... Ce qui veut dire que pendant la seconde que tu laisses passer pour ton anti rebond (lignes 20 et 30), un des 4 afficheurs est trop alimenté et les 3 autres sont éteints, est ce bien comme ça?

    si tu ne veux pas travailler avec les interruptions , il faudrait au moins organiser ton programme avec une machine d'état (FSM) et utiliser un timer pour cadencer correctement. Vu que tu as 4 afficheurs (du moins je le suppose), qu'il y a rémanence en dessous de 25 hz, il faut au moins rafraichir un afficheur tous les 100èmes de seconde. Une petite interruption qui incrémente simplement un compteur tous les 100èmes de secondes et le tour est joué, tu peux te cadencer dessus... Voire encore mieux, un autoreload qui t'affranchira de l'interruption, mais il ne faut pas en attendre des miracles au niveau de la précision.

    A+

    Pfeuh

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Bktero, oui c bien ça j'ai un main qui appelle des fonctions.

    pfeuh, Le schema µc et achicheurs c'est le schema classique les 4 afficheurs sont tous branchés en paralèlle sur le PORTD et commandés par des transistors branchés sur PORTA (Multiplexage).

    "Ce qui veut dire que pendant la seconde que tu laisses passer pour ton anti rebond (lignes 20 et 30), un des 4 afficheurs est trop alimenté et les 3 autres sont éteints, est ce bien comme ça?"
    c Bien ça pfeuh .

    mais comment gerer le timer (dans mon cas timer0 du µc) avec l'instruction delay que j'utilise dans mon programme j'ai essayé cette piste et le temps est trop long pour faire fonctionner mon horloge j'ai l'impression que les deux (instruction delay et timer du µc) ne vont pas ensembe.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Si ton micro-contrôleur est cadencé à une fréquence fixe et que ta fonction delay_ms() s'appuie sur une attente active (en gros une boucle ordinaire, probablement écrite en assembleur pour compter les cycles machines), tu peux la remplacer au sein de ton switch par une simple variable que tu nommerais par exemple « inhib » et choisir de n'évaluer ton switch que si celle-ci est nulle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if(!inhib)
        switch(portb)
        {}
        else --inhib;
    Il te suffit ensuite de remplacer tes delay_ms(1000) par un inhib=xxxxx avec xxxxx étant une valeur à étalonner selon tes goûts.

    De cette manière, la boucle principale continuerait de tourner à pleine vitesse et à rafraîchir correctement tes afficheurs mais éviterait l'évaluation de tes boutons, ce qui émulerait ta temporisation correctement.

    J'ajoute que dans ce genre de projet, quand on conçoit soi-même le circuit (ce qui est rarement le cas), il vaut mieux bufferiser les afficheurs avec des latches (verrous), formés par des bascules et qui maintiennent le dernier état de leurs lignes lorsqu'elles ne reçoivent pas le signal d'horloge. Tel que ton programme est écrit actuellement, le chiffre des unités doit être légèrement plus lumineux que les autres…

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    c quoi un autoreload?

    J'utilise le timer0 du µc en surveilllant l'etat de certains registres pour l'interruption... et c'est ma fonction interruption qui gere l'affichage donc raffraichi les afficheurs tous les 100èmes de secondes et ça marche.L'horloge tourne normalement pas de probleme d'affichage. Juste un petit probleme lors du reglage de l'heure, pendant l'incrémentation il prend un peu de temps a afficher les dizaines rond genre 10, 20, 30...???
    Par contre impossible de lui mettre une variable qui compte en boucle, ça compte trop vite ou il ne compte pas.. je suis obligé d'utiliser que delay... est ce du a l'utilisation du timer???

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Comment sortir d'une boucle goto? J essaye break mais cela ne marche pas!

  11. #11
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par defjames Voir le message
    Comment sortir d'une boucle goto? J essaye break mais cela ne marche pas!
    Le goto c'est le mal surtout quand on post dans la section débutant , le goto est plus réservé a des personne expérimenté qui utilisera avec parcimonie.
    Pour répondre a ta question a part faire un autre goto pour y sortir il y aura pas d'autre moyen (code spaghetti ?) , ou enlevé le goto et le remplacé par une boucle.

  12. #12
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par defjames Voir le message
    c quoi un autoreload?
    Un timer est un registre qui s'incrémente ou se décrémente au bout de x coups d'horloge du quartz ou d'une source extérieure. Le "x coups d'horlgoe" est communément appelé "diviseur", il est bien entendu programmable. Un autoreload est un timer qui ne s'arrête pas à la première incrémentation mais continue indéfiniment. Les applications sont multiples, baudrate generator, déclenchement d'interruption cyclique ou diviseur de fréquence en particulier.

    Tu as aussi les compteurs qui compte les fronts sur leur entrée. Cette entrée peut être une pin du hardware, mais elle peut aussi être la sortie d'un timer.

    Si tu as une horloge à 1 méga, un timer autoreload avec un diviseur de 10000 tu peux attaquer un compteur qui s'incrémente tous les 100/èmes de seconde, et tout cela sans la moindre interruption. A toi de voir si tu peux trouver ça dans ton hardware et cadencer ton soft autour de ce registre.

    A+

    Pfeuh

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut Pause/redémarrer comptage minuteur
    Bonjour à tous,

    je suis en train de faire un programme en langage C pour un minuteur avec un PIC 18f45....sur 4 afficheurs 7 segments et j'aimerai savoir comment faire une pause en cours de comptage. c'est a dire le mettre sur pause lorsqu'il compte ou décompte par un bouton et le redémarrer là ou il s'est arrêté par le même bouton. je galère dessus si quelqu'un a une idée... merci d'avance.

    voici un bout de mon programme de la partie pause qui ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    etq1
             rb1_bit= rb1_bit & 1; // surveille l’entrée du bit 1 du portb
                if (rb1_bit==1)                             
                {
                pause=rb1_bit;  //met valeur de rb1 dans pause
                a++;               //incrémentation de a
                }
                  if (a==2)
                   {
                   goto suite;   branchement a la suite du programme
                    }
                 if (pause==1)
                 {
                   goto etq1;  // pause timer
                   }
     
     suite:a=0;

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Regarde plus attentivement ta ligne 8

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Ce problème est le même que celui de ta dernière discussion. Merci de rester sur le même fil.

    (Discussions fusionnées).

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    oui if (a==2); je l'avais corrigé mais ça ne marche toujours pas!

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut minuteur + horloge
    J'ai une autre petite question: Dans mon programme j'aimerai faire autre chose pendant que le minuteur continue a tourner derriere du genre changer de mode, afficher l'heure lors de l'appui d'un bouton poussoir sans arreter le minuteur qui fonctionne toujours de telle sorte que quand je reviens en mode minuteur il ne s'est pas arreté de compter. y'a t-il un mode spécial ou des configurations a faire pour ça dans le microcontroleur. Doit -on utiliser aussi les interruptions?
    Pour ceux qui rejoignent la file, j'utilse un pic18f45...pourquoi? ben j'ai acheté une carte et le 18f45...etait fourni avec..

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Hello,

    Encore bloqué sur mon programme. Lors du réglage de l'heure, J'aimerai mettre dans mon programme un choix d'affichage de l'heure en mode 12h ou 24h avec un seul bouton sans utiliser les interruptions. Est ce possible? j'ai essayé de le faire mais ça change trop vite en mettant un delay apres chaque appui sur un bouton ça bloque le fonctionnement de mon programme.

Discussions similaires

  1. envoi de données vers un afficheur 7 segments
    Par Inaha dans le forum VB.NET
    Réponses: 3
    Dernier message: 10/06/2013, 09h02
  2. [68HC11] Horloge numérique avec afficheur 7 segments
    Par Need you dans le forum Autres architectures
    Réponses: 2
    Dernier message: 08/04/2012, 09h31
  3. afficheur 7 segments
    Par Orguevirtuel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 10/04/2011, 21h17
  4. [PIC 16F84] Afficheur 7 segments
    Par Vipear dans le forum Autres architectures
    Réponses: 5
    Dernier message: 29/05/2009, 09h01
  5. Horloge Numerique en Analogique
    Par cfn3cfn dans le forum 4D
    Réponses: 1
    Dernier message: 18/07/2007, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo