TELECOMMANDE INFRAROUGE PIC12F675

Portrait de KNSFL

Bonjour à tous, je m'exerce en programmation des microcontrôleurs sous MiKroc pro for pic et mon travail est celui de réaliser un couple émetteur-récepteurs Infrarouge basé sur le protocole nec. j’utilise le MCU PIC16F675, cadencé en interne à 4Mhz à l’émission comme à la réception. 

Du coté de l’émetteur ca va mieux mais à la réceptions je n'ai rien du tout. je souhaite utiliser le TIMER1 pour calculer les durées aux états haut et bas de chaque bit envoyé. 

Ci-joint les codes sources de l’émetteur et du récepteur dont j'ai essayé de rédiger. je vous prie de m'aider à décoder les différentes trames que j’émets.

Merci d'avance!

Portrait de KNSFL

ici le code source de l’émetteur

Portrait de Walter

Bonjour, difficile de te répondre juste à la lecture de ton code, sans passer beaucoup de temps dessus.
Je pense qu'il faudrait que tu détailles ce qu'il se passe exactement.
Si j'ai bien compris la condition(INPUT == 1) ne passe jamais à vrai?

Je ne me rappel pas qu'il soit si simple de déclarer et lire une entrée digital, il n'est plus necessaire de passer par les différent PORT?
Du coup à quel broche correspond GPIO.BO

Portrait de KNSFL

Bonjour  Walter, GPIO est l’appellation du PORT pour le PIC12F675 et donc GPIO.B0 (Bit 0 du port GPIO);

