Programme de PIC16F628 ne fonctionne pas
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Programme de PIC16F628 ne fonctionne pas



  1. #1
    fdamien12

    Programme de PIC16F628 ne fonctionne pas


    ------

    Bonjour,
    Je veux réaliser un montage me permettant d'allumer mon PC Media Center depuis une touche précise de la télécommande IR.

    En mode apprentissage, le PIC 16F628A enregistrera les durées hautes et basses de la trame dans sa EEPROM.

    En temps normal, lorsque qu'une trame sera reçue, les durées hautes et basses seront enregistrées dans un tableau, et les longueurs comparées à celles stockées en EEPROM.
    Après le début de la réception d'une trame, je considère qu'elle est finie lorsque l'état est bas pendant plus d'une seconde et j'ajoute un 0 en fin de mon tableau pour spécifier que la trame s'arrête là.

    Pour simplifier, la trame ne provient pas d'une télécommande IR mais directement de la sortie d'un 2è PIC qui envoie 5 périodes d'un signal carré de demi période 500ms.

    Le problème est que je n'arrive même pas à compter le nombres d'impulsions qui sont reçues!

    Voilà mon code sous MikroC (certains #defines servent à d'autres fonctions) :

    L'entrée dont je dois enregistrer les impulsions est E_TUNER.
    Ensuite, je fais clignoter la led branchée sur RELAIS1 le nombre de fois que j'ai enregistré une durée haute ou basse. (pour l'instant, la durée n'est même pas enregistrée mais est fixée arbitrairement à 50 pour une durée haute et 40 pour une durée basse. Une valeur 0 donne la fin de la trame.



    Code:
    #define TAILLE_TABLEAU_TRAME 30
    
    // PORT A : sorties
    #define    RELAIS1    PORTA.F0
    #define    RELAIS2    PORTA.F1
    #define    S_TUNER    PORTA.F2
    #define    BOOT_PC    PORTA.F3
    
    
    // Port B : entrées avec pull-up
    #define    LPT_R1     !PORTB.F4
    #define    LPT_R2     !PORTB.F5
    #define    LPT_R12    !PORTB.F6
    #define    E_TUNER    PORTB.F2 // ! à enlever
    #define    PC_BOOTE   !PORTB.F3 // ! à enlever
    
    void Afficher_Trame(unsigned char trame[])
    {
        int i;
        
        for(i = 0; trame[i] > 0; i++)
        {
            RELAIS1 = i % 2;
            delay_ms(500);
        }
        RELAIS1 = 0;
        delay_ms(1000);
    }
    
    
    
    void Recevoir_Trame_2(unsigned char trame[])
    {
        unsigned char no_bit = 0, continuer = 1;
        int cpt;
    
        while(continuer)
        {
            // Mesure de la durée de l'état haut
            while(E_TUNER);
            trame[no_bit] = 50;
            no_bit++;
    
            if(no_bit >= TAILLE_TABLEAU_TRAME - 1) // Tableau rempli
                continuer = 0;
    
             // Mesure de la durée de l'état bas
            cpt = 0;
            while(!E_TUNER && continuer);
            {
                delay_ms(100);
                cpt++;
                if(cpt > 10) // Timeout de 1s
                    continuer = 0;
            }
            no_bit++;
            
            if(no_bit >= TAILLE_TABLEAU_TRAME - 1) // Tableau rempli
                continuer = 0;
            
            // Si tableau rempli, la dernière valeur est 0, sinon la dernière valeur est le durée de l'état bas
            if(continuer)
                trame[no_bit] = 40;
    
            else
                trame[no_bit] = 0;
    
        }
    }
    
    
    
    void main()
    {
        unsigned char trame_recue[TAILLE_TABLEAU_TRAME];
        
        CMCON = 7; // Pas de comparateur
        TRISA = 0x0; // Port A en entrée
        TRISB = 0xFF; // Port B en sortie
        OPTION_REG = 0b01000010; // Pull-up sur PORTB, prédiviseur par 8, front montant de Fosc/4
    
        PORTA = 0;
    
        while(1)
        {
            if(E_TUNER) // Entrée du capteur du tuner à 1
            {
                Recevoir_Trame_2(trame_recue);
                delay_ms(25);
                
                Debug_Boot_Pc();
                Debug_S_Tuner();
                Debug_Boot_Pc();
    
                Afficher_Trame(trame_recue);
            }
        }
    }
    Le problème est que soit ma led ne clignote pas, soit elle clignote 30 fois (taille max du tableau).

    Savez vous d'où le problème peut venir ?
    Merci d'avance

    -----

  2. #2
    invitea613d208

    Re : Programme de PIC16F628 ne fonctionne pas

    Code:
    while(!E_TUNER && continuer);
            {
                delay_ms(100);
                cpt++;
                if(cpt > 10) // Timeout de 1s
                    continuer = 0;
            }
    Déjà ici il y a un problème

    Ce que je comprend c'est que tu boucles jusqu'a ce que le bit change d'état. Et bien pendant le delay_ms il peut changer d'état 200000 ton programme ne le verra pas

    Code:
           RELAIS1 = i % 2;
    Que veux tu faire avec cela ?

  3. #3
    fdamien12

    Re : Programme de PIC16F628 ne fonctionne pas

    Citation Envoyé par zhal Voir le message
    Code:
    while(!E_TUNER && continuer);
            {
                delay_ms(100);
                cpt++;
                if(cpt > 10) // Timeout de 1s
                    continuer = 0;
            }
    Déjà ici il y a un problème

    Ce que je comprend c'est que tu boucles jusqu'a ce que le bit change d'état. Et bien pendant le delay_ms il peut changer d'état 200000 ton programme ne le verra pas
    Merci pour ton aide

    Voilà c'est ça, mais en l'occurence mon signal est carré, avec Thaut = Tbas = 500ms. Donc en mettant une tempo de 100ms dans delay_ms(), étant donné qu'elle est très inférieure à la période du signal, le changement d'état sera forcément comptabilisé non ? (juste au maximum 100ms trop tard)
    Citation Envoyé par zhal Voir le message
    Code:
           RELAIS1 = i % 2;
    Que veux tu faire avec cela ?
    Cette instruction est dans ma boucle for qui incrémente i à chaque fois. Lorsque i est pair, RELAIS1 = i % 2 == 0 et la led est éteinte.
    Lorsque i est impair, la led est allumée. Ca me sert à faire clignoter la led juste en incrémentant une variable (j'aurais pu mettre à la place RELAIS1 = !RELAIS1).
    Je précise qu'en remplissant trame_recue[] à la main, la fonction pour l'afficher marche nickel

  4. #4
    invitea613d208

    Re : Programme de PIC16F628 ne fonctionne pas

    Ton delay ne peut pas aller, en fait, sa ne sert a rien, étant donné que la boucle ne s'arrêtera pas avant un changement d'état.

    Ton delay, si il y a un problème peut provoquer un retard de 100ms max

    Corrige cela et fait de nouveaux essais

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

    Re : Programme de PIC16F628 ne fonctionne pas

    J'ai trouvé ce n'était pas le delay le problème, juste un malheureux ; en trop après le while.

    Tout fonctionne nickel maintenant
    Merci bcp

Discussions similaires

  1. programme pic simple qui ne fonctionne pas
    Par alainav1 dans le forum Électronique
    Réponses: 6
    Dernier message: 10/04/2011, 14h55
  2. Grand Servomoteur fonctionne pas, alors que petit fonctionne
    Par invite5a932b88 dans le forum Électronique
    Réponses: 3
    Dernier message: 04/02/2011, 21h45
  3. RS232 fonctionne pour un programme et pas pour l'autre
    Par invite2f835eb1 dans le forum Électronique
    Réponses: 0
    Dernier message: 29/04/2008, 15h21
  4. Programme avec PIC16F505 ne fonctionne pas
    Par invite275c8bcb dans le forum Électronique
    Réponses: 18
    Dernier message: 02/02/2008, 10h31
  5. [Blanc] Lave linge Thomson access ne fonctionne pas en programme long
    Par jpp2 dans le forum Dépannage
    Réponses: 23
    Dernier message: 17/02/2007, 11h19
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...