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 :

Programmation d'un microcontrolleur en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Par défaut Programmation d'un microcontrolleur en C
    Bonjour à tous !

    Je suis actuellement en train de réaliser un carrefour avec un décompteur sur les feux rouges pour savoir dans combien de temps le feu rouge passera au vert.
    J'ai déjà réussi à réaliser le code pour un afficheur 7 segments 2 digits, mais mon problème est que je n'arrive pas à le faire fonctionner sur un deuxième afficheur 7 segments 2 digits, mais j'aimerai qu'il ne décompte pas en même temps c'est à dire que l'un commence de décompte de 10 -> 0 puis une fois qu'il est arrivé à 0 l'autre commence le décompte à son tour et ainsi de suite.
    J'ai cherché pendant plusieurs jours sans grande réussite

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    unsigned short mask(unsigned short num) {
      switch (num) {
        case 0 : return 0x40;
        case 1 : return 0x79;
        case 2 : return 0x24;
        case 3 : return 0x30;
        case 4 : return 0x99;
        case 5 : return 0x92;
        case 6 : return 0x82;
        case 7 : return 0xF8;
        case 8 : return 0x80;
        case 9 : return 0x90;
      }
    }
     
    unsigned short digit_no, digit10, digit1, digit, i, number;
     
    void interrupt() {
      if (digit_no==0) {
        PORTA = 0;          //  Turn off all 7seg displays
        PORTB = digit1;     //  send mask for ones digit to PORTD
        PORTA = 1;          //  turn on 1st 7 seg., turn off 2nd
        digit_no = 1;
      } else {
        PORTA = 0;          //  Turn off all 7seg displays
        PORTB = digit10;    //  send mask for tens digit to PORTD
        PORTA = 2;          //  turn on 2nd 7 seg., turn off 1st
        digit_no = 0;
        }
      /*if(digit_no==0)
      {
         PORTA = 0;
         PORTC = digit1;
         PORTA = 4;
      }
      else if(digit_no==0)
      {
           PORTA = 0;
           PORTC = digit10;
           PORTC = 8;
           digit_no = 0;
      }*/
      TMR0 = 0;             //  clear TMRO
      INTCON = 0x20;        //  clear TMR0IF and set TMR0IE
    }
     
    void main() {
     
      OPTION_REG  = 0x80;   //  Timer0 settings
      TMR0        =   0;    //  clear TMRO
      INTCON      = 0xA0;   //  Disable PEIE,INTE,RBIE,T0IE
      PORTA       =    0;   //  clear PORTA (make sure both displays are off)
      TRISA       =    0;   //  designate PORTA pins as output
      PORTB       =    0;   //  clear PORTD (make sure LEDs are off)
      TRISB       =    0;   //  designate PORTD pins as output
      PORTC       =    0;
      TRISC       =    0;
      number=10;
     
      do {
     
          digit   = number % 10u ;
          digit1  = mask(digit);           // prepare ones digit
          digit   = (char)(number / 10u) % 10u ;
          digit10 = mask(digit);           // prepare tens digit
          Delay_ms(100);
     
            number--;
            if(number<=0)
            {
             number=10;
             Delay_ms(1000);
            }
     
      }
      while(1);
    }
    PS : s'il vous avez besoin de plus d'explication dite le moi

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Par défaut
    Bonjour,
    Ton problème vient du fait que tu changes d'afficheur à chaque appel de ton interruption.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (digit_no==0) {
    //...
    digit_no = 1;
    } else {
    //...
    digit_no = 0;
    }
    Je ne connais pas le délai de ton timer, mais il est surement faible, du coup avec la persistance rétinienne, tu as l'impression que les deux afficheurs sont actifs alors qu'en réalité ils s'activent chacun leur tour.
    Pour régler ton problème il faut donc que tu déplaces ton changement d'afficheur (la condition) au moment où tu détectes la fin du décompte (if(number<=0)).

Discussions similaires

  1. programmation microcontrolleur atmega16L
    Par zarrgoss dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 11/05/2010, 14h41
  2. Réponses: 13
    Dernier message: 11/03/2007, 03h09
  3. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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