Trame RC5

Embed Size (px)

Citation preview

Trame RC5

PrsentationCet 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 RC5Le 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 codeNous 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