while (GPIO.B0 == 1) {//tant que le Bit 0 du port GPIO est 5V 

          TMR1ON_bit = 1; //incrementer le registre TIMER1;}

//GPIO.B0 = 0V

TMR1ON_bit =0; //arrêter l’incrémentation

TH = ((TMR1H<<8) | TMR1L); //lire la valeur du timer 1 (le timer 1 du pic12f675 a une longeur de 16bits //reparti dans deux registre TMR1H et TMR1L d'une longeur de 8 bits chacun) "

TMR1L=0; TMR1H=0; //remiser à zéro de la valeur du timer1

Portrait de Louis.D

As-tu vérifié que l'émetteur envoie bien des trames ?
Si tu n'as pas autre chose prend un smartphone et enregistre une vidéo en émettant un code tout en déplaçant rapidement, soit le smartphone soit, l'émetteur ce qui est plus facile en général.

Le schéma des deux modules seraient le bienvenu !

Portrait de KNSFL

Bonjour Louis.D, oui l’émetteur transmet bien les informations. ci-joint le graphe sous proteus de l'entrée GPIO.B0 lorsque je presse la touche au code AB54C00F de l’émetteur. 

Portrait de Louis.D

Tu peux vérifier avec un smartphone s'il te plait ?

Portrait de KNSFL

oui. mais là taille de la vidéo est au dessus 1Mo je ne peux pas la charger ici

Portrait de Louis.D

Je ne te demande pas la vidéo mais vois tu la Led s'allumer sur la vidéo ?

Portrait de KNSFL

oui la les brille à chaque impulsion 

Portrait de Louis.D

ok merci qu'as tu comme matériel de labo ?

As-tu un oscillo ?

Portrait de KNSFL

Alimentation variable, multimètre numérique, plaque a essaie et le matériel de soudure électronique 

Portrait de Louis.D

Peux-tu faire un schéma du récepteur ? Et comment modules-tu les impusions avec le 38kHz sur l'émetteur ?

Portrait de KNSFL

Désolé pour le retard et merci pour ta disponibilité Louis.D le schema de simulation dans un premier temps est ci-joint

Portrait de Louis.D

Regarde cette explication de "Electro Bidouilleur" :

https://www.youtube.com/watch?v=z0AC0SvafZY

Portrait de KNSFL

Je trouvais un peu compliqué la modulation raison pour laquelle je fait le décodage direct pour un début. Même si je module à emission,  la sortie du récepteur ir enverrai au MCU de décodage un signal de la forme de celle dont je précharge directement dans la led émettrice. (la trame AB54C00F de INPUT de proteus ci-dessus par exemple).

le code du recepteur ici décode le bit start sans problème une led change d'etat  lorsque j'ajoute dans le programme à partir d'ici

if ( (TH < 9500 && TH > 8500) && (TB < 5000 && TH > 4000) ) {

canal1=~canal1;

} (la led change effectivement d'etat à chaque impulsion au niveau de l'emetteur)

Si je décode pour un début alors je peux dans ce cas essayer d'utiliser un récepteur ir au lieu d'une photodiode ou alors un optocoupleur et la modulation s'impose  à ce moment. 

merci cordialement

Portrait de Louis.D

ton code necéssiterait trop de temps pour que je m'y intéresse surtout sans shéma et avec des Atmega328 c'est tellement plus simple je ne vois plus l'intérêt d'utiliser des PICs mais je te laisse à tes recherches !

Bonne continuation.

Portrait de KNSFL

Ce fut un plaisir!  Merci 

Portrait de Louis.D

De même, mais pourquoi cherches tu as te compliquer l'existence ? Il y a tellement de projets intéressants avec des modules faciles à exploiter je ne vois pas l'intérêt de se casser la nénette pour au final arriver à pas grand-chose. Tu me fais penser à un copain qui ne vois que les circuits intégrés les transistors et autre composants alors que c'est complètement dépasser même le PICs qui sont obsolètes. Mais je te souhaite bon courage et d'arriver à tes fins.

Portrait de KNSFL

je travail dans n premier temps avec le matériel disponible sur le marché local car je ne peut pas encore faire les achats à l’extérieur? une façon de mieux comprendre aussi est de passer par les technologies les plus ancienne. Selon mon application, ce MCU suffit amplement. Si tout ce passe bien à la fin de ce projet je pourrais créer mon propre protocole.

Portrait de hercule124

Bonjour ,

La trame émettrice est bonne et elle respecte bien le  protocole nec.

0xAB pour l'adresse (low)

0x54 pour l'adresse logique inversée (high)

0xF0 pour la commande 

0x0F pour la commande logique inversés

je n'ai rien compris a ton schéma de simulation 

l’impulsion  a une période de 26.3µs soit une fréquence de 38khz sur une durée de 562µs ajouter a un temps mort de 562µs on obtient un etat logique 0 et pour une durée de 562µs + un etat mort de 1688µs on obtient un etat logique 1.

je ne comprends pas ce que tu veux faire avec l'optocoupleur .

Coté récepteur le signal IR atteint la lentille du TSOP1838, la sortie du TSOP1838 commence à répondre et à osciller en tandem avec le signal infrarouge seulement si le signal infrarouge est bien de 38khz 

Portrait de KNSFL

Salut  hercule124, j'ai choisi l'optocoupleur car je n'ai pas la librairie du Récepteur Ir dans un premier temps et pour isolé les deux MCU j'ai choisis cette méthode. comme je le disais précédemment, le code de l’émetteur est directement de la forme du signal de sortie d'un TSOP à des exceptions prêt (état logique inversés). 

lorsque j’appuie par exemple sur la touche AB54F00F  à l’émission, alors la même trame se retrouve à la broche d'entrée MCU du récepteur comme le montre la figure ci-jointe

Portrait de hercule124

re,

j'ai bien compris , tu utilises l'optocoupleur pour envoyer la trame dans le pic receveur 12f675(au passage ne sont pas du tout obselete). 

donc interruption sur gp0 sur  le pic receveur qui calcul ensuite la trame .

dans ton code tu veux visualiser avec des leds les  4 canaux. 

        if(adresse==0xAB54F00F){canal4 = ~canal4; delay_ms(200);}  //

        if(adresse==0xAB54E01F){canal3 = ~canal3; delay_ms(200);}   //

        if(adresse==0xAB54D02F){canal2 = ~canal2; delay_ms(200);}    //

        if(adresse==0xAB54C03F){canal1 = ~canal1; delay_ms(200);}     

a quoi sert la diode D5 ?

Portrait de KNSFL

je l'ai utilisé juste pour me rassurer que la trame soit présente sans utiliser la caméra lors des tests car je n'ai pas un oscilloscope à porté 

Portrait de hercule124

bonjour,

        if ( (TH < 9500 && TH > 8500) && (TB < 5000 && TH > 4000) )   /*si la durée état haut

        comprise entre 8,5mS et 9,5ms  ainsi que la durée etat bas comprise entre 4mS et 5mS */

      il y'a une erreur   if ( (TH < 9500 && TH > 8500) && (TB < 5000 && TH > 4000) ) 

    ca doit  être if ( (TH < 9500 && TH > 8500) && (TB < 5000 && TB > 4000) )  

je connais pas trop le C mais une variable de 32 bit avec le pic 16f675 ?

unsigned long int adresse;    //declaration Variables globales; 32bits

Portrait de KNSFL

int avec Mikroc fait 16bits uniquement

si tu jetes un coup d'œil sur la variable adresse de l'émetteur le constat sera celui long int adresse et cela a tout de même fonctionné 

Portrait de KNSFL

c'est noté

  int avec Mikroc fait 16bits uniquement

si tu jetes un coup d'œil sur la variable adresse de l'émetteur le constat sera celui long int adresse et cela a tout de même fonctionné 

Portrait de hercule124

re ,

pourquoi tu repetes 2 fois la fin de l'incrementation de i .

                      calculTB();

                     }

                  if ( (TH < 700 && TH > 400) && (TB < 700 && TB > 400) )

                     {

                      adresse &= 0x7FFFFFFF >> (32 - i);     /*ecrire "0" au bit

                       correspondant de la varible adresse*/

                     }

                  else if ( (TH < 700 && TH > 400) && (TB < 2000 && TB > 1100) )

                     {

                      adresse &= 0x80000000 >> (32 - i);    /*ecrire "1" au bit

                       correspondant de la variable adresse*/

                     }

                  else i = 32;     fin de l'incremetation de i si i =32

                 }  //end of 32 bits scan

           } //fin condition sur le bit Start

           else i = 32; et encore la meme chose ? 

i est la meme variable pour les 2 conditions.

Portrait de KNSFL

bonjour, je n'est pas répété l’incrémentation

si la première condition est vrai alors écrire 0 

sinon  (on ignore l'écriture de 0) si la deuxieme est vraie alors écrire plutot 1

sinon (ni la première ni la seconde est vérifiée)  arrêter le décodage de la trame

le dernier sinon  (temps non compris entre 9ms haut + 4.5ms bas) 

sauf si je m'y prend mal!!!

Portrait de Walter

la taille d'un int en C, doit correspondre à la taille du bus de ton processeur, du coup normalement cela devrait plutôt être 8bits.
C'est étonnant que là cela soit 16bits.
D'ailleurs tu utilise un 12F(indiqué dans ton code) ou un 16F(indiqué en titre)?

Ok, je pense enfin avoir compris, je ne suis pas un rapide :)
Donc dans tes tests comme tu passe par un optocoupleur, tu ne t'occupes pas de la porteuse à 38KHz?

As tu testé ton opto-coupleur en dehors de tout envois de message?
Si tu active la LED de l'opto-coupleur, ta broche GP0 passe telle à l'état haut? 

Je suis très étonné que tu utilise des macros différentes pour tes broches entre tes deux µC(B0 et F0).
en miKroC tu n'a pas besoin d'inclure les en-têtes dédié à ton µC?

Pourquoi les PIC serait obsolète, leur performance n'ont rien à envié à ceux d'Atmel, qui en plus maintenant fait partie de Microship.
@Louis si tu veux apprendre les bases des différents protocoles et même comprendre ce que tu manipule, il est préférable de mettre les mains dans le camboui non?

Portrait de KNSFL

j'utilise un 12F675 précisément

oui le signal est bien présent sur le bit 0 du port GPIO du MCU décodeur 

les deux macros sont reconnus par Mikroc avec d'autres MCU pic il y a deux autre possibilité d'appeller le bit d'un PORT : (LAT... SBIT...)

jusqu’à présent je n'ai pas compris la notion de int pour les MCU et la longueur du bus de données puis-je avoir la documentation traitant le sujet?

Portrait de Walter

Je ne connais pas de documentation dédié au µC, mais tu une description général assez intéressante.

Après cela ne change pas grand chose qu'il faille 1, 2 ou 4 cycles d'horloge pour traiter ta donnée.
A partir du moment que tu connais la taille de tes variables et si cela est approprié à tes besoin.

La seul chose à retenir c'est qu'un la taille d'un int, peut changer.

Portrait de Walter

Du coup si ton signal est bien présent sur la broches d'entrée, quel est ton soucis?

Portrait de KNSFL

bonjour et désolé pour le long silence j'avais un petit soucis avec mon pc

Mon gros soucis est que je ne parviens pas à décoder la trame qui arrive à la broche GP0 du MCU récepteur.

Portrait de Walter

Ok, du coup reçois les données mais cela ne correspond pas à ce que tu t'attends.
A mon avis le mieux, serait que tu modifie ton programme, pour savoir ce que tu reçois exactement.

Un truc du genre à chaque changement de valeur de INPUT, tu écris la valeur et le temps de présence.