[programation C] infrarouge erreur!!!!!
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

[programation C] infrarouge erreur!!!!!



  1. #1
    invite819e2e55

    [programation C] infrarouge erreur!!!!!


    ------

    bonjour à tous,

    voilà j'avais dèja posté sur le forum électronique pour exposer mon problème afin de transformer la trame que je recevais de mon recepteur infrarouge en suite binaire comportant 11bits que je puisse interpreter. J'a réussi à synthetiser celà à l'aide du compilateur devPIC84f mais je me trouve face à un problème sur la fin du programme si quelqu'un pourait m'aider ? merci
    ps: bufferlow et bufferhigh sont les octet atribués aux bits de poid faible et au bits de poid fort mais pour plus d'information revoir mon post http://forums.futura-sciences.com/showthread.php?t=22653

    #include <std84.h>
    #include <bit84.h>

    #define REC_IR porta.0 //recepteur infrarouge
    #define L1 portb.0; //portb les 3 lampes
    #define L2 portb.1;
    #define L3 portb.2;

    char b1high=0b00000101;
    char b1low=0b10110011;
    char b2high=0b00000111;
    char b2low=0b10111111;
    char b3high=0b00000111;
    char b3low=0b011011111;

    void main() {

    char bit; //initialisation des variables
    char nbitlow;
    char nbithigh;
    char i, nbit, erreur;
    char bufferlow[1];
    char bufferhigh[1];
    char byte buffer[2];

    trisa:0b00001;
    trisb:0b00000000;

    while (VRAI) {

    buffer[0]=0;
    buffer[1]=0;
    erreur=0;
    nbit=0;
    i=0;

    while (i++!=4) { //test si REC_IR est au repos prolongé
    if (!REC_IR) i=0;
    delay(10);microdelay (100);
    }

    while (REC_IR); //attend premier bit
    delay(5);microdelay (150); //on se positionne au milieu de la trame

    while ((nbit++!=11)&&(erreur==0))
    {
    delay(5);microdelay (150);


    if(REC_IR)
    {delay(5);microdelay (150);
    if(!REC_IR) erreur=1;
    bit=0; //c'est un 0
    }
    else {

    delay(5);microdelay (150);

    if(REC_IR)erreur=0;bit=1; //c'est un 1
    }
    {
    while (nbitlow++!=8){

    bit<<1;
    bufferlow=bufferlow+bit; //et on le met dans le buffer
    }

    while (nbithigh++!=3){;
    bit<<1;
    bufferhigh=bufferhigh+bit ;

    }
    }
    if(erreur) printf ("bug\n\t");
    else{
    printf ("%x %x Touche %d\n\r",buffer[1],buffer[0],buffer[0]);
    }


    }
    }



    {

    if (nbitlow=8)&&(nbithigh=3)&&(b1 low)&&(b1high); //information correspond info bouton 1
    L1=1 ; }


    if (nbitlow=8)&&(nbithigh=3)&&(L1 =1)&&(b1low)&&(b1high); //maintenir la lampe 1 allumer tant ke lon rappuie pas sur le bouton
    L1=0 ;

    if (nbitlow=8)&&(nbithigh=3)&&(b2 low)&&(b2high); //test si information correspond au info du bouton 2
    L2=1 ; }


    if (nbitlow=8)&&(nbithigh=3)&&(L2 =1)&&(b2low)&&(b2high); //maintenir la lampe 2 allumer tant ke lon rappuie pas sur le bouton
    L2=0 ;

    if (nbitlow=8)&&(nbithigh=3)&&(b3 low)&&(b3high); //test si information correspond au info du bouton 3
    L3=1 ; }


    if (nbitlow=8)&&(nbithigh=3)&&(L3 =1)&&(b3low)&&(b3high); //maintenir la lampe 3 allumer tant ke lon rappuie pas sur le bouton
    L3=0 ;
    }
    }
    //end

    -----

  2. #2
    invite4c7a167b

    Re : [programation C] infrarouge erreur!!!!!

    Voilà ce que j'ai compris :
    - Tu as une trames de 11 bits qui est emis d'une télécommande.
    - Tu as remarqué que parmi ces bits certain avait une durée de 5 ms et d'autre de 7 ms.
    - Et tu veux pourvoir reconstituer la valeur binaire transitant dans cette trame.

    Est ce que c'est bien ça ?

    D'après moi il s'agit d'un codage, soit PWM comme le dit Patrick ou bien d'un codage ressemblant/identique à celui des MM53200 et UM3750 qui sont de tres grands classiques dans le codage infrarouge.

    Peux tu me poster l'allure de cette trame ?
    (Un dessin bitmap fera très bien l'affaire ! Avec les temps ce serait encore mieux.)

    A bientôt
    L'illuminé

  3. #3
    invite819e2e55

    Re : [programation C] infrarouge erreur!!!!!

    oui c'est bien sa mais en faite dans ce programme j'ai procédé de la façon suivante :

    - je lance une temporisation de 5.150ms et j'observe l'etat, si c'est un état haut alors le bit =1, car sa signifie que nous nous trouvons face à un intervalle de 7ms, et si c'est j'observe un état bas alors bit =0 et par cette manière je réalise une chaine binaire de 11bits. Mais voilà j'ai un problème de pur programmation sur ce ke j'ai souligné en bleu.Je ne c'est pas si sa vient peu etre de la déclaration de la variable bit, car le compilateur me dit d'utiliser la fonction setData.

    voilà un peu près l'allure de la trame, ce n'est pas sur quoi je travaille mais sa donne une idée.


    ps: petite longueur de trame 5.150ms et la grande un peu près 7ms
    Images attachées Images attachées  

  4. #4
    invite4c7a167b

    Re : [programation C] infrarouge erreur!!!!!

    Moi j'aurai fait autrement mais ton algo à l'air d'aller.
    Je ne c'est pas si sa vient peu etre de la déclaration de la variable bit, car le compilateur me dit d'utiliser la fonction setData...
    Oh ! Bizare, es tu sur que le mot "bit" n'est pas réservé ? Change son nom dans tout le programme pour voir.

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

    Re : [programation C] infrarouge erreur!!!!!

    merci d'essayer de m'aider, mais j'avais dèja essayer de faire ce que tu viens de me dire en changant le mot "bit" par "bitt" mais la réponse du compilateur est la même:

    erreur à la compilation:mauvaise affectation : bit
    vous tentez de donner une valeur à une constante . utiliser la fonction "setdata"


    je ne vois vraiment pas le problème. de plus je ne vois pas à quoi sert cette fonction setdata

    help me please

  7. #6
    invite4c7a167b

    Re : [programation C] infrarouge erreur!!!!!

    Code:
    for(nbitlow = 0; nbitlow < 8; nbitlow++)
    {
     bit <<= 1; /* l'erreur devait être ici ! */
     bufferlow = bufferlow + bit; /*et on le met dans le buffer */
    }
    
    for(nbithigh = 0; nbithigh < 3; nbithigh++)
    {
     bit <<= 1; /* l'erreur devait être ici ! */
     bufferhigh = bufferhigh + bit; 
    }
    ++

  8. #7
    invite4c7a167b

    Re : [programation C] infrarouge erreur!!!!!

    Tu feras attention car tu te sers de variables non initialisé.

    Autre chose, pourquoi ? :
    Code:
    char bufferlow[1];
    char bufferhigh[1];
    Déclarer ce type de tableau, 1 élément, revient à déclarer une variable !

    Si tu veux bien me poster ton algo (i.e. ce que tu veux faire dans le détails) je pourrai t'aider à optimiser ton code.

    Bonne soirée,
    L'illuminé

  9. #8
    invite819e2e55

    Re : [programation C] infrarouge erreur!!!!!

    voilà en faite ce que je veu faire c'est stocké a chaque foi ce que j'ai déterminé dans la variable bit 0 ou 1 celà dépend de la taille de mon état haut sur ma trame puis, je veu la stoquée sur 2 octet. Le problème c'est qu'avec le pic je suis obligé obligé de découper mon mot en 2 octet bufferlow et bufferhigh pour octet de poid fort et octet de poid faible. donc je voulais définir bufferlow et bufferhigh sur un octet chacun d'ou
    char bufferlow[1] mais je ne c'est pas si c'est la bonne syntaxe.

    ensuite par la commande bit<<1 je veu décaler mon bit sur l'octet afin d'éviter un entassement de l'information sur l'octet qui reviendrais à n'avoir qu'un seul bit donc je décale mon bit sur la gauche jusqu'a ce qu'il ateigne la valeur 8 sur le bit de poid faible puis ensuite,dans un deuxième temp qu' il stock la valeur contenu dans bit dans l'octet de poid fort juska la valeur 3 . afin d'obtenir un mot de 11 bits que je peu comparer à mes information que j'ai collécté relative à 3 bouton ki vont me permettre d'allumer 3 lampes en gros voilà j'éspère t'avoir guidé l'illuminé

  10. #9
    invite4c7a167b

    Re : [programation C] infrarouge erreur!!!!!

    Pré-requis :
    - Il faut être sur de la fiabilité de la détéction d'un 1 et d'un 0.
    - Ce code fonctionne si le bit de poids fort, emmis de la télécomande, est envoyé en premier (si c'est le bit de poids faible qui part d'abord il faut faire juste une petite modification.)
    - Est ce que tu peux regarder si tu as la possibilité de déclarer un "unsigned short int" ?

    Code:
    void main (void)
    {
     unsigned short int buffer = 0; /* buffer sur 2 octets            */
     unsigned char loop = 0;        /* variable de boucle temporaire  */
     unsigned char bit = 0;
     
     for(loop = 0; loop < 11; loop++)
     {
       /* il faut tester si le bit est à 0 ou à 1 ici
        * mais là ça dépend de ton compilateur et je 
        * ne le connais.
        * ...
        * ...
        */
        
       if(bit == 0x01) /* si le bit est à 1 */
        buffer |= 0x0001; /* mettre à 1 le bit de poids faible de buffer */
          
       buffer <<= 1; /* décaler buffer de 1 vers la gauche */
     }
     
     printf("%X\n", buffer);
    }
    Quel PIC utilises tu ?
    Tu dis que le chronogramme que tu m'as posté n'est pas celui sur le quel tu travails, en aurais tu un autre un peu plus précis ou avec des temps inscrit dessus ?

  11. #10
    invite819e2e55

    Re : [programation C] infrarouge erreur!!!!!

    je suis désolé du retard mais j'ai pas eu le temp de répondre avant. Bref jai réussi grace à tes conseil et en me creusant la tete à terminer le programme.ouf.
    J'ai pu le simuler et il fonctionnait avec le compilateur en mode pas à pas.Mais malheureusement losque je l'ai testé après l'avoir télécharger sur mon pic 84f j'ai constater qu'il gérait très mal les delay ce qui fesait qu'il n'arrivai pas à définir mon mot de 11bit.Puis que que la sonde infrarouge dont je disposais recevais des informations émanant de la lumière du jour. bref ma solution uniquement logiciel n'est donc pas envisageable pour ce pic mais jai utilisé une solution dont j'avais dèja penser et qui a fonctionner.
    en faite j'ai crée un signal carre de periode 1ms ki se déclanche dès un état bas puis un compteur compte le nombre de periode jusqu'a ce qu'il arrive à un état bas puis il le compare grace à comparateur et définie mes état binaire qu'il sauvegarde grace à une bascule et qu'il envoie ensuite au pic
    ect...

    bref merci pour l'aide que tu m'a apporté @+

Discussions similaires

  1. programation java
    Par invite200dac76 dans le forum Logiciel - Software - Open Source
    Réponses: 14
    Dernier message: 10/10/2007, 16h46
  2. programation
    Par invite1687c371 dans le forum Électronique
    Réponses: 2
    Dernier message: 10/09/2007, 20h03
  3. programation de microcontroleur
    Par invite17f09bd6 dans le forum Technologies
    Réponses: 8
    Dernier message: 12/01/2007, 22h30
  4. programation assembleur
    Par inviteb4585ab0 dans le forum Électronique
    Réponses: 4
    Dernier message: 20/07/2006, 18h21
  5. Programation JAVA
    Par invite4910fcda dans le forum Logiciel - Software - Open Source
    Réponses: 13
    Dernier message: 01/11/2004, 07h42
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...