Interface - RC5
Commande bits de sortie portB avec télécommande IR RC5 (PHILIPS)
Programme pour PIC 16C84/04P ou 16F84/04P.
Ce programme permet de recevoir le code RC5 d’une télécommande, et d’activer Les bits de sorties du portB, t1=bit0, t2=bit1,t3=bit2, t4=bit3, t5=bit4, t6=bit5, t7=bit6, t8=bit7.
t=touche télécommande.
Variables ram :
code1 0Dh ; code reçu 0,0,rep,A4,A3,A2,A1,A0
code 0Eh ; code reçu 0,0,S5,S4,S3,S2,S1,S0
curseur 0Fh ; stockage de la position
tempo_bit 10h ; variable tempo
tempo 11h ; variable temporaire
marque 12h ; type de code (marque)
bit 0 indique si créneaux ,0 = créneaux, 1 pas de créneaux
bit 1 drapeau code lecture, 0 = mise en mémoire dans code1 ;1 dans code
bit 2 si=1 comptage trame RC5 ok, si = 0 erreur
RA4 entrée infrarouge, RB0 sortie
Initialisation des ports
0000 2806 goto 0006
0006 1683 bsf STATUS,RP0 Passage au banc mémoire 1
0007 3010 movlw B 10000
0008 0085 movwf TRISA Tous les bits du port A en sortie (sauf RA4)
0009 3000 moflw A 00000000 port B sortie
000A 0086 movwf TRISB
000B 1283 bsf STATUS,RP0 Retour au banc mémoire 0
000C 0000 nop
Initialisation des variables
MAIN
000D 018E clrf code on initialise le code à 0 (0E)
000E 018D clrf code1 (0D)
000F 0000 nop
0010 0192 clrf marque 0011 30FF movlw H'FF' 177ms 0012 20A1 call tempo 00A1 001A 2075 call CODE_RC5 0075 RA4 est à 0, on démarre
001B 1D12 btfss test bit 2 marque si=1 comptage ok saut
001C 280D goto 000D
Traitement des registres code1 et code envoi en sortie port B et A
001D 3001 movlw charge W avec le code touche 1 “1”
001E 020E subwf soustrait touche 1 de 0E résultat dans W
001F 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
0020 2844 goto 0044
0021 3002 movlw charge W avec le code touche 2 “10”
0022 020E subwf soustrait touche 1 de 0E résultat dans W
0023 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
0024 284A goto 004A
0025 3003 movlw charge W avec le code touche 3 “11”
0026 020E subwf soustrait touche 1 de 0E résultat dans W
0027 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
0028 2850 goto 0050
0029 3004 movlw charge W avec le code touche 4 “100”
002A 020E subwf soustrait touche 1 de 0E résultat dans W
002B 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
002C 2856_ goto 0056__
002D 3005 movlw charge W avec le code touche 5 “101”
002E 020E subwf soustrait touche 1 de 0E résultat dans W
002F 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
0030 285C goto 005C
0031 3006 movlw charge W avec le code touche 6 “110”
0032 020E subwf soustrait touche 1 de 0E résultat dans W
0033 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
0034 2862 goto 0062
0035 3007 movlw charge W avec le code touche 7 “111”
0036 020E subwf soustrait touche 1 de 0E résultat dans W
0037 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
0038 2868 goto 0068
0039 3008 movlw chage W avec le code de la touche 8 ‘1000’
003A 020E subwf soustrait touche 2 de 0E résultat dans W
003B 1903 btfsc teste bit 2 saut si=0 (Z status 1 résultat nul)
003C 283E goto 003E
003D 280D goto 000D
003E 1F86 btfss teste bit 7 port B 06 si=1 saut
003F 2842 goto 0042
0040 1386 bcf mise a 0 bit 7 port B
0041 280D goto 000D
0042 1786 bsf mise a 1 bit 7 port B
0043 280D goto 000D
0044 1C06 btfss teste bit 0 port B 06 si=1 saut
0045 2848 goto 0048
0046 1006 bcf mise a 0 bit 0 port B
0047 280D goto 000D
0048 1406 bsf mise a 1 bit 0 port B
0049 280D goto 000D
004A 1C86 btfss teste bit 1 port B 06 si=1 saut
004B 284E goto 004E
004C 1086 bcf mise a 0 bit 1 port B
004D 280D goto 000D
004E 1486 bsf mise a 1 bit 1 port B
004F 280D goto 000D
0050 1D06 btfss teste bit 2 port B 06 si=1 saut
0051 2854 goto 054
0052 1106 bcf mise a 0 bit 2 port B
0053 280D goto 000D
0054 1506 bsf mise a 1 bit 2 port B
0055 280D goto 000D
0056 1D86 btfss teste bit 3 port B 06 si=1 saut
0057 285A goto 005A
0058 1186 bcf mise a 0 bit 3 port B
0059 280D goto 000D
005A 1586 bsf mise a 1 bit 3 port B
005B 280D goto 000D
005C 1E06 btfss teste bit 4 port B 06 si=1 saut
005D 2860 goto 0060
005E 1206 bcf mise a 0 bit 4 port B
005F 280D goto 000D
0060 1606 bsf mise a 1 bit 4 port B
0061 280D goto 000D
0062 1E86 btfss teste bit 5 port B 06 si=1 saut
0063 2866 goto 0066
0064 1286 bcf mise a 0 bit 5 port B
0065 280D goto 000D
0066 1686 bsf mise a 1 bit 5 port B
0067 280D goto 000D
0068 1F06 btfss teste bit 6 port B 06 si=1 saut
0069 286C goto 006C
006A 1306 bcf mise a 0 bit 6 port B
006B 280D goto 000D
006C 1706 bsf mise a 1 bit 6 port B
006D 280D goto 000D
sous programme : traitement réception code télécommande RC5
CODE_RC5
0075 3007 movlw D'7' on a 7 bits à lire code1 (trame RC5)
0076 008F movwf curseur curseur sert à se positionner dans la trame (0F)
0077 1A05 btfsc PORT_A,4 RA4 est-il actif (à 0) non,1 on boucle
0078 2877 goto 0077 ;RA4 est à 0, on démarre
0079 3001 movlw 01
007A 0091 movwf (11)
007B 30A6 movlw A6h 166*3 500

