Logiciels > Proteus > Générateur EasyHDL > Télécommandes > Code RC5

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.

rc5_modul_36khz_001b 
Echelle 36 KHz volontairement non respectée

Si 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.

rc5_modul_36khz_001a
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,0x35
est 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.

tuto_proteus_easyhdl_rc5_001

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