TELECOMMANDE INFRAROUGE PIC12F675

KNSFL
sam, 07/30/2022 - 03:25
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!
KNSFL
sam, 07/30/2022 - 03:27
ici le code source de l’émetteur
Walter
sam, 07/30/2022 - 16:32
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
KNSFL
sam, 07/30/2022 - 23:19
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
Louis.D
sam, 07/30/2022 - 17:37
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 !
KNSFL
sam, 07/30/2022 - 23:35
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.
Louis.D
dim, 07/31/2022 - 13:35
Tu peux vérifier avec un smartphone s'il te plait ?
KNSFL
dim, 07/31/2022 - 14:48
oui. mais là taille de la vidéo est au dessus 1Mo je ne peux pas la charger ici
Louis.D
dim, 07/31/2022 - 15:06
Je ne te demande pas la vidéo mais vois tu la Led s'allumer sur la vidéo ?
KNSFL
dim, 07/31/2022 - 15:11
oui la les brille à chaque impulsion
Louis.D
dim, 07/31/2022 - 15:15
ok merci qu'as tu comme matériel de labo ?
As-tu un oscillo ?
KNSFL
dim, 07/31/2022 - 15:18
Alimentation variable, multimètre numérique, plaque a essaie et le matériel de soudure électronique
Louis.D
dim, 07/31/2022 - 15:40
Peux-tu faire un schéma du récepteur ? Et comment modules-tu les impusions avec le 38kHz sur l'émetteur ?
KNSFL
dim, 07/31/2022 - 16:09
Désolé pour le retard et merci pour ta disponibilité Louis.D le schema de simulation dans un premier temps est ci-joint
Louis.D
dim, 07/31/2022 - 16:22
Regarde cette explication de "Electro Bidouilleur" :
https://www.youtube.com/watch?v=z0AC0SvafZY
KNSFL
dim, 07/31/2022 - 17:15
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
Louis.D
dim, 07/31/2022 - 17:52
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.
KNSFL
dim, 07/31/2022 - 18:19
Ce fut un plaisir! Merci
Louis.D
dim, 07/31/2022 - 18:45
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.
KNSFL
dim, 07/31/2022 - 22:11
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.
hercule124
dim, 07/31/2022 - 21:05
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
KNSFL
dim, 07/31/2022 - 22:43
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
hercule124
dim, 07/31/2022 - 23:32
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 ?
KNSFL
lun, 08/01/2022 - 00:03
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é
hercule124
lun, 08/01/2022 - 07:21
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
KNSFL
lun, 08/01/2022 - 07:33
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é
KNSFL
lun, 08/01/2022 - 07:49
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é
hercule124
lun, 08/01/2022 - 09:58
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.
KNSFL
lun, 08/01/2022 - 10:40
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)
Walter
lun, 08/01/2022 - 10:16
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?
KNSFL
lun, 08/01/2022 - 11:08
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...)
Walter
lun, 08/01/2022 - 14:29
Je ne connais pas de documentation dédié au µC, mais là 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.
Walter
lun, 08/01/2022 - 14:31
Du coup si ton signal est bien présent sur la broches d'entrée, quel est ton soucis?
KNSFL
lun, 08/08/2022 - 10:57
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.
Walter
lun, 08/08/2022 - 14:49
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.