s
007C 20A3 call tempo 00A3 500

s
ATTENTE_TIMER
007D 1412 bsf marque mise à 1 bit 0
007E 20B0 call TIMER
007F 1C12 btfss marque test bit0 si=1 saut; y a-t'il eu créneau ? 0 créneau
0080 2882 goto EXTRACT 0082 1 pas de créneau
0081 0008 return non alors il y a eu erreur
EXTRACT
0082 1403 bsf c mise à 1 bit 0(carry) registre 03; eh non, c'est un "1"
0083 1A05 btfsc PORT_A,4 vérification
0084 1003 bcf c raz bit 0(carry )registre status 03; on présume un "0"
0085 0D8E rlf code,F (0E) on enregistre le bit dans le code (LSB)
0086 0B8F decfsz curseur,F (0F) on a tous les bits ? si oui saut
0087 287D goto 007D non, alors on boucle
0088 1892 btfsc marque test bit 1, si=0 saut lecture code drapeau
0089 2891 goto
008A 3006 movlw 06 lecture bit s0 à s5
008B 008F movwf curseur
008C 080E movf code,W déplace le contenu code dans W (d=0) (0E)
008D 008D movwf code1 place le contenu de w dans code1 (0D)
008E 1492 bsf mise à 1, bit 1 marque, afin de ne plus compter les bits
008F 018E clrf code
0090 287D goto 007D
0091 1512 bsf mise à 1 bit 2 marque indique comptage ok
0092 0008 return code 1 :0,0,REP,A4,A3,A2,A1,A0 ; code : 0,0,S5,S4,S3,S2,S1,S0
TEMPO_BIT
00A0 3002 movlw 02
00A1 0091 movwf tempo (11)
00A2 3087 movlw 87h = 135d
00A3 0090 movwf tempo_bit (10)
00A4 0B90 decfsz tempo_bit (10)
00A5 28A4 goto 00A4
00A6 0B91 decfsz tempo (11)
00A7 28A2 goto 00A2
00A8 0008 return
Sous programme :configuration Timer
TIMER
00B0 3003 movlw 03
00B1 0091 movwf tempo (11)
00B2 3076 movlw 76h = 118d 118*3*5

s = 1770

s
00B3 0090 movwf tempo_bit (10)
00B4 1E05 btfss port A-4 si=0 saut on vérifie qu'il y a un créneau
00B5 1012 bcf bit 0 marque si oui marque =0
00B6 0B90 decfsz tempo_bit (10)
00B7 28B4 goto 00A4
00B8 0B91 decfsz tempo (11)
00B9 28B2 goto 00A2
00BA 0008 return