multiplexage - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 55 sur 55

multiplexage



  1. #31
    invite1f39ae77

    Re : multiplexage


    ------

    TMR0IF_BIT signifie quelque chose pour le compilateur puisque je l'ai vue dans des exemple fourni avec MicroC, j'ai quand même fait ce que tu ma dit mais cela ne change rien, je comprend pas du tout ce qu'il se passe.

    -----

  2. #32
    invite5637435c

    Re : multiplexage

    Dans ce cas poste le code complet là où tu en es et je vais te reposter un code fonctionnel.
    @+

  3. #33
    invite5637435c

    Re : multiplexage

    Citation Envoyé par kevin8z Voir le message
    TMR0IF_BIT signifie quelque chose pour le compilateur puisque je l'ai vue dans des exemple fourni avec MicroC, j'ai quand même fait ce que tu ma dit mais cela ne change rien, je comprend pas du tout ce qu'il se passe.
    Tu as quelle version de MikroC?

  4. #34
    invite1f39ae77

    Re : multiplexage

    Code:
    /*
    
     * horloge a tube VFD
     * PIC16F887
     * fréquence 8MHZ
     * RTC ds1307
     * capteur température ds18s20
     * interruption: prescaler par 16; interruption toute les  2.048ms
     
    */
    
     
    #define selectreg PORTA.RA2
    #define moin      PORTA.RA3
    #define plus      PORTA.RA4
    #define select    PORTA.RA5  // choix : (temperature); horloge; date
    #define TMR0IF_BIT   INTCON.F2
    
    char segments [13], seconde = 0, minute = 0, heure = 0, jour = 1, mois = 1, an = 12, selection = 0, disp = 1;
    volatile char i = 0;
    
    
    /*******************************************************************************
                                   initialisation RTC
    *******************************************************************************/
    void initialiseRTC (){
    
       I2C1_Init (100000);     // initialisation a 100KHz de la vitesse d'horloge
    
       I2C1_Start();
    
       I2C1_Wr(0xD0);                // adresse DS1307
       I2C1_Wr(0);                   // début adresse 0
       I2C1_Wr(0);                   // quartz enable  et seconde = 0
       I2C1_Wr(0);                   // minute remise a 0
       I2C1_Wr(0);
       I2C1_Wr(1);
       I2C1_Wr(1);
       I2C1_Wr(1);
       I2C1_Wr(0x12);
       
       I2C1_Stop;
    }
    /*******************************************************************************
                                 Lecture RTC
    *******************************************************************************/
    void lectureRTC (){
    
      I2C1_Start();
      
      I2C1_Wr(0xD0);           // Adresse DS1307
      I2C1_Wr(0);                  // debut adresse 0
      I2C1_Repeated_Start();
      I2C1_Wr(0xD1);       // Adresse DS1307 pour lecture
      
      seconde = I2C1_Rd (1);
      minute = I2C1_Rd (1);
      heure = I2C1_Rd (1);
      I2C1_Rd (1);
      jour = I2C1_Rd(1);
      mois =I2C1_Rd(1);
      an =I2C1_Rd(0);
    
      I2C1_Stop();
    
    }//~
    
    /*******************************************************************************
                  Transforme le binaire codé décimal en décimal
    *******************************************************************************/
    void transformBDD (){
    
      seconde  =  ((seconde & 0xF0) >> 4) *10 + (seconde & 0x0F);
      minute   =  ((minute & 0xF0) >> 4) *10 + (minute& 0x0F);
      heure    =  ((heure & 0xF0) >> 4) *10 + (heure & 0x0F);
      jour     =  ((jour & 0xF0) >> 4) *10 + (jour & 0x0F);
      mois     =  ((mois & 0xF0) >> 4) *10 + (mois & 0x0F);
      an       =  ((an & 0xF0) >> 4) *10 + (an & 0x0F);
    }//~
    
    /*******************************************************************************
                                    écriture RTC
    *******************************************************************************/
    void ecritureRTC (){
    
     I2C1_Start();
    
     I2C1_Wr(0xD0);                // adresse DS1307
     I2C1_Wr(0);                   // début adresse 0
     I2C1_Wr(seconde);
     I2C1_Wr(minute);
     I2C1_Wr(heure);
     I2C1_Wr(0);
     I2C1_Wr(jour);
     I2C1_Wr(mois);
     I2C1_Wr(an);
    
     I2C1_Stop;
    }
    
    /*******************************************************************************
                        transform décimal en binaire codé décimal
    *******************************************************************************/
    void transformDBD (){
    
         seconde = (seconde / 10) << 4 +(seconde % 10);
         minute = (minute / 10) << 4 +(minute % 10);
         heure = (heure / 10) << 4 +(heure % 10);
         jour = (jour / 10) << 4 +(jour % 10);
         mois = (mois / 10) << 4 +(mois % 10);
         an = (an / 10) << 4 +(an % 10);
    }
    /*******************************************************************************
                               Affichage multipléxé
    *******************************************************************************/
    void affichage (){
    
        if (PORTD == 0x7F){
        
            PORTD = 0xFE;
        }
        else{
        
             PORTD = ~PORTD ;
             PORTD =  PORTD << 1 ;
             PORTD = ~PORTD ;
        }
    
        switch (PORTD){
    
               case 0xFE: disp = heure/10;
               break;
    
               case 0xFD: disp = heure%10;
               break;
    
               case 0xFB: disp = 10;
               break;
    
               case 0xF7: disp = minute/10;
               break;
    
               case 0xEF: disp = minute%10;
               break;
    
               case 0xDF: disp = 10;
               break;
    
               case 0xBF: disp = seconde/10;
               break;
    
               case 0x7F: disp = seconde%10;
               break;
    
        }
         
         PORTB = segments [disp];
    
    }
    /*******************************************************************************
                                        interruption
    *******************************************************************************/
    void interrupt (){
    
        if (TMR0IF_BIT){
        TMR0IF_BIT = 0;
        i = 1;
        }
    
    }//~
    
    /*******************************************************************************
                                  Réglage date et heure
    *******************************************************************************/
    void reglage (){
    
        while(selection <=3){
           
           switch (selection) {
             
             case 1:             //réglage des secondes
             
                if(plus){
                   seconde++;
                   if(seconde > 59) seconde = 0;
                }
                if(moin){
                   seconde--;
                   if(seconde == 0) seconde = 59;
                }
    
             break;
             
             case 2:           //réglage des minutes
             
                if(plus){
                   minute++;
                   if(minute > 59) minute = 0;
                }
                if(moin){
                   minute--;
                   if(minute < 0) minute = 59;
                }
    
             break;
             
             case 3:          //réglage des heures
             
                if(plus){
                   heure++;
                   if(heure > 23) heure = 0;
                }
                if(moin){
                   heure--;
                   if(heure < 0) heure = 23;
                }
    
             break;
             }
             if(selectreg){ selection++;}              // on reste dans la boucle tant que selectreg n'est pas relaché
             while(plus || moin || selectreg){}        // on reste dans la boucle tant que le BP n'est pas relaché
        }
        
        transformDBD ();
        ecritureRTC ();
        selection = 0; // On re-initialise la variable selection
    }//~
    
    /*******************************************************************************
                               Programme principal
    *******************************************************************************/
    void main() {
    
     initialiseRTC ();
    
         segments [0] = 0x80;
         segments [1] = 0xF2;
         segments [2] = 0x48;
         segments [3] = 0x60;
         segments [4] = 0x32;
         segments [5] = 0x24;
         segments [6] = 0x04;
         segments [7] = 0xF0;
         segments [8] = 0x00;
         segments [9] = 0x20;
         segments [10] = 0x7E; // -
         segments [11] = 0x38; // °
         segments [12] = 0x8C; // C
    
    TRISA = 0xFF; //entrée
    PORTA = 0x00;
    TRISB = 0x01; //RB0 en entrée
    PORTB = 0x00; // port b : segments
    TRISC = 0xFF; //entrée
    PORTC = 0x00;
    TRISD = 0x00;
    PORTD = 0x7F; // port d : digits
    
    ANSEL  = 0;   // Configure  pins en numérique
    ANSELH = 0;
    
    OPTION_REG = 0x83;
    INTCON = 0xE0;
    TMR0 = 0;
    
    
    
       while (1) {
            
            lectureRTC();
    
            if(i){
                  if(selection == 0){
                  transformBDD ();
                  }
    
                  affichage ();
                  i = 0 ;
            }
            if(selectreg){    //partie concernant le reglage de l'heure et de la date
               reglage ();
            }
       }
    }//~
    /*******************************************************************************
                                      FIN
    *******************************************************************************/
    J'ai la version 5.6, moi je ne veut pas que l'on fasse le programme à ma place je veut comprendre le/les erreure/s commise.

  5. #35
    invite5637435c

    Re : multiplexage

    Oui mais il faut que je vois tout le code sur mon compilateur là c'est moins commode.
    Je n'ai regardé que la partie interruption, il y a peut-être d'autres erreurs.

  6. #36
    invitefaaca50b

    Re : multiplexage

    Le verrou est au cul de chaque afficheur.
    Comme pour le multiplexage, on envoie un code sur 7 ou 8 bits (avec le DP) vers le bus commun a chaque afficheur.
    Quand on active le registre a verrouillage (verrou), on envoi le code sur le bus, on deverouille le verrou, il recupere l'octet, on le reverrouille et il presente a sa sortie l'octet memorisé jusqu'au passage suivant. Donc le verrou permet avec ce systeme de laisser l'etat memorisé pendant toute la duree du cycle, donc l'afficheur reste eclairé tout le temps entre deux mises a jour...

    Voir du coté du 74LS259 ou plus recent ici: http://www.alldatasheet.com/datashee...DM74LS259.html

  7. #37
    invite1f39ae77

    Re : multiplexage

    HULK28: vous ne pouvez que modifier la partie interruption, normalement dans le reste il n'y a pas d'erreur.
    FRANCK_026: je ne veut pas utiliser d'autre composant, donc je ne vait pas utiliser cette solution.

  8. #38
    invite5637435c

    Re : multiplexage

    C'est lecture RTC qui ne va pas, tu passes ton temps dans cette fonction.

  9. #39
    invite1f39ae77

    Re : multiplexage

    Que je passe mon temps dans cette fonction ou pas on "s'en fou" puisque l'afficheur et fait grâce au timer

  10. #40
    invite5637435c

    Re : multiplexage

    Donc il faut la mettre en tâche secondaire, il est inutile d'aller dedans plus d'une fois par seconde.
    Moralité il faut que tu y ailles seulement quand c'est utile, il te faut modifier ce qu'il y a dans le while().

  11. #41
    invite5637435c

    Re : multiplexage

    Citation Envoyé par kevin8z Voir le message
    Que je passe mon temps dans cette fonction ou pas on "s'en fou" puisque l'afficheur et fait grâce au timer
    Ben non, justement.
    Si tu te trouves dans la fonction ton i peut passer à 1 que tu ne changeras rien vu que rien ne sera pris en compte vu que tu ne t'y trouves pas, voilà pourquoi quelque soit la fréquence rien ne change vis à vis de tes afficheurs...
    Tu comprends bien que tant que tu es dans la fonction RTC tu ne peux voir à temps le i changer vu qu'il est à l'extérieur de cette fonction.

  12. #42
    invite5637435c

    Re : multiplexage

    La seule chose à faire à mon avis, c'est activer l'alim des digits aux bons moments, quitte à interrompre une tâche de lectrure de l'horloge (puisque secondaire en priorité), ce qui sous entend de mettre des conditions d'exécutions selon que i soit passé à 1 ou pas.
    De ça dépendra la qualité de ton affichage.

  13. #43
    invite5637435c

    Re : multiplexage

    Autre solution, si on considère que lire 1 fois par seconde l'horloge est suffisant, tu interdis l'interruption ce laps de temps nécessaire (TMR0IE=0).

  14. #44
    invite5637435c

    Re : multiplexage

    Re,
    tu te sers de TMR0IF et tu incrémentes une variable temps à chaque accès dans l'interruption.
    Cette interruption survenant toutes les 2.048ms pour avoir un ordre de lecture toutes les secondes environ tu incrémentes jusqu'à 400 cette variable puis tu mets j=1 -> TMR0IE=0 -> lecture horloge (j est activé donc dans le while() tu lis la RTC -> une fois fait tu remets j=0 -> puis TMR0IE=1 (pour que le compteur reparte -> et le tour est joué.
    j doit être en volatile également.

  15. #45
    invite1f39ae77

    Re : multiplexage

    je vois ce que vous voulez me dire, mais je croi avoir trouver l'erreur, cela viens du tube VFD, enffaite un tube VFD demande une alimentation de 50V hors moi je l'utilise avec une alimentation de 18V, et donc cela doit ete a cause de ca?

  16. #46
    invite5637435c

    Re : multiplexage

    Ben tu devrais deja le savoir ce genre de chose:

    http://forums.futura-sciences.com/el...-tube-vfd.html

    30V suffisent.



    Il n'empeche que ton programme en l'etat ne peut fonctionner sans ces modifications indispensables au niveau du soft comme nous l'avons vu precedemment.
    Solutionne ton probleme d'alim et reviens quand ca sera fait.
    Si tu avais un scope on gagnerait du temps.

  17. #47
    invite1f39ae77

    Re : multiplexage

    Oui je sais mais je n'avai pas d'autre alim et je penser juste que au pire des cas les segments s'allumeraient moin fort. Je vais commander un transfo pour les testes. A oui aussi vue que mon PIC est sur une easypic7 il y a des leds sur le PORTD la ou selectionne le digit a allumé, est bien les leds ne clignotes pas donc le probléme ca vien bien de l'alim. J'ai bien un scope cher moi, mais la je n'y suis pas.

    PS: d'ailleur le montage que j'avai fait pour converti 9V en 30V a n'a pas fionctionner bien lontemps le transistor MOS a griller.

  18. #48
    invite5637435c

    Re : multiplexage

    C'est sur qu'a l'heure ou le simulateur sur PC remplace l'oscilloscope la fiabilite va en prendre un serieux coup....
    Tu aurais du aller au bout de ta demarche concernant ton alim, ce n'est pas parceque ca ne fonctionne pas du premier coup qu'il faut tout arreter.
    Si ton Mos a grille c'est qu'il y a une grosse connerie sur ta carte.
    Un peu comme le soft, si il faut tout arreter a la premiere erreur de code il n'y aurait pas grand chose de fait en ce bas monde.
    Je ne te donnerai qu'un seul conseil: avance a petit pas mais avance en ayant regle les problemes l'un apres l'autre c'est la methode la plus efficace que je connaisse et la meilleure maniere d'apprendre

  19. #49
    invite1f39ae77

    Re : multiplexage

    Oui je suis bien d'accord avec toi, mais la je ne suis pas cher moi j'ai juste ma platine de devellopement, mon afficheur vfd plus l'alim, mais n'ayant rien pour reparer n'y le scope je suis bloquer pour l'instant.

    PS: j'ai verifier plusieurs fois mon alim et tout est bien connecter comme sur le schema.

  20. #50
    invite5637435c

    Re : multiplexage

    Avant de reparer il faut voir a quoi ressemble ton alim.
    Poste ton schema et tout ce que tu as d'utile pour regarder le probleme.
    Reposte ca dans la precedente discussion ouverte pour l'alim, sinon ca va etre le bazar ici.

  21. #51
    invite1f39ae77

    Re : multiplexage

    Le schéma de l'alim est déjà présent en premiere page de l'autre poste.

  22. #52
    invite1f39ae77

    Re : multiplexage

    Cette alim n'etait que pour tester, mais je vais peut être plutôt attendre de recevoir un transfo 2*18V, qui me permettra d'alimenter mon tube avec une tension de 50V.

  23. #53
    invite1f39ae77

    Re : multiplexage

    Après verification au scope, j'ai bien une fréquence de 61Hz, donc chaque digit est allumé pendant 2ms.

  24. #54
    invite1f39ae77

    Re : multiplexage

    Parcontre je viens de penser: si j'allume un digits toute les 2ms (sachant qu'il y en a 8) donc 1 digit est allumer toute les 14ms (7digits suivant * 2ms) pendant 2ms, donc ce probléme de scintillement est dû à cela.

  25. #55
    invite1f39ae77

    Re : multiplexage

    J'ai dit nimporte quoi sur mon derniere poste, vue que la fréquence est de 61Hz le scintillement ne devrer pas ce voir, faut que je regarde de plus prés du coter alimentation.

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Multiplexage affichage
    Par invite7dd217a5 dans le forum Électronique
    Réponses: 5
    Dernier message: 20/11/2010, 18h23
  2. multiplexage
    Par invite34cb80ff dans le forum Électronique
    Réponses: 2
    Dernier message: 15/02/2010, 14h59
  3. Multiplexage temporel
    Par inviteb2e92e68 dans le forum Physique
    Réponses: 2
    Dernier message: 28/11/2009, 17h12
  4. Multiplexage...
    Par invite40e1dfdf dans le forum Électronique
    Réponses: 5
    Dernier message: 11/08/2009, 22h15
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...