Vous êtes sur la page 1sur 7

Trame RC5

Prsentation
Cet article dcrit une faon de gnrer une trame de type RC5 (tlcommande infrarouge pour TV ou magntosope) avec le gnrateur EasyHDL inclus dans Isis. Pour tester le code RC5 gnr, un schma sous Isis est propos, qui met en oeuvre un PIC 16F628A dont le logiciel (dvelopp avec MikroPascal) dcode la trame RC5, affiche le code reu sur un afficheur LCD et active des sorties en fonction des commandes reues. Je me suis bas sur cette tude pour le dveloppement de mon rcepteur / afficheur de codes RC5 / RC6 et de ma tlcommande 004.

Vue gnrale du codage RC5


Le prsent 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 frquence). Disons tout de mme pour rsumer, qu' un niveau logique bas (0 V) correspond une modulation du faisceau IR pendant une dure de 889 us, suivi d'une absence de modulation (repos) pendant un mme laps de temps. Et qu' un niveau logique haut (+5 V par exemple) correspond une absence de rayonnement IR pendant une dure de 889 us, suivi d'une modulation du faisceau pendant ce mme laps de temps.

Echelle 36 KHz volontairement non respecte Si on regarde a de loin, on dispose d'une suite de trains d'impulsions, dont l'espacement entre activit et repos dpend des bits transmis.

Trame avec adresse = $05 et commande = $35 La trame RC5 est compose de 14 bits :

- 2 bits de start toujours positionns 1 (un seul bit Start pour le code RC5 tendu) - 1 bit de "bascule" (toggle) qui change d'tat quand une touche est relache puis presse de nouveau (dtection appui continu) - 5 bits pour le numro d'adresse systme - 6 bits pour le numro de commande (7 bits pour le code RC5 tendu) Dtails des numros d'adresse systme et numros de commande la page Tlcommandes - IR - Codes RC5.

Exemple de code
Nous allons voir comment crer une trame de donne de type RC5, en vue de faciliter la simulation de son dcodage. Cette trame est constitue d'un "entte" de deux bits positionns un (Start) et de un bit positionn 0 (bit bascule). Viennent ensuite cinq bits pour le numro d'adresse et six bits pour le type de commande excuter. Il existe bien sr la solution simple qui consiste spcifier chaque changement de bit un par un (c'est ce que je faisais au dbut), comme le montre l'ide de code suivante (code incomplet) :
// RC5 "simple" code generator // header, bits #1 SENDBIT1 SENDBIT1 // toggle bit, bit SENDBIT0 // address, bit #4 SENDBIT0 SENDBIT0 SENDBIT1 SENDBIT0 SENDBIT1 // command, bit #9 SENDBIT1 SENDBIT1 SENDBIT0 SENDBIT1 SENDBIT0 SENDBIT1 and #2 #3 to bit #8

to bit #14

Mais j'ai trouv cette faon de faire trop lourde et trop consommatrice de temps quand il s'agissait de valider la transmission de nombreuses adresses et codes commande diffrents. J'ai donc crit quelques lignes de code permettant d'extraire les bits requis partir de valeurs hexa standard (8 bits). Seuls le dbut et la fin de la trame - qui ne changent pas - sont cods en dur. Le code fourni en exemple ci-aprs 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 dfinit ici les donnes envoyer, grce au mot-cl DATA, suivi des octets envoyer (mme si ces derniers ne sont pas utiliss en entier, comme on le verra plus loin). Comme les donnes envoyer sont des valeur hexadcimale codes sur 8 bits, on crit les donnes 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 aprs l'autre et sans dlai entre chaque. Dans le cas prsent, le dbut de la trame RC5 est compos de 3 bits dont l'tat est toujours le mme (1-1-0) , il n'y a pas besoin de les dfinir ce niveau et ils seront cods en dur un peu plus loin. Ici, seules les valeurs Adresse (ici $05) et Commande (ici $35) doivent tre renseignes. Vous voyez tout de suite qu'en procdant de la sorte, modifier les valeurs d'adresse ou de commande est trs simple.

2 - Define IR speed
On dfinit ici la constante de type FLOAT qui prendra la valeur temporelle sparant chaque bit de la trame transmettre, et qui dpend de la vitesse de transmission de la trame RC5 simuler. Ici, la priode de temps qui spare chaque bit est de 1.778 ms, ce qui correspond 64 priodes de la porteuse 36 KHz.

3 - Declare working variables


Sont dfinies ici l'ensemble des variables qui sont utilises par la suite.

4 - Top level
Indique l'endroit partir duquel le gnrateur de signal commence rellement "mettre" ses donnes.

5 - Read Data to send


Ici, une boucle lit chaque ligne de donnes spcifie au tout dbut grce au mot-cl DATA. Ainsi, lors de la premire passe de la boucle, le contenu de la premire donne de la ligne DATA est lu, et est plac dans une variable grce au mot-cl READ. La premire ligne DATA, qui contient en tout deux valeurs traiter : DATA 0x05,0x35 est donc lue en deux tapes successives, grce la ligne READ d qui constate la prsence de deux valeurs diffrentes grce la prsence des virgules qui les sparent. La premire valeur "0x05" est place dans la variable d, puis la sous-routine OUTDATA est excute pour travailler avec cette valeur prcise. Une fois le traitement effectu avec cette valeur, la seconde valeur "0x35" est place dans la variable d, puis la sous-routine OUTDATA est de nouveau excute pour travailler avec cette nouvelle valeur. La variable i, incrmente chaque tour de boucle, est utilise pour la suite des oprations : si i la valeur 1, la quantit de bits traits dans l'octet sera limit 5 (octet contenant la valeur de l'adresse); si i la valeur 2, la quantit de bits traits dans l'octet sera limit 6 (octet contenant le numro de commande).

6 - Send Data
C'est en quelque sorte ici que tout se joue. Chaque octet trait est dcompos bit bit, et les bits sont transmis la queue-leu-leu, sur une longueur qui dpend 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 rpter cinquante fois la mme chose.

Exemple d'application dans Proteus / Isis


Le code prcdent a t test dans le circuit Proteus / Isis dont le schma et le source suivent.

L'afficheur LCD, sur sa deuxime ligne, indique - en dcimal - la valeur du bit Toggle (0 sur le schma prcdent), le numro d'adresse (5 sur le schma prcdent) et le numro de commande (54). Remarques - Les donnes arrivant sur l'entre RB0 du PIC sont en logique "inverse" : au repos, la ligne est l'tat logique haut. - Le schma intgre 4 gnrateurs EasyHDL pour l'mission de 4 trames diffrentes mais il est bien sr possible de gnrer l'ensemble des trames avec un seul gnrateur