probleme afficheur 7 segments
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

probleme afficheur 7 segments



  1. #1
    invite7dc03981

    probleme afficheur 7 segments


    ------

    Bonsoir à tous,

    je rencontre un gros probleme sur la gestion de 3 afficheurs septs segments anode commune multiplexé avec un PIC18F.

    il s'agit d'un compteur de 000 jusqu'a 999.
    ;
    J'ai testé le montage en hardware, ca fonctionne tres bien pour deux afficheurs, il compte bien de 00 jusqu'a 99 mais lorsque je rajoute le troisieme afficheur, ca fait n'importe quoi, au lieu de faire 001, 002, 003, etc jusqu'a 999, le premier digit et le 3 ieme digit donne toujours le meme chiffre!!

    c'est a dire il commence a compter 000 puis 101 puis 202 puis 303, le premier digit et le dernier digit compte ensemble alors que dans le programme il devrait compter normalement!

    voici le code
    Code:
    // Mise en oeuvre Afficheur Sept Segment Anode Commune
    // 07/07/2014
    // Mikroc Compiler From Mikroelektronika
    
    
    #define   Sel1      LATC.F0                                         // On affecte la macro Sel1 au PORTC0
    #define   Sel2      LATC.F1                                         // On affecte la macro Sel2 au PORTC1
    #define   Sel3      LATC.F2                                        // On affecte la macro Sel3 au PORTC2
    #define   Sel4      LATB.F5                                        // On affecte la macro Sel4 au PORTD4
    
    unsigned int  val = 0;                                                   // Variable Val non signé servant à compter les chiffres
    volatile unsigned char count = 0;                                   // Variable count utilisée pour multiple de l'interruption
    volatile unsigned char flag_0 = 0; 
    
    int units;
    int tens;
    int cents;
    int digit[2];
    
    
    
    // Prototype des fonctions
    
    void Init_Pic();                                                    // Initialise le Pic18F4550
    void InitTimer1();                                                  // Initialise les registres du Timer1 du PIC18F4550
    unsigned char Seven_seg(unsigned char Value);                       // Fonction qui sert à afficher les chiffres sur les afficheurs septs segments
    
    void main(){
    
        Init_Pic();
        InitTimer1();
        Sel1 = 0;                                                       // Variable de multiplexage ( Premier afficheur)  commande le transistor Q1
        Sel2 = 0;                                                       // Variable de multiplexage ( Deuxième afficheur) commande le transistor Q2
        
    
            while(1){                                                   // Boucle infinie
    
                        
                    digit[0] = val % 10;
                    
                    tens = (val - digit[0]) / 10;
                    digit[1] = tens % 10;
                    
                    cents = val  / 100;
                    digit[2] =  cents % 10;
    
                    Sel4 = 1;
                    delay_ms(7);
                    Sel4 = 0;
                    PORTD = Seven_seg(digit[0]);
                    Sel3 = 1;
                    delay_ms(7);
                    Sel3 = 0;
                    PORTD = Seven_seg(digit[1]);
                    Sel2 = 1;
                    delay_ms(7);
                    Sel2 = 0;
                    PORTD = Seven_seg(digit[2]);
    
    
    
                    
    
            if (flag_0 == 1){                                           // On a détecter une interruption ( On arrive ici chaque 1 seconde (100 ms * 10 = 1000 ms = 1 s))
    
                    val++;                                              // On incrémente de 1 notre variable val
                    flag_0 = 0;                                         // On remet à Zéro le bit de flag
            }
    
    
            
            }
    }
    
    
    void Init_Pic(){
    
             ADCON1 = 0x0D;                                             // Tous les Ports en Digital sauf RA0 et RA1 qui restent en analogique
             CMCON = 7;                                                 // Désactiver les comparateurs analogiques
             TRISC = 0;                                                 // PORTC En sortie
             LATC = 0;                                                  // Mise à 0 du PORTC entier
             TRISD = 0;                                                 // PORTD en sortie
             LATD = 0;                                                  // Mise à 0 du PORTD entier
             TRISB = 0;                                                 // PORTB en entrée
             LATB = 0;                                                  // Mise à 0 du PORTB entier
             TRISE = 0;
             LATE = 0;
             TRISA = 0;
             LATA = 0;
    
    }
    
    
    
    
    unsigned char Seven_seg(unsigned char Value){                       // Fonction d'affichage des chiffres
    
            switch(Value){
    
                    case 0 : return ~0xC0;                                    // Retourne le chiffre 1 lorsque value vaut 0 (Les digits sont inversés à cause de l'usage du ULN2003)
                    case 1 : return ~0xF9;                                    // Retourne le chiffre 2 .......................
                    case 2 : return ~0xA4;
                    case 3 : return ~0xB0;
                    case 4 : return ~0x99;
                    case 5 : return ~0x92;
                    case 6 : return ~0x82;
                    case 7 : return ~0xF8;
                    case 8 : return ~0x80;
                    case 9 : return ~0x90;
    
            }
    }
    
    
    void InitTimer1(){
    
      T1CON         = 0x11;
      TMR1IF_bit         = 0;
      TMR1H         = 0x3C;
      TMR1L         = 0xB0;
      TMR1IE_bit         = 1;
      INTCON         = 0xC0;
    
    }
    
    
    void interrupt(){
    
            if (TMR1IF_bit){                                              // Une interruption est déclenchée toute les 100 ms
    
                            TMR1IF_bit = 0;                               // On efface le drapeau du flag
                            TMR1H         = 0x3C;                              // On loade les registres TMR1H et TMR1L
                            TMR1L         = 0xB0;
    
                            // Interruption chaque 100 ms
    
                            count++;                                      // On incrémente une variable count pour avoir un multiple du temps de 100 ms
    
                                    if (count == 10) {
    
                                                          flag_0 = 1;      // On déclenche l'interruption généré par le débordement du timer à l'éxtétieur de l'ISR, voir Main
                                                          count = 0;       // On remet à 0 la variable count pour pouvoir compter de nouveau
                                                     }
    
                               }
    
    }

    par contre lorsque je veux compter avec deux afficheurs et que j'enleve la gestion du 3 ieme afficheur, ca compte parfaitement!

    Code:
         Sel4 = 1;
                    delay_ms(7);
                    Sel4 = 0;
                    PORTD = Seven_seg(digit[0]);
                    Sel3 = 1;
                    delay_ms(7);
                    Sel3 = 0;
                    PORTD = Seven_seg(digit[1]);
      
    // avec ce code ca compte normalement de 00 a 99!

    j'ai vérifié a mille reprise les connections hardware de l'afficheur, le probleme n'est pas hard, mais plutot software mais je vois pas ce qui se passe,

    pouvez vous meclaircir?

    -----

  2. #2
    invite7dc03981

    Re : probleme afficheur 7 segments

    les afficheurs sont actifs lorsque au niveau logique 1

  3. #3
    RISC

    Re : probleme afficheur 7 segments

    Salut,
    On ne sait même pas quel PIC tu utilises. Il en existe plus de 1000...
    Quelle carte utilises-tu ?
    Ou sont les bits de configuration ?
    A quelle fréquence fonctionne ton PIC ?
    As-tu mis un oscilloscope pour voir si les broches bougent ?
    a+

  4. #4
    DAUDET78

    Re : probleme afficheur 7 segments

    Et sans schéma ......
    J'aime pas le Grec

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

    Re : probleme afficheur 7 segments

    int digit[2]; // erreur il faut 3 pour 3 chiffres, le programme utilise digit[2]
    Dernière modification par jls28 ; 12/07/2014 à 10h49.

  7. #6
    invite7dc03981

    Re : probleme afficheur 7 segments

    il s'agit d'un pic18f4550 cadencé à 4 Mhz, le compilo est mikroc, les bits de config sont correctement configurés et les broches testés n'ont aucun probleme



    Citation Envoyé par jls28 Voir le message
    int digit[2]; // erreur il faut 3 pour 3 chiffres, le programme utilise digit[2]
    Non, puisque le premier chiffre mémorisé est localisé à digit[0]

  8. #7
    jls28

    Re : probleme afficheur 7 segments

    @newtech1 :

    Je confirme que c'est une erreur de definir :

    int digit[2]; // tableau à 2 élements

    et

    d'utiliser digit[2] dans le programme car
    digit[2] c'est le troisieme puisqu'avant il y a
    digit[0] et digit[1]

    Toujours pas convaincu ?
    Dernière modification par jls28 ; 12/07/2014 à 12h27.

  9. #8
    invite7dc03981

    Re : probleme afficheur 7 segments

    salut jls28,

    Finalement tu as raison et c"etait ca la source de mon probleme!! je croyas que déclarer digit[2] prenait en compte 3 chiffres,

    Merci à toi!

Discussions similaires

  1. PIC16F84A Afficheur 7 segments (Compteur) Probleme
    Par invited93be9e9 dans le forum Électronique
    Réponses: 8
    Dernier message: 12/04/2014, 18h55
  2. afficheur led 7 segments
    Par invite90763f57 dans le forum Électronique
    Réponses: 2
    Dernier message: 02/10/2012, 14h07
  3. afficheur 7 segments
    Par invite1d7cc0f1 dans le forum Électronique
    Réponses: 6
    Dernier message: 23/11/2009, 16h27
  4. Câblage Afficheur 7 segments sur 8051 via un décodeur BCD 7 Segments
    Par invite79668502 dans le forum Électronique
    Réponses: 5
    Dernier message: 24/09/2009, 19h53
  5. Afficheur 7 segments
    Par invited5081967 dans le forum Électronique
    Réponses: 6
    Dernier message: 05/01/2005, 18h34
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...