Professional Documents
Culture Documents
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.
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
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.
4 - Top level
Indique l'endroit partir duquel le gnrateur de signal commence rellement "mettre" ses donnes.
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.
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