Exemple de réalisation d'une petite télécommande à 2 boutons

telecommande

La première étape pour créer une liaison est de prévenir le récepteur que celui-ci va recevoir quelque chose. Pour cela, on lance un signal 1 d'un peu plus de1280µs, le temps que nous avons choisi a été pris à l'œil, car ça fonctionnait bien. Pour envoyer un signal pareil, il faut faire osciller la sortie du Pic connectée à la led infrarouge à la fréquence du récepteur, dans notre cas nous devront faire osciller à 36khz, car le TSOP utilisé est sensible à cette fréquence. Pour osciller nous allons simplement allumer puis éteindre la broche du Pic pendant un certain temps, ce temps est facilement calculable, vu que la fréquence à générer doit être de 36000Hz, la période d'oscillation doit donc être de 1/f = 27µs, donc la led doit rester allumée 14µs et rester coupée 13µs. Vu qu'un cycle de Pic cadencé à 4mhz s'effectue en 1µs. Nous pouvons générer le code suivant :

send1280 ; envoie un peu plus long que 1280µs
movlw h'35' ; On va repeter 53 fois la boucle
movwf compteur
goto bouclesend
bouclesend
bsf PORTA, 0;
nop
nop ; 3 µs
nop ; 4 µs
nop ; 5 µs
nop ; 6 µs
nop ; 7 µs
nop ; 8 µs
nop ; 9 µs
nop ; 10 µs
nop ; 11 µs
nop ; 12 µs
nop ; 13 µs
nop
bcf PORTA, 0;
nop ; 2 µs
nop ; 3 µs
nop ; 4 µs
nop ; 5 µs
nop ; 6 µs
nop
nop
nop
nop
nop
decfsz compteur,F
goto bouclesend
return

Les instructions nop, bcf et bsf prennent 1 cycle, donc 1µs, l'instruction goto utilise deux cycles, donc 2µs.

Lors de l'appel de la fonction send1280, nous plaçons la variable compteur à 53 (35 en hexadécimal), c'est le nombre de fois que nous allons répéter la période d'oscillation. 53 * 27µs > 1280µs donc c'est bon.

Une fois le signal émis, nous allons regardé le premier bit à envoyé, si celui-ci est égal à 1 alors la télécommande ne va rien envoyer pendant 640µs puis envoyer un signal pendant 640µs. Si le bit est à 0, la télécommande ne va rien envoyer pendant 1280µs. Ensuite nous enverrons de nouveau un signal pendant 640µs pour indiquer que le bit est envoyé et que l'on va envoyer un nouveau (ce qui permet en cas de légère défaillance temporel que le récepteur soit toujours synchronisé avec l'émetteur). Pour ensuite lire le bit suivant et recommencer jusqu'à ce que les 8 bits soient envoyés

main
movlw h'08';
movwf boucle
movlw h'09'
movwf INTCON
sleep ; on plonge le pic dans le sommeil pour economiser les battries

go
movf PORTB, w; on sauvegarde l'état du registre B (servira plus tard)
movwf tjrs;
btfss PORTB, 7 ; quel bouton a été pressé
goto tx1;
btfss PORTB,4
goto tx2;
goto main; si aucun des deux boutons, ça doit être une erreur

tx2
movlw h'11'; on place h'11' comme clé, voir la liste des clé pour comprendre
movwf cle
goto tx

tx1
movlw h'01';
movwf cle

boucletx
btfsc cle, 7
goto send1
call pause1280 ; envoie rien pendant 1280 cad qu'on envoie un 0
goto endtx
send1:
call pause640; envoie rien pendant 640 cad qu'on envoie un 1
call send640; envoie pendant 640µs des données
endtx:
rlf cle, 1
call send640; on envoie des données pendant 640µs afin d'indiquer qu'un prochain bit va être envoyé
decfsz boucle, 1
goto boucletx; boucle pour envoyer les 8 bits
call pause40000; on attend 40 ms
movf tjrs,0 ; on regarde l'état du PORTB par rapport à l'état initial
subwf PORTB,w
btfsc STATUS,Z
goto go ; la touche est toujours pressée, on réenvoie une trame
goto main

pause1280 ; pause de 1280µsec exactement
movlw h'FF';
movwf compteur;
call pause;
return

pause640 ; pause de 640 µsec exactement
movlw h'7C';
movwf compteur;
call pause;
return

pause ; boucle de 5µsec
nop
nop
decfsz compteur,F
goto pause
return

pause40000: ; pause de 40ms, cad le temps de recevoir 2 fois les informations afin d'être sur de pas se tromper
movlw h'c8'
movwf compteur ; premiere variable
movlw h'32'
movwf compteur2
pausebcl:
nop
decfsz compteur, 1
goto pausebcl
movlw h'c8'
movwf compteur ; premiere variable
decfsz compteur2, 1
goto pausebcl
return

La liste des codes

tablecode

Schéma du fonctionnement

schemaemet

Le code source est disponible dans les téléchargements