Dernière mise à jour :
15/10/2009
English
version
Présentation
Cet article décrit une façon de générer une
trame de type RC5 (télécommande infrarouge pour TV ou
magnétosope) avec le générateur EasyHDL
inclus dans
Isis. Pour tester le code RC5 généré, un schéma sous Isis est proposé,
qui met en oeuvre un PIC 16F628A dont le logiciel (développé avec
MikroPascal) décode la trame RC5, affiche le code reçu sur un afficheur
LCD et active des sorties en fonction des commandes reçues. Je me suis basé sur cette étude pour le développement de mon
récepteur / afficheur de codes RC5 / RC6 et de ma
télécommande 004.
Vue générale du codage RC5
Le
présent article concerne la production d'une trame RC5 au niveau
logique (bande de base), il n'aborde pas la question de la modulation
bi-phase (codage Manchester) du faisceau infrarouge (à 36 KHz ou autre
fréquence). Disons tout de même pour résumer, qu'à un niveau logique
bas (0 V) correspond une modulation du faisceau IR pendant une durée de
889 us, suivi d'une absence de modulation (repos) pendant un même laps de
temps. Et qu'à un niveau logique haut (+5 V par exemple) correspond une
absence de rayonnement IR pendant une durée de 889 us, suivi d'une
modulation du faisceau pendant ce même laps de temps.
Echelle 36 KHz volontairement non respectéeSi
on regarde ça de loin, on dispose d'une suite de trains d'impulsions,
dont l'espacement entre activité et repos dépend des bits transmis.
Trame avec adresse = $05 et commande = $35
La trame RC5 est composée de 14 bits :
- 2 bits de start toujours positionnés à 1 (un seul bit Start pour le code RC5 étendu)
-
1 bit de "bascule" (toggle) qui change d'état quand une touche
est relachée puis pressée de nouveau (détection
appui continu)
- 5 bits pour le numéro d'adresse système
- 6 bits pour le numéro de commande (7 bits pour le code RC5 étendu)
Détails des numéros d'adresse système et numéros de commande à la page
Télécommandes - IR - Codes RC5.
Exemple de code
Nous
allons voir comment créer une trame de donnée de type
RC5, en vue de faciliter la simulation de son décodage. Cette
trame est constituée d'un "entête" de deux bits
positionnés à un
(Start) et de un bit positionné à 0 (bit bascule).
Viennent ensuite cinq bits pour le
numéro d'adresse et six bits pour le type de commande à
exécuter. Il
existe bien sûr la solution simple qui consiste à
spécifier chaque
changement de bit un par un (c'est ce que je faisais au début),
comme le montre l'idée de code suivante (code incomplet) :
// RC5 "simple" code generator
// header, bits #1 and #2
SENDBIT1
SENDBIT1
// toggle bit, bit #3
SENDBIT0
// address, bit #4 to bit #8
SENDBIT0
SENDBIT0
SENDBIT1
SENDBIT0
SENDBIT1
// command, bit #9 to bit #14
SENDBIT1
SENDBIT1
SENDBIT0
SENDBIT1
SENDBIT0
SENDBIT1
Mais
j'ai trouvé cette façon de faire trop lourde et trop consommatrice de temps quand il
s'agissait de valider la transmission de nombreuses adresses et codes
commande différents. J'ai donc écrit quelques lignes de code permettant
d'extraire les bits requis à partir de valeurs hexa standard (8 bits).
Seuls le début et la fin de la trame - qui ne changent pas - sont codés
en dur. Le code fourni en exemple ci-après envoi une trame dont
l'adresse est $05 et une commande dont le code est $35.
// RC5 code generator
// 1 - Define data to be output
// not include the two start bits
// only include Address and Command values
DATA 0x05,0x35
// 2 - Define IR speed
FLOAT BITTIME=1.778m
FLOAT BITTOGGLE = BITTIME / 2
// 3 - Declare working variables
INT DataOut
INT i,j,d,dTmp
// 4 - Top level
OUT = 0
SLEEP FOR 1000m // start after delay of 1 sec
// send header and toggle now, bits #1 to #3
GOSUB SENDBIT1
GOSUB SENDBIT1
GOSUB SENDBIT0
// address, bit #4 to bit #8
// -> handled in following sub-routine when i=1
// command, bit #9 to bit #14
// -> handled in following sub-routine when i=2
// 5 - Read Data to send
LOOP:
i = i + 1 // i=1 > Address, i=2 > Command
if i > 2 THEN GOSUB THEEND
READ d
GOSUB OUTDATA
GOTO LOOP
// 6 - Send Data
OUTDATA:
// Data bits
FOR j=0 TO 7
// i=1 > Address, read only bits #3 to #7
IF i=1 THEN
IF j < 3 THEN
CONTINUE
ENDIF
ENDIF
// i=2 > Command, read only bits #2 to #7
IF i=2 THEN
IF j < 2 THEN
CONTINUE
ENDIF
ENDIF
IF (d & (1 << 7-j)) THEN
GOSUB SENDBIT1
ELSE
GOSUB SENDBIT0
ENDIF
NEXT j
RETURN
SENDBIT0:
OUT = 1
SLEEP FOR BITTOGGLE
OUT = 0
SLEEP FOR BITTOGGLE
RETURN
SENDBIT1:
OUT = 0
SLEEP FOR BITTOGGLE
OUT = 1
SLEEP FOR BITTOGGLE
RETURN
THEEND:
// end of Tx
OUT = 0
END
1 - Define data to be output
On
définit ici les données à
envoyer, grâce au mot-clé DATA, suivi des octets à envoyer (même si ces
derniers ne sont pas utilisés en entier, comme on le verra plus loin).
Comme
les données à envoyer sont des valeur hexadécimale codées sur 8 bits,
on écrit les données à envoyer octet par octet, avec le suffixe
0x. La ligne suivante
DATA 0x05,0x35
indique
qu'il faut envoyer les deux octets $05 et $35, l'un
après l'autre et sans délai entre chaque.
Dans
le cas présent, le début de la trame RC5 est composé de 3 bits dont
l'état est toujours le même (1-1-0) , il n'y a pas besoin de les
définir à ce niveau et ils seront codés en dur un peu plus loin. Ici,
seules les valeurs Adresse (ici $05) et Commande (ici $35) doivent être
renseignées. Vous voyez tout de suite qu'en procédant de la sorte,
modifier les valeurs d'adresse ou de commande est très simple.
2 - Define IR speed
On
définit ici la constante de type FLOAT qui prendra la valeur temporelle
séparant chaque bit de la trame à transmettre, et qui dépend de la
vitesse de transmission de la trame RC5 à simuler. Ici, la période
de temps qui sépare chaque bit est de 1.778 ms, ce qui correspond
à 64 périodes de la porteuse 36 KHz.
3 - Declare working variables
Sont définies ici l'ensemble des variables qui sont utilisées par la suite.
4 - Top level
Indique
l'endroit à partir duquel le générateur de signal
commence réellement à "émettre" ses données.
5 - Read Data to send
Ici,
une boucle lit chaque ligne de données spécifiée
au tout début grâce au
mot-clé DATA. Ainsi, lors de la première passe de la
boucle, le contenu
de la première donnée de la ligne DATA est lu, et est placé
dans une variable grâce au mot-clé READ.
La première ligne DATA, qui contient en tout deux valeurs à traiter :
DATA
0x05,
0x35est donc lue en deux étapes successives, grâce à la ligne
READ d
qui
constate la présence de deux valeurs différentes
grâce à la présence des virgules qui les
séparent.
La première valeur "
0x05"
est placée dans la variable d, puis la sous-routine OUTDATA est
exécutée pour travailler avec cette valeur précise. Une fois le
traitement effectué avec cette valeur, la seconde valeur "
0x35"
est placée dans la variable d, puis la sous-routine OUTDATA est
de nouveau exécutée pour travailler avec cette nouvelle valeur. La
variable i, incrémentée à chaque tour de boucle, est utilisée pour la
suite des opérations : si i à la valeur 1, la quantité de bits traités
dans l'octet sera limité à 5 (octet contenant la valeur de l'adresse);
si i à la valeur 2, la quantité de bits traités dans l'octet sera
limité à 6 (octet contenant le numéro de commande).
6 - Send Data
C'est
en quelque sorte ici que tout se joue. Chaque octet traité est
décomposé bit à bit, et les bits sont transmis à la queue-leu-leu, sur
une longueur qui dépend du type d'octet : si octet contenant l'adresse
(i=1), on lit seulement les 5 bits de poids faible; si octet contenant
la commande (i=2), on lit les 6 bits de poids faible.
SENDBIT0 et SENDBIT1
Ce sont les deux sous-routines qui évitent simplement de répéter cinquante fois la même chose.
Exemple d'application dans Proteus / Isis
Le
code précédent a été testé dans le
circuit Proteus / Isis dont le schéma et le source suivent.
L'afficheur
LCD, sur sa deuxième ligne, indique - en décimal - la valeur du bit
Toggle (0 sur le schéma précédent), le numéro d'adresse (5 sur le
schéma précédent) et le numéro de commande (54).
Remarques -
Les données arrivant sur l'entrée RB0 du PIC sont en
logique "inversée" : au repos, la ligne est à
l'état logique haut.
-
Le schéma intègre 4 générateurs EasyHDL pour l'émission de 4 trames
différentes mais il est bien sûr possible de générer l'ensemble des
trames avec un seul générateur.
Proteus - EasyHDL - RC5 - Schéma Isis et code logiciel PIC