Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Télécommande IR à 10 canaux
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
Eh oui, j'ai aussi pratiqué l'asm jadis ...
qui est le point de depart indispensable pour tout debutant (ou non) dans le monde des PICs
j'ai rajouté le source asm dans le lien precité
Il faut bien verifier la relation
FOSC MCU et Frequence Porteuse I.R. ( largeur de bit) et type de codage RC5,RC6,SONY...
et le centrage de la bande passante du capteur I.R. utilisé
Dans mon cas un TSOP36 (36Khz), se decline aussi en TSOP38 et TSOP40
Indispensable de decoupler l'alim du TSOP via R)68ohms et 10 à 22µF pour eviter des
phenomenes erratics de détection.
et un outil pratique ..
avec une simple photodiode ou photo transistor conncté sur LPT ( il faut un PC XT Win98 )
Eh oui, j'ai aussi pratiqué l'asm jadis ...
qui est le point de depart indispensable pour tout debutant (ou non) dans le monde des PICs
j'ai rajouté le source asm dans le lien precité
Il faut bien verifier la relation
FOSC MCU et Frequence Porteuse I.R. ( largeur de bit) et type de codage RC5,RC6,SONY...
et le centrage de la bande passante du capteur I.R. utilisé
Dans mon cas un TSOP36 (36Khz), se decline aussi en TSOP38 et TSOP40
Indispensable de decoupler l'alim du TSOP via R)68ohms et 10 à 22µF pour eviter des
phenomenes erratics de détection.
et un outil pratique ..
avec une simple photodiode ou photo transistor conncté sur LPT ( il faut un PC XT Win98 )
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Télécommande IR à 10 canaux
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour paulfjujo et bonjour tout le monde,
Merci d'être intervenu dans cette discussion, temps-x m'avait déjà fourni vos liens mais entre temps j'étais parti explorer un autre montage que j'ai d'ailleurs pas fini de câbler et qui semble se rapprocher du votre puisqu'il utilise aussi un afficheur.
ça me sera facile de passer d'un montage à l'autre étant donné qu'ils utilisent les mêmes composants.
Là avec les fêtes ça va être compliqué de consacrer du tps au projet mais j'y reviendrait très prochainement.
Bonnes fêtes à tous
Merci d'être intervenu dans cette discussion, temps-x m'avait déjà fourni vos liens mais entre temps j'étais parti explorer un autre montage que j'ai d'ailleurs pas fini de câbler et qui semble se rapprocher du votre puisqu'il utilise aussi un afficheur.
ça me sera facile de passer d'un montage à l'autre étant donné qu'ils utilisent les mêmes composants.
Là avec les fêtes ça va être compliqué de consacrer du tps au projet mais j'y reviendrait très prochainement.
Bonnes fêtes à tous
Télécommande IR à 10 canaux
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour à tous,
J’espère que vous avez tous passé un excellent réveillon et que le Père Noël vous a apporté plein d’idée fantaspic. Pour ma part, n’ayant pas trop droit aux bonnes choses en raison de mes soucis santé, je me suis résigné au mode eau minérale et repas maigre, J'ai appris à ces veilles de fêtes que j'avais un cancer assez lourd
Malgré ça, pour libérer mes pensées, J’ai quand même bossé un max sur mon projet de télécommande dont j'étais parti sur le maquettage. Aujourd’hui je l'ai fini à force de soudure et d’asm.
28645-1033308-16f628-84-decodeur-rc5-lcd-et-6-sorties.zip
Après avoir passé des heures à modifier ce programme, il répond enfin à ce que je recherchais avec en plus la possibilité de recycler une vieille télécommande RC5 pour l’usage provisoire car je compte bien réaliser la partie émetteur.
Dans le programme d’origine, les sorties restent actives tant que la touche « power » n’est pas appuyée, j’ai été obligé de le modifier pour que les sorties soit en mode impulsion.
Le but étant bien sûr de simuler ce que je ferai avec les boutons poussoir situé juste sous l’afficheur. Voir mon projet « LCD origine inconnu » pour bien comprendre le contexte.
Pour commencer, j’ai viré la partie affichage pour ne conserver que les sorties RB0 à RB5 et surtout pour libérer des sorties dont j’ai besoin pour mes 2 potentiomètres .
C’est donc 4 touches supplémentaires pour piloter mes 2 potentiomètres de volume et 5 touches pour les cdes de l’afficheur dont j’ai besoin. En validant les touches numériques 6,7 et 8 j’ai donc bien le nbre qu’il me faut.
Il aurait été plus judicieux de ma part de me servir des touches 16 à 20 dédiés aux cdes de volumes et contraste pour piloter les pot. mais la télécommande que j'utiliser pour ma maquette ne dispose pas de ces touches.
Lorsque je réaliserai la télécommande, je ferai en sorte d'utiliser les bonnes touches. Ayant compris le programme il m’est à présent facile de le modifier voir même d’utiliser un PIC 876 pour profiter de X sorties.
Ces modifs dans le prg, j’aimerai que quelqu’un puisse vérifier ma routine « fini2 » pour m’expliquer pourquoi je suis obligé de temporiser 2X . J’ai un doute sur cette boucle et j’ai réalisé cette méthode sans trop comprendre ce que j’ai fait.
Si qq’un pouvait m’expliquer son fonctionnement ?
Le movlw 0X0C OK
Movwf RC5_DATA OK aussi
Mais mon bricolage derrière avec l’appel de la tempo avant et après les clrf alors que physiquement les leds réagissent comme si il y avait qu’une seule tempo ????
Merci à paulfjujo pour son outil sur le protocole RC5, c’est ce qui m’a permis de comprendre un peu mieux le principe et surtout de repérer les directives RC5 dans le programme. Sans ça, il m’était difficile de mettre mes sorties actuelles en mode impulsion et de rajouter des sorties.
J’ai bien pensé à découpler l’alim du TSOP c’est vrai que c’est indispensable. Par contre j’aurai intérêt à bien blinder le montage car pas très loin j’ai l’alim HT à 1200V!
Merci à tous
Le programme modifié par mes soins
Le programme d'origine
J’espère que vous avez tous passé un excellent réveillon et que le Père Noël vous a apporté plein d’idée fantaspic. Pour ma part, n’ayant pas trop droit aux bonnes choses en raison de mes soucis santé, je me suis résigné au mode eau minérale et repas maigre, J'ai appris à ces veilles de fêtes que j'avais un cancer assez lourd
Malgré ça, pour libérer mes pensées, J’ai quand même bossé un max sur mon projet de télécommande dont j'étais parti sur le maquettage. Aujourd’hui je l'ai fini à force de soudure et d’asm.
28645-1033308-16f628-84-decodeur-rc5-lcd-et-6-sorties.zip
Après avoir passé des heures à modifier ce programme, il répond enfin à ce que je recherchais avec en plus la possibilité de recycler une vieille télécommande RC5 pour l’usage provisoire car je compte bien réaliser la partie émetteur.
Dans le programme d’origine, les sorties restent actives tant que la touche « power » n’est pas appuyée, j’ai été obligé de le modifier pour que les sorties soit en mode impulsion.
Le but étant bien sûr de simuler ce que je ferai avec les boutons poussoir situé juste sous l’afficheur. Voir mon projet « LCD origine inconnu » pour bien comprendre le contexte.
Pour commencer, j’ai viré la partie affichage pour ne conserver que les sorties RB0 à RB5 et surtout pour libérer des sorties dont j’ai besoin pour mes 2 potentiomètres .
C’est donc 4 touches supplémentaires pour piloter mes 2 potentiomètres de volume et 5 touches pour les cdes de l’afficheur dont j’ai besoin. En validant les touches numériques 6,7 et 8 j’ai donc bien le nbre qu’il me faut.
Il aurait été plus judicieux de ma part de me servir des touches 16 à 20 dédiés aux cdes de volumes et contraste pour piloter les pot. mais la télécommande que j'utiliser pour ma maquette ne dispose pas de ces touches.
Lorsque je réaliserai la télécommande, je ferai en sorte d'utiliser les bonnes touches. Ayant compris le programme il m’est à présent facile de le modifier voir même d’utiliser un PIC 876 pour profiter de X sorties.
Ces modifs dans le prg, j’aimerai que quelqu’un puisse vérifier ma routine « fini2 » pour m’expliquer pourquoi je suis obligé de temporiser 2X . J’ai un doute sur cette boucle et j’ai réalisé cette méthode sans trop comprendre ce que j’ai fait.
Si qq’un pouvait m’expliquer son fonctionnement ?
Le movlw 0X0C OK
Movwf RC5_DATA OK aussi
Mais mon bricolage derrière avec l’appel de la tempo avant et après les clrf alors que physiquement les leds réagissent comme si il y avait qu’une seule tempo ????
Merci à paulfjujo pour son outil sur le protocole RC5, c’est ce qui m’a permis de comprendre un peu mieux le principe et surtout de repérer les directives RC5 dans le programme. Sans ça, il m’était difficile de mettre mes sorties actuelles en mode impulsion et de rajouter des sorties.
J’ai bien pensé à découpler l’alim du TSOP c’est vrai que c’est indispensable. Par contre j’aurai intérêt à bien blinder le montage car pas très loin j’ai l’alim HT à 1200V!
Merci à tous
Le programme modifié par mes soins
Code : Tout sélectionner
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
; PIC 16F84
; Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
; ryl le 06/01/2005 23:46
;
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
LIST p=16f84
#include <p16f84.inc>
__config B'11111111110001'
ERRORLEVEL -224
cblock 0x0C
donn1 : 1 ; reception des bits RC5
donn2 : 1 ; reception des bits RC5
BUSY_1: 1 ;var utilisée pour temporisation
NB_TEMPO: 1 ;var utilisée pour temporisation
cmpt1: 1 ;var utilisée pour temporisation
RC5_CTRL: 1 ;var bit controle RC5
RC5_ADR: 1 ;var bits adresse RC5
RC5_DATA: 1 ;var bits données RC5
Loop1: 1 ;compteur
Loop2: 1
Loop3: 1
Retard1: 1
Retard2: 1
ROM_INDEX: 1 ;pointeur ROM tables des mots ( "sortie RB", "sorties a ZERO", "Pas de RC5......" ) ;
endc
;==========================================================================================================
ORG 0x0000
bsf STATUS ,RP0 ;Select Bank 1
clrf TRISA ;
MOVLW B'01000000' ;portb.6 en entrée
MOVWF TRISB
bcf STATUS ,RP0 ;Select Bank 0
bcf INTCON, GIE ; disable Interupt
debut
call tempox
boucl_prog
call Recv_RC5 ; Récéption d'un code RC5
movfw RC5_DATA ; si RC5_DATA =0 (touche N°0 de la TC)
btfsc STATUS,Z ;
goto Action_1 ;
xorlw (0x01 ^ 0x00) ; si RC5_DATA =1 (touche N°1 de la TC)
btfsc STATUS,Z ;
goto Action_2 ;
xorlw (0x02 ^ 0x01) ; si RC5_DATA =2 (touche N°2 de la TC)
btfsc STATUS,Z
goto Action_3 ;
xorlw (0x03 ^ 0x02) ; si RC5_DATA =4 (touche N°4 de la TC)
btfsc STATUS,Z
goto Action_4 ;
xorlw (0x04 ^ 0x03) ; si RC5_DATA =5 (touche N°5 de la TC)
btfsc STATUS,Z
goto Action_5 ;
xorlw (0x05 ^ 0x04) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_6 ;
xorlw (0x06 ^ 0x05) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_7 ;
xorlw (0x07 ^ 0x06) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_8 ;
xorlw (0x08 ^ 0x07) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_9 ;
xorlw (0x0C ^ 0x05) ; si RC5_DATA =h0C (touche ON/OFF de la TC)
btfsc STATUS,Z
goto Action_10 ;
goto fini ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Action_1
bsf PORTB,0 ; mettre a 1 la broche RB0 (led n°1)
goto LCD_refr ;
Action_2
bsf PORTB,1 ; mettre a 1 la broche RB1 (led n°2)
goto LCD_refr
Action_3
bsf PORTB,2 ; mettre a 1 la broche RB2 (led n°3)
goto LCD_refr ;
Action_4
bsf PORTB,3 ; mettre a 1 la broche RB3 (led n°4)
goto LCD_refr ;
Action_5
bsf PORTB,4 ; mettre a 1 la broche RB4 (led n°5)
goto LCD_refr ;
Action_6
bsf PORTB,5 ; mettre a 1 la broche RB5 (led n°6)
goto LCD_refr ;
Action_7
bsf PORTA,0 ; mettre a 1 la broche RA0 (led n°7)
goto LCD_refr
Action_8
bsf PORTA,1 ; mettre a 1 la broche RA0 (led n°7)
goto LCD_refr
Action_9
bsf PORTA,2 ; mettre a 1 la broche RA0 (led n°7)
goto LCD_refr
LCD_refr
goto fini2
Action_10
clrf PORTB ; mise a 0 de toutes les sorties
fini
call tempox ; tempo entre chaque detection/affichage
call tempox ;
goto boucl_prog ; recommencer la detection RC5+LCD
fini2
movlw 0x0C
movwf RC5_DATA
call Tempo3 ;
clrf PORTB
clrf PORTA
call Tempo3 ;
goto boucl_prog
;************************************
;TEMPO 500 µS
;************************************
busy movwf NB_TEMPO ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle movlw .123
movwf BUSY_1
boucle1 NOP
decfsz BUSY_1,1
goto boucle1
decfsz NB_TEMPO,1
goto boucle
return ; retour de la sous-routine
;************************************
;TEMPO xx S
;************************************
tempox movlw 0x0B ; pour x boucles
tempoxx movwf cmpt1 ; dans cmpt1
boucle2 movlw 0x25
call busy ; TEMPO xxxx µS
decfsz cmpt1 , f ; si 0, décrémenter compteur 3
goto boucle2 ; si cmpt1 pas 0, recommencer boucle2
return ; retour de la sous-routine
;**********************************************************
; RECEPTION D'UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
; Controle RC5 : RC5_CTRL => 1 bit
; Adresse RC5 : RC5_ADR => 5 bits
; Données RC5 : RC5_DATA => 6 bits
;**********************************************************
Recv_RC5
btfsc PORTB, 6 ; Attendre un "0"
goto Recv_RC5 ; du bit de start
call Tempo444 ; attendre 444us, 1/4 cycle pour capture bit a bit
btfsc PORTB, 6 ; tester si "0" (anormal probabl... une emission en cours mal sync!)
goto Fin_RC5 ; ERREUR ! finir la phase de reception
clrf donn1 ; donn1=0
clrf donn2 ; donn2=0
movlw .13 ; 13 bits a capturer
movwf Loop3 ; 12 sont traites
call Tempo888 ; 1/4 du 2' Bit
nextbit rlf donn1,f ; rotation a gauche de tous les bits
rlf donn2,f ;
bcf donn1, 0 ; forcer a "0" le bit0 de "donn1"
btfsc PORTB, 6 ; si RB6 (infra rouge) =0
bsf donn1, 0 ; forcer a "1" le bit0 de "donn1"
call Set_bit ; attendre flanc montant ou desc en fonction de l'etat de RB6 (infra rouge)
call Tempo444 ; attendre 3/4 de Bit pour se ;tempo ; = 444,5 us
call Tempo888 ; placer a 1/4 du bit suivant ;tempo ; = 889 us
decfsz Loop3,f ; les 13 bits sont t-ils tous reçus
goto nextbit ; si non, recommencer reception du bit suivant
;Recuperation des bits du code RC5 des variables "donn1" "donn2"
movfw donn1 ; recuperation des 6 bits de Données RC5
andlw b'00111111' ; 0 sur les bits non utilisés
movwf RC5_DATA ; Placer val dans "RC5_DATA"
rlf donn1,f ; decalage a gauche de 2
rlf donn2,f ; pour faire "remonter" les bits
rlf donn1,f ; de l'Adresse RC5
rlf donn2,f ; de donn1
movfw donn2 ; vers donn2
andlw b'00011111' ; 0 sur les bits non utilisés
movwf RC5_ADR ; recuperation des 5 bits dans "RC5_ADR"
clrf RC5_CTRL ; recuperation du bit
btfss donn2, 5 ; de controle RC5
bsf RC5_CTRL, 0 ; dans "RC5_CTRL"
Fin_RC5
return
;*************************************
;Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit movlw 0x09 ; Tempo
movwf Loop1
tim11 movlw 0x20 ;
movwf Loop2
tim22 decfsz Loop2,f
goto tim22
btfsc PORTB, 6 ; si "0"
goto haut
bas btfsc donn1, 0 ; bit en cours =0 ?
return ; flanc haut/bas
goto saut_l
haut btfss donn1, 0 ; bit en cours =1 ?
return ; flanc bas/haut
saut_l decfsz Loop1,f
goto tim11
return
;****************************
; TEMPORISATION POUR RC5
;****************************
Tempo888 movlw 0x12 ; Temporisation de 888µs
goto tim0
Tempo444 movlw 0x09 ; Temporisation de 444µs
tim0 movwf Loop1
tim1 movlw 0x0F
movwf Loop2
tim2 decfsz Loop2,f
goto tim2
decfsz Loop1,f
goto tim1
return
;****************************
; TEMPORISATION DES LEDs
;****************************
Tempo3
movlw 0xFF
movwf Retard1
movwf Retard2
Attente
decfsz Retard1,f
goto Attente
movlw 0xff
movwf Retard1
decfsz Retard2,f
goto Attente
return
end
Le programme d'origine
Code : Tout sélectionner
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
; PIC 16F84
; Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
; ryl le 06/01/2005 23:46
;
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
LIST p=16f84
#include <p16f84.inc>
__config B'11111111110001'
; Do not show warnings
ERRORLEVEL -224
LCD_DATA EQU PORTA ; RA0 ==> RA3
LCD_CTRLB EQU PORTB
;E EQU 4 ; sur RA4
RS EQU 7 ; sur RB7
cblock 0x0C
donn1 : 1 ; reception des bits RC5
donn2 : 1 ; reception des bits RC5
LCD_TEMP: 1 ;temp LCD
LCD_TEMP2: 1 ;temp LCD
BUSY_1: 1 ;var utilisée pour temporisation
NB_TEMPO: 1 ;var utilisée pour temporisation
cmpt1: 1 ;var utilisée pour temporisation
LCD_INDEX: 1 ;Position curseur LCD
RC5_CTRL: 1 ;var bit controle RC5
RC5_ADR: 1 ;var bits adresse RC5
RC5_DATA: 1 ;var bits données RC5
Loop1: 1 ;compteur
Loop2: 1
Loop3: 1
ROM_INDEX: 1 ;pointeur ROM tables des mots ( "sortie RB", "sorties a ZERO", "Pas de RC5......" ) ;
endc
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
ORG 0x0000
bsf STATUS ,RP0 ;Select Bank 1
;clrf TRISB ;
clrf TRISA ;
MOVLW B'01000000' ;portb.6 en entrée
MOVWF TRISB
bcf STATUS ,RP0 ;Select Bank 0
bcf INTCON, GIE ; disable Interupt
debut
call tempox
call lcdinit ; Appel du sous-prog d'initialisation de l'afficheur LCD
boucl_prog
call Recv_RC5 ; Récéption d'un code RC5
call Lign_1 ; efface ecran LCD
;movfw RC5_CTRL ; Etat du bit CONTROL RC5 dans RC5_CTRL (touche pressée par impulsion/continue)
;movfw RC5_ADR ; Etat des 5 bits ADRESSE RC5 dans RC5_ADR (adresseRC5: ex:TV=h00)
;movfw RC5_DATA ; Etat des bits de DONNEES RC5 dans RC5_DATA (touches TC: ex:On/Off=h0C )
movfw RC5_DATA ; si RC5_DATA =0 (touche N°0 de la TC)
btfsc STATUS,Z ;
goto Action_1 ;
xorlw (0x01 ^ 0x00) ; si RC5_DATA =1 (touche N°1 de la TC)
btfsc STATUS,Z ;
goto Action_2 ;
xorlw (0x02 ^ 0x01) ; si RC5_DATA =2 (touche N°2 de la TC)
btfsc STATUS,Z
goto Action_3 ;
xorlw (0x03 ^ 0x02) ; si RC5_DATA =4 (touche N°4 de la TC)
btfsc STATUS,Z
goto Action_4 ;
xorlw (0x04 ^ 0x03) ; si RC5_DATA =5 (touche N°5 de la TC)
btfsc STATUS,Z
goto Action_5 ;
xorlw (0x05 ^ 0x04) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_6 ;
xorlw (0x0C ^ 0x05) ; si RC5_DATA =h0C (touche ON/OFF de la TC)
btfsc STATUS,Z
goto Action_7 ;
call MOT3 ; Affiche "Pas de RC5......" (pas traitée ou pas de reception IR)
goto fini ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Action_1
bsf PORTB,0 ; mettre a 1 la broche RB0 (led n°1)
goto LCD_refr ;
Action_2
bsf PORTB,1 ; mettre a 1 la broche RB1 (led n°2)
goto LCD_refr ;
Action_3
bsf PORTB,2 ; mettre a 1 la broche RB2 (led n°3)
goto LCD_refr ;
Action_4
bsf PORTB,3 ; mettre a 1 la broche RB3 (led n°4)
goto LCD_refr ;
Action_5
bsf PORTB,4 ; mettre a 1 la broche RB4 (led n°5)
goto LCD_refr ;
Action_6
bsf PORTB,5 ; mettre a 1 la broche RB5 (led n°6)
goto LCD_refr ;
LCD_refr
call MOT1 ; Affiche la sortie active
goto fini ;
Action_7
call MOT2 ; Affiche "sorties a ZERO"
clrf PORTB ; mise a 0 de toutes les sorties
fini
call tempox ; tempo entre chaque detection/affichage
call tempox ;
goto boucl_prog ; recommencer la detection RC5+LCD
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
; MOT1 A AFFICHER SUR LCD 1' ligne
;************************************
MOT1 movlw T_MOT1 ; debut adresse table du premier mot/phrase
call Phrase ; Affiche "sortie RB" sur LCD
movfw RC5_DATA ; Affiche le N° sortie active (0...5)
addlw 0x30 ; pour une lecture correcte depuis LCD (0x30='0')
call lcd_putchar
return
;************************************
; MOT2 A AFFICHER SUR LCD 2' ligne
;************************************
MOT2 movlw 0x10
movwf LCD_INDEX ; forçer 2ieme ligne LCD
movlw T_MOT2 ; debut adresse table du deuxieme mot/phrase
goto Phrase ; Affiche "sorties a ZERO"
;************************************
; MOT3 A AFFICHER SUR LCD 1' ligne
;************************************
MOT3 movlw T_MOT3 ; debut adresse table du troisieme mot/phrase
;goto Phrase ; Affiche "Pas de RC5......"
;************************************
; LECTURE ROM INTERNE DU MOT/PHRASE
;************************************
Phrase movwf ROM_INDEX ; mettre dans pointeur adresse
Loop_Phrase call T_MOT ; recuperer valeur dans table "T_MOT"
andlw 0xFF ;
btfsc STATUS,Z ; si=0
return ; fin du mot/phrase
call lcd_putchar ; si non ,envoyer valeur a LCD
incf ROM_INDEX,f ; pointeur table +1
goto Loop_Phrase ; mot pas fini
T_MOT movfw ROM_INDEX ;!! ATTENTION a PCLATH !! si ailleur dans ROM
movwf PCL ; mettre dans pointeur
T_MOT1 ;
dt "sortie RB",0 ; IMPORTANT mettre 0 a la fin
T_MOT2 ;
dt "sorties a ZERO",0 ; le 0 indique la fin du mot/phrase
T_MOT3 ;
dt "Pas de RC5......",0 ;
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;INITIALISATION DU MODULE LCD
;************************************
lcdinit movlw .30 ; sous-programme d'initialisation
call busy ; On attend 15 ms pour que le LCD soit prêt
movlw 0x02 ; Force Mode 4 bits
call lcd_putcmd
movlw 0x28 ; Mode 4 bits
call lcd_putcmd
movlw 0x0C ; Affichage activé , le curseur ne se voit pas
call lcd_putcmd
movlw 0x06 ; Après chaque affichage , le curseur se déplace vers la droite
call lcd_putcmd
Clear_LCD clrf LCD_INDEX ; Position curseur LCD =0
movlw 0x01 ; On efface l'écran et on met le curseur en haut à gauche
call lcd_putcmd
return
;************************************
;ENVOYER UN CARACTERE AU LCD
;************************************
lcd_putchar movwf LCD_TEMP ; Sauvegarde du caractere a envoyer
movwf LCD_TEMP2 ; Sauvegarde du caractere a envoyer
lcd_pucr movfw LCD_INDEX ; verifier valeur en cas de saut ligne LCD
xorlw (0x10 ^ 0x00) ;si LEN > 16 saut a 2' lign
btfsc STATUS,Z
call Lign_2 ; /
xorlw (0x20 ^ 0x10) ;si LEN > 32 saut a 3' lign
btfsc STATUS,Z
call Lign_3 ; /
xorlw (0x30 ^ 0x20) ;si LEN > 48 saut a 4' lign
btfsc STATUS,Z
call Lign_4 ; /
xorlw (0x40 ^ 0x30) ;si LEN > 64 saut a 1' lign
btfsc STATUS,Z
call Lign_1 ; /
incf LCD_INDEX,F ; on incrémente le pointeur LCD
movfw LCD_TEMP2 ; remettre le caractere sauvé dans "LCD_TEMP"
movwf LCD_TEMP ; caractere a envoyer
movlw 0x02 ; On attend que le LCD soit prêt
call busy
bsf LCD_CTRLB,RS ; ... une commande
goto Comu_LCD
;************************************
Lign_1 call Clear_LCD ; efface LCD et initialise pointeur LCD
movlw 0x80 ; On place le curseur ( début de la 1e ligne )
goto lcd_putcmd
Lign_2
movlw 0xC0 ; On place le curseur ( début de la 2e ligne )
goto lcd_putcmd
Lign_3
movlw 0x90 ; On place le curseur ( début de la 3e ligne )
goto lcd_putcmd
Lign_4
movlw 0xD0 ; On place le curseur ( début de la 4e ligne )
;************************************
;ENVOYER UNE COMMANDE AU LCD
;************************************
lcd_putcmd movwf LCD_TEMP ; Sous programme d'envoi de commande
movlw 0x08 ; On attend que le LCD soit prêt
call busy
bcf LCD_CTRLB,RS ; ... d'une commande
Comu_LCD swapf LCD_TEMP,W ; On permutte les 2 quartets ( groupes de 4 bits ) de l'instruction
andlw 0x0F
movwf LCD_DATA ; On envoie les bits de poids fort sur RA0 ==> RA3
call enable ; On valide
movf LCD_TEMP,W
andlw 0x0F
movwf LCD_DATA ; On envoie les bits de poids faible (de l'instruction)
enable iorlw 0x10 ; On valide "ENABLE_LCD"
movwf LCD_DATA
nop
xorlw 0x10 ; disable
movwf LCD_DATA
return ; retour de la sous-routine
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;TEMPO 500 µS
;************************************
busy movwf NB_TEMPO ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle movlw .123
movwf BUSY_1
boucle1 NOP
decfsz BUSY_1,1
goto boucle1
decfsz NB_TEMPO,1
goto boucle
return ; retour de la sous-routine
;************************************
;TEMPO xx S
;************************************
tempox movlw 0x0B ; pour x boucles
tempoxx movwf cmpt1 ; dans cmpt1
boucle2 movlw 0x25
call busy ; TEMPO xxxx µS
decfsz cmpt1 , f ; si 0, décrémenter compteur 3
goto boucle2 ; si cmpt1 pas 0, recommencer boucle2
return ; retour de la sous-routine
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;**********************************************************
; RECEPTION D'UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
; Controle RC5 : RC5_CTRL => 1 bit
; Adresse RC5 : RC5_ADR => 5 bits
; Données RC5 : RC5_DATA => 6 bits
;**********************************************************
Recv_RC5
btfsc PORTB, 6 ; Attendre un "0"
goto Recv_RC5 ; du bit de start
call Tempo444 ; attendre 444us, 1/4 cycle pour capture bit a bit
btfsc PORTB, 6 ; tester si "0" (anormal probabl... une emission en cours mal sync!)
goto Fin_RC5 ; ERREUR ! finir la phase de reception
clrf donn1 ; donn1=0
clrf donn2 ; donn2=0
movlw .13 ; 13 bits a capturer
movwf Loop3 ; 12 sont traites
call Tempo888 ; 1/4 du 2' Bit
nextbit rlf donn1,f ; rotation a gauche de tous les bits
rlf donn2,f ;
bcf donn1, 0 ; forcer a "0" le bit0 de "donn1"
btfsc PORTB, 6 ; si RB6 (infra rouge) =0
bsf donn1, 0 ; forcer a "1" le bit0 de "donn1"
call Set_bit ; attendre flanc montant ou desc en fonction de l'etat de RB6 (infra rouge)
call Tempo444 ; attendre 3/4 de Bit pour se ;tempo ; = 444,5 us
call Tempo888 ; placer a 1/4 du bit suivant ;tempo ; = 889 us
decfsz Loop3,f ; les 13 bits sont t-ils tous reçus
goto nextbit ; si non, recommencer reception du bit suivant
;Recuperation des bits du code RC5 des variables "donn1" "donn2"
movfw donn1 ; recuperation des 6 bits de Données RC5
andlw b'00111111' ; 0 sur les bits non utilisés
movwf RC5_DATA ; Placer val dans "RC5_DATA"
rlf donn1,f ; decalage a gauche de 2
rlf donn2,f ; pour faire "remonter" les bits
rlf donn1,f ; de l'Adresse RC5
rlf donn2,f ; de donn1
movfw donn2 ; vers donn2
andlw b'00011111' ; 0 sur les bits non utilisés
movwf RC5_ADR ; recuperation des 5 bits dans "RC5_ADR"
clrf RC5_CTRL ; recuperation du bit
btfss donn2, 5 ; de controle RC5
bsf RC5_CTRL, 0 ; dans "RC5_CTRL"
Fin_RC5
return
;*************************************
;Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit movlw 0x09 ; Tempo
movwf Loop1
tim11 movlw 0x20 ;
movwf Loop2
tim22 decfsz Loop2,f
goto tim22
btfsc PORTB, 6 ; si "0"
goto haut
bas btfsc donn1, 0 ; bit en cours =0 ?
return ; flanc haut/bas
goto saut_l
haut btfss donn1, 0 ; bit en cours =1 ?
return ; flanc bas/haut
saut_l decfsz Loop1,f
goto tim11
return
;****************************
; TEMPORISATION POUR RC5
;****************************
Tempo888 movlw 0x12 ; Temporisation de 888µs
goto tim0
Tempo444 movlw 0x09 ; Temporisation de 444µs
tim0 movwf Loop1
tim1 movlw 0x0F
movwf Loop2
tim2 decfsz Loop2,f
goto tim2
decfsz Loop1,f
goto tim1
return
end
Télécommande IR à 10 canaux
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour tout le monde,
Je reviens sur ce récepteur qui pose à priori 2 petits soucis.
Le 1er:
La maquette posée sur la table en mode veille en attente d'un appel de télécommande.
J'ai d'une façon très aléatoire une sortie qui s'active sans avoir reçu d'appel.
Cette sortie n'est pas tjrs la même et sur 1h00 elle peut s'activer 1 X ou 2 X ou rien
J'ai essayé de masquer la cellule dans un tube alu (de médoc) pour être certain que ce n'est pas un pb de faisceau parasite.
J'ai alimenté la maquette avec une pile 9V et un petit régulateur 5V
Rien n'y fait
Je pense que le problème est dans le programme mais où?
Le second:
Dans le programme d'origine, le récepteur décode les 7 appels de la télécommande 0 à 7
J'ai augmenté le nbre d'appel à 9 et jusque là pas de pb.
Ensuite j'ai voulu utiliser les codes affectés au volume et qq autres dédiés à des commandes de "MUTE" , "PRG" , etc..
J'ai été confronté au pb suivant:
Si j'affecte une cde supplémentaire tout se passe bien, la cde est bien prise en compte
Exemple avec le volume+ (code 15)
Si je continue pour obtenir le volume - (code 16).
Aucunes de ces 2 cdes fonctionne. Autrement dit la seconde cde annule les 2.
Quelqu'un a t-il une explication?
Merci
Je reviens sur ce récepteur qui pose à priori 2 petits soucis.
Le 1er:
La maquette posée sur la table en mode veille en attente d'un appel de télécommande.
J'ai d'une façon très aléatoire une sortie qui s'active sans avoir reçu d'appel.
Cette sortie n'est pas tjrs la même et sur 1h00 elle peut s'activer 1 X ou 2 X ou rien
J'ai essayé de masquer la cellule dans un tube alu (de médoc) pour être certain que ce n'est pas un pb de faisceau parasite.
J'ai alimenté la maquette avec une pile 9V et un petit régulateur 5V
Rien n'y fait
Je pense que le problème est dans le programme mais où?
Le second:
Dans le programme d'origine, le récepteur décode les 7 appels de la télécommande 0 à 7
J'ai augmenté le nbre d'appel à 9 et jusque là pas de pb.
Ensuite j'ai voulu utiliser les codes affectés au volume et qq autres dédiés à des commandes de "MUTE" , "PRG" , etc..
J'ai été confronté au pb suivant:
Si j'affecte une cde supplémentaire tout se passe bien, la cde est bien prise en compte
Exemple avec le volume+ (code 15)
Code : Tout sélectionner
xorlw (0x15 ^ 0x14) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_8 ; ;
Si je continue pour obtenir le volume - (code 16).
Aucunes de ces 2 cdes fonctionne. Autrement dit la seconde cde annule les 2.
Code : Tout sélectionner
xorlw (0x16 ^ 0x15) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_9 ;
Quelqu'un a t-il une explication?
Merci
Télécommande IR à 10 canaux
Bonsoir nondediode, et tout le forum,
Peux tu réécrire ta routine sans la mettre comme ceci 0x16 ^ 0x15, en utilisant des instructions.
Le problème pour moi, c'est de comprendre ce que veux dire la personne, pour que je puisse l'aider.
Ont dit souvent : un problème bien posé, c'est un problème à moitié résolu, et je confirme.
A+
Peux tu réécrire ta routine sans la mettre comme ceci 0x16 ^ 0x15, en utilisant des instructions.
Le problème pour moi, c'est de comprendre ce que veux dire la personne, pour que je puisse l'aider.
Ont dit souvent : un problème bien posé, c'est un problème à moitié résolu, et je confirme.
A+
Télécommande IR à 10 canaux
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour Temps-x et toute l'équipe du forum.
Le soucis c'est que j'utilise un modèle de programme dans lequel j'ai juste supprimé la partie affichage qui n'avait pas d'utilité pour moi. Ensuite j'ai fait qq modifs pour qu'il soit parfaitement adapté à mon montage.
Effectivement cette routine est un peu floue, juste qu'elle permet d'inclure le code de la touche.
Revoici le programme complet avant modif
Et le programme modifié
J'ai juste suivi la suite logique de cette commande très particulière pour lequel je pense qu'il s'agit de vérifier une différence entre registre mais je ne suis pas arrivé à trouver d'autres explications.
Le soucis c'est que j'utilise un modèle de programme dans lequel j'ai juste supprimé la partie affichage qui n'avait pas d'utilité pour moi. Ensuite j'ai fait qq modifs pour qu'il soit parfaitement adapté à mon montage.
Effectivement cette routine est un peu floue, juste qu'elle permet d'inclure le code de la touche.
Revoici le programme complet avant modif
Code : Tout sélectionner
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
; PIC 16F84
; Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
; ryl le 06/01/2005 23:46
;
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
LIST p=16f84
#include <p16f84.inc>
__config B'11111111110001'
; Do not show warnings
ERRORLEVEL -224
LCD_DATA EQU PORTA ; RA0 ==> RA3
LCD_CTRLB EQU PORTB
;E EQU 4 ; sur RA4
RS EQU 7 ; sur RB7
cblock 0x0C
donn1 : 1 ; reception des bits RC5
donn2 : 1 ; reception des bits RC5
LCD_TEMP: 1 ;temp LCD
LCD_TEMP2: 1 ;temp LCD
BUSY_1: 1 ;var utilisée pour temporisation
NB_TEMPO: 1 ;var utilisée pour temporisation
cmpt1: 1 ;var utilisée pour temporisation
LCD_INDEX: 1 ;Position curseur LCD
RC5_CTRL: 1 ;var bit controle RC5
RC5_ADR: 1 ;var bits adresse RC5
RC5_DATA: 1 ;var bits données RC5
Loop1: 1 ;compteur
Loop2: 1
Loop3: 1
ROM_INDEX: 1 ;pointeur ROM tables des mots ( "sortie RB", "sorties a ZERO", "Pas de RC5......" ) ;
endc
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
ORG 0x0000
bsf STATUS ,RP0 ;Select Bank 1
;clrf TRISB ;
clrf TRISA ;
MOVLW B'01000000' ;portb.6 en entrée
MOVWF TRISB
bcf STATUS ,RP0 ;Select Bank 0
bcf INTCON, GIE ; disable Interupt
debut
call tempox
call lcdinit ; Appel du sous-prog d'initialisation de l'afficheur LCD
boucl_prog
call Recv_RC5 ; Récéption d'un code RC5
call Lign_1 ; efface ecran LCD
;movfw RC5_CTRL ; Etat du bit CONTROL RC5 dans RC5_CTRL (touche pressée par impulsion/continue)
;movfw RC5_ADR ; Etat des 5 bits ADRESSE RC5 dans RC5_ADR (adresseRC5: ex:TV=h00)
;movfw RC5_DATA ; Etat des bits de DONNEES RC5 dans RC5_DATA (touches TC: ex:On/Off=h0C )
movfw RC5_DATA ; si RC5_DATA =0 (touche N°0 de la TC)
btfsc STATUS,Z ;
goto Action_1 ;
xorlw (0x01 ^ 0x00) ; si RC5_DATA =1 (touche N°1 de la TC)
btfsc STATUS,Z ;
goto Action_2 ;
xorlw (0x02 ^ 0x01) ; si RC5_DATA =2 (touche N°2 de la TC)
btfsc STATUS,Z
goto Action_3 ;
xorlw (0x03 ^ 0x02) ; si RC5_DATA =4 (touche N°4 de la TC)
btfsc STATUS,Z
goto Action_4 ;
xorlw (0x04 ^ 0x03) ; si RC5_DATA =5 (touche N°5 de la TC)
btfsc STATUS,Z
goto Action_5 ;
xorlw (0x05 ^ 0x04) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_6 ;
xorlw (0x0C ^ 0x05) ; si RC5_DATA =h0C (touche ON/OFF de la TC)
btfsc STATUS,Z
goto Action_7 ;
call MOT3 ; Affiche "Pas de RC5......" (pas traitée ou pas de reception IR)
goto fini ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Action_1
bsf PORTB,0 ; mettre a 1 la broche RB0 (led n°1)
goto LCD_refr ;
Action_2
bsf PORTB,1 ; mettre a 1 la broche RB1 (led n°2)
goto LCD_refr ;
Action_3
bsf PORTB,2 ; mettre a 1 la broche RB2 (led n°3)
goto LCD_refr ;
Action_4
bsf PORTB,3 ; mettre a 1 la broche RB3 (led n°4)
goto LCD_refr ;
Action_5
bsf PORTB,4 ; mettre a 1 la broche RB4 (led n°5)
goto LCD_refr ;
Action_6
bsf PORTB,5 ; mettre a 1 la broche RB5 (led n°6)
goto LCD_refr ;
LCD_refr
call MOT1 ; Affiche la sortie active
goto fini ;
Action_7
call MOT2 ; Affiche "sorties a ZERO"
clrf PORTB ; mise a 0 de toutes les sorties
fini
call tempox ; tempo entre chaque detection/affichage
call tempox ;
goto boucl_prog ; recommencer la detection RC5+LCD
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
; MOT1 A AFFICHER SUR LCD 1' ligne
;************************************
MOT1 movlw T_MOT1 ; debut adresse table du premier mot/phrase
call Phrase ; Affiche "sortie RB" sur LCD
movfw RC5_DATA ; Affiche le N° sortie active (0...5)
addlw 0x30 ; pour une lecture correcte depuis LCD (0x30='0')
call lcd_putchar
return
;************************************
; MOT2 A AFFICHER SUR LCD 2' ligne
;************************************
MOT2 movlw 0x10
movwf LCD_INDEX ; forçer 2ieme ligne LCD
movlw T_MOT2 ; debut adresse table du deuxieme mot/phrase
goto Phrase ; Affiche "sorties a ZERO"
;************************************
; MOT3 A AFFICHER SUR LCD 1' ligne
;************************************
MOT3 movlw T_MOT3 ; debut adresse table du troisieme mot/phrase
;goto Phrase ; Affiche "Pas de RC5......"
;************************************
; LECTURE ROM INTERNE DU MOT/PHRASE
;************************************
Phrase movwf ROM_INDEX ; mettre dans pointeur adresse
Loop_Phrase call T_MOT ; recuperer valeur dans table "T_MOT"
andlw 0xFF ;
btfsc STATUS,Z ; si=0
return ; fin du mot/phrase
call lcd_putchar ; si non ,envoyer valeur a LCD
incf ROM_INDEX,f ; pointeur table +1
goto Loop_Phrase ; mot pas fini
T_MOT movfw ROM_INDEX ;!! ATTENTION a PCLATH !! si ailleur dans ROM
movwf PCL ; mettre dans pointeur
T_MOT1 ;
dt "sortie RB",0 ; IMPORTANT mettre 0 a la fin
T_MOT2 ;
dt "sorties a ZERO",0 ; le 0 indique la fin du mot/phrase
T_MOT3 ;
dt "Pas de RC5......",0 ;
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;INITIALISATION DU MODULE LCD
;************************************
lcdinit movlw .30 ; sous-programme d'initialisation
call busy ; On attend 15 ms pour que le LCD soit prêt
movlw 0x02 ; Force Mode 4 bits
call lcd_putcmd
movlw 0x28 ; Mode 4 bits
call lcd_putcmd
movlw 0x0C ; Affichage activé , le curseur ne se voit pas
call lcd_putcmd
movlw 0x06 ; Après chaque affichage , le curseur se déplace vers la droite
call lcd_putcmd
Clear_LCD clrf LCD_INDEX ; Position curseur LCD =0
movlw 0x01 ; On efface l'écran et on met le curseur en haut à gauche
call lcd_putcmd
return
;************************************
;ENVOYER UN CARACTERE AU LCD
;************************************
lcd_putchar movwf LCD_TEMP ; Sauvegarde du caractere a envoyer
movwf LCD_TEMP2 ; Sauvegarde du caractere a envoyer
lcd_pucr movfw LCD_INDEX ; verifier valeur en cas de saut ligne LCD
xorlw (0x10 ^ 0x00) ;si LEN > 16 saut a 2' lign
btfsc STATUS,Z
call Lign_2 ; /
xorlw (0x20 ^ 0x10) ;si LEN > 32 saut a 3' lign
btfsc STATUS,Z
call Lign_3 ; /
xorlw (0x30 ^ 0x20) ;si LEN > 48 saut a 4' lign
btfsc STATUS,Z
call Lign_4 ; /
xorlw (0x40 ^ 0x30) ;si LEN > 64 saut a 1' lign
btfsc STATUS,Z
call Lign_1 ; /
incf LCD_INDEX,F ; on incrémente le pointeur LCD
movfw LCD_TEMP2 ; remettre le caractere sauvé dans "LCD_TEMP"
movwf LCD_TEMP ; caractere a envoyer
movlw 0x02 ; On attend que le LCD soit prêt
call busy
bsf LCD_CTRLB,RS ; ... une commande
goto Comu_LCD
;************************************
Lign_1 call Clear_LCD ; efface LCD et initialise pointeur LCD
movlw 0x80 ; On place le curseur ( début de la 1e ligne )
goto lcd_putcmd
Lign_2
movlw 0xC0 ; On place le curseur ( début de la 2e ligne )
goto lcd_putcmd
Lign_3
movlw 0x90 ; On place le curseur ( début de la 3e ligne )
goto lcd_putcmd
Lign_4
movlw 0xD0 ; On place le curseur ( début de la 4e ligne )
;************************************
;ENVOYER UNE COMMANDE AU LCD
;************************************
lcd_putcmd movwf LCD_TEMP ; Sous programme d'envoi de commande
movlw 0x08 ; On attend que le LCD soit prêt
call busy
bcf LCD_CTRLB,RS ; ... d'une commande
Comu_LCD swapf LCD_TEMP,W ; On permutte les 2 quartets ( groupes de 4 bits ) de l'instruction
andlw 0x0F
movwf LCD_DATA ; On envoie les bits de poids fort sur RA0 ==> RA3
call enable ; On valide
movf LCD_TEMP,W
andlw 0x0F
movwf LCD_DATA ; On envoie les bits de poids faible (de l'instruction)
enable iorlw 0x10 ; On valide "ENABLE_LCD"
movwf LCD_DATA
nop
xorlw 0x10 ; disable
movwf LCD_DATA
return ; retour de la sous-routine
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;************************************
;TEMPO 500 µS
;************************************
busy movwf NB_TEMPO ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle movlw .123
movwf BUSY_1
boucle1 NOP
decfsz BUSY_1,1
goto boucle1
decfsz NB_TEMPO,1
goto boucle
return ; retour de la sous-routine
;************************************
;TEMPO xx S
;************************************
tempox movlw 0x0B ; pour x boucles
tempoxx movwf cmpt1 ; dans cmpt1
boucle2 movlw 0x25
call busy ; TEMPO xxxx µS
decfsz cmpt1 , f ; si 0, décrémenter compteur 3
goto boucle2 ; si cmpt1 pas 0, recommencer boucle2
return ; retour de la sous-routine
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;==========================================================================================================
;**********************************************************
; RECEPTION D'UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
; Controle RC5 : RC5_CTRL => 1 bit
; Adresse RC5 : RC5_ADR => 5 bits
; Données RC5 : RC5_DATA => 6 bits
;**********************************************************
Recv_RC5
btfsc PORTB, 6 ; Attendre un "0"
goto Recv_RC5 ; du bit de start
call Tempo444 ; attendre 444us, 1/4 cycle pour capture bit a bit
btfsc PORTB, 6 ; tester si "0" (anormal probabl... une emission en cours mal sync!)
goto Fin_RC5 ; ERREUR ! finir la phase de reception
clrf donn1 ; donn1=0
clrf donn2 ; donn2=0
movlw .13 ; 13 bits a capturer
movwf Loop3 ; 12 sont traites
call Tempo888 ; 1/4 du 2' Bit
nextbit rlf donn1,f ; rotation a gauche de tous les bits
rlf donn2,f ;
bcf donn1, 0 ; forcer a "0" le bit0 de "donn1"
btfsc PORTB, 6 ; si RB6 (infra rouge) =0
bsf donn1, 0 ; forcer a "1" le bit0 de "donn1"
call Set_bit ; attendre flanc montant ou desc en fonction de l'etat de RB6 (infra rouge)
call Tempo444 ; attendre 3/4 de Bit pour se ;tempo ; = 444,5 us
call Tempo888 ; placer a 1/4 du bit suivant ;tempo ; = 889 us
decfsz Loop3,f ; les 13 bits sont t-ils tous reçus
goto nextbit ; si non, recommencer reception du bit suivant
;Recuperation des bits du code RC5 des variables "donn1" "donn2"
movfw donn1 ; recuperation des 6 bits de Données RC5
andlw b'00111111' ; 0 sur les bits non utilisés
movwf RC5_DATA ; Placer val dans "RC5_DATA"
rlf donn1,f ; decalage a gauche de 2
rlf donn2,f ; pour faire "remonter" les bits
rlf donn1,f ; de l'Adresse RC5
rlf donn2,f ; de donn1
movfw donn2 ; vers donn2
andlw b'00011111' ; 0 sur les bits non utilisés
movwf RC5_ADR ; recuperation des 5 bits dans "RC5_ADR"
clrf RC5_CTRL ; recuperation du bit
btfss donn2, 5 ; de controle RC5
bsf RC5_CTRL, 0 ; dans "RC5_CTRL"
Fin_RC5
return
;*************************************
;Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit movlw 0x09 ; Tempo
movwf Loop1
tim11 movlw 0x20 ;
movwf Loop2
tim22 decfsz Loop2,f
goto tim22
btfsc PORTB, 6 ; si "0"
goto haut
bas btfsc donn1, 0 ; bit en cours =0 ?
return ; flanc haut/bas
goto saut_l
haut btfss donn1, 0 ; bit en cours =1 ?
return ; flanc bas/haut
saut_l decfsz Loop1,f
goto tim11
return
;****************************
; TEMPORISATION POUR RC5
;****************************
Tempo888 movlw 0x12 ; Temporisation de 888µs
goto tim0
Tempo444 movlw 0x09 ; Temporisation de 444µs
tim0 movwf Loop1
tim1 movlw 0x0F
movwf Loop2
tim2 decfsz Loop2,f
goto tim2
decfsz Loop1,f
goto tim1
return
end
Et le programme modifié
Code : Tout sélectionner
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
; PIC 16F84
; Reception de code RC5 + LCD 4x16* (ou plus)+ 6 sorties (leds)
; ryl le 06/01/2005 23:46
;
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
LIST p=16f84
#include <p16f84.inc>
__config B'11111111110001'
ERRORLEVEL -224
cblock 0x0C
donn1 : 1 ; reception des bits RC5
donn2 : 1 ; reception des bits RC5
BUSY_1: 1 ;var utilisée pour temporisation
NB_TEMPO: 1 ;var utilisée pour temporisation
cmpt1: 1 ;var utilisée pour temporisation
RC5_CTRL: 1 ;var bit controle RC5
RC5_ADR: 1 ;var bits adresse RC5
RC5_DATA: 1 ;var bits données RC5
Loop1: 1 ;compteur
Loop2: 1
Loop3: 1
Retard1: 1
Retard2: 1
ROM_INDEX: 1 ;pointeur ROM tables des mots ( "sortie RB", "sorties a ZERO", "Pas de RC5......" ) ;
endc
;==========================================================================================================
ORG 0x0000
bsf STATUS ,RP0 ;Select Bank 1
clrf TRISA ;
MOVLW B'01000000' ;portb.6 en entrée
MOVWF TRISB
bcf STATUS ,RP0 ;Select Bank 0
bcf INTCON, GIE ; disable Interupt
debut
call tempox
boucl_prog
call Recv_RC5 ; Récéption d'un code RC5
movfw RC5_DATA ; si RC5_DATA =0 (touche N°0 de la TC)
btfsc STATUS,Z ;
goto Action_1 ;
xorlw (0x01 ^ 0x00) ; si RC5_DATA =1 (touche N°1 de la TC)
btfsc STATUS,Z ;
goto Action_2 ;
xorlw (0x02 ^ 0x01) ; si RC5_DATA =2 (touche N°2 de la TC)
btfsc STATUS,Z
goto Action_3 ;
xorlw (0x03 ^ 0x02) ; si RC5_DATA =4 (touche N°4 de la TC)
btfsc STATUS,Z
goto Action_4 ;
xorlw (0x04 ^ 0x03) ; si RC5_DATA =5 (touche N°5 de la TC)
btfsc STATUS,Z
goto Action_5 ;
xorlw (0x05 ^ 0x04) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_6 ;
xorlw (0x06 ^ 0x05) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_7 ;
xorlw (0x07 ^ 0x06) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_8 ;
xorlw (0x08 ^ 0x07) ; si RC5_DATA =6 (touche N°6 de la TC)
btfsc STATUS,Z
goto Action_9 ;
xorlw (0x0C ^ 0x05) ; si RC5_DATA =h0C (touche ON/OFF de la TC)
btfsc STATUS,Z
goto Action_10 ;
goto fini ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Action_1
bsf PORTB,0 ; mettre a 1 la broche RB0 (led n°1)
goto LCD_refr ;
Action_2
bsf PORTB,1 ; mettre a 1 la broche RB1 (led n°2)
goto LCD_refr
Action_3
bsf PORTB,2 ; mettre a 1 la broche RB2 (led n°3)
goto LCD_refr ;
Action_4
bsf PORTB,3 ; mettre a 1 la broche RB3 (led n°4)
goto LCD_refr ;
Action_5
bsf PORTB,4 ; mettre a 1 la broche RB4 (led n°5)
goto LCD_refr ;
Action_6
bsf PORTB,5 ; mettre a 1 la broche RB5 (led n°6)
goto LCD_refr ;
Action_7
bsf PORTA,0 ; mettre a 1 la broche RA0 (led n°7)
goto LCD_refr
Action_8
bsf PORTA,1 ; mettre a 1 la broche RA0 (led n°7)
goto LCD_refr
Action_9
bsf PORTA,2 ; mettre a 1 la broche RA0 (led n°7)
goto LCD_refr
LCD_refr
goto fini2
Action_10
clrf PORTB ; mise a 0 de toutes les sorties
fini
call tempox ; tempo entre chaque detection/affichage
call tempox ;
goto boucl_prog ; recommencer la detection RC5+LCD
fini2
movlw 0x0C
movwf RC5_DATA
call Tempo3 ;
clrf PORTB
clrf PORTA
call Tempo3 ;
goto boucl_prog
;************************************
;TEMPO 500 µS
;************************************
busy movwf NB_TEMPO ; Temporisation : dure 500µs x "la valeur contenue dans W"
boucle movlw .123
movwf BUSY_1
boucle1 NOP
decfsz BUSY_1,1
goto boucle1
decfsz NB_TEMPO,1
goto boucle
return ; retour de la sous-routine
;************************************
;TEMPO xx S
;************************************
tempox movlw 0x0B ; pour x boucles
tempoxx movwf cmpt1 ; dans cmpt1
boucle2 movlw 0x25
call busy ; TEMPO xxxx µS
decfsz cmpt1 , f ; si 0, décrémenter compteur 3
goto boucle2 ; si cmpt1 pas 0, recommencer boucle2
return ; retour de la sous-routine
;**********************************************************
; RECEPTION D'UN CODE RC5
; RB6 en entrée (TSOP 1738...ou equivalent infra rouge)
; Controle RC5 : RC5_CTRL => 1 bit
; Adresse RC5 : RC5_ADR => 5 bits
; Données RC5 : RC5_DATA => 6 bits
;**********************************************************
Recv_RC5
btfsc PORTB, 6 ; Attendre un "0"
goto Recv_RC5 ; du bit de start
call Tempo444 ; attendre 444us, 1/4 cycle pour capture bit a bit
btfsc PORTB, 6 ; tester si "0" (anormal probabl... une emission en cours mal sync!)
goto Fin_RC5 ; ERREUR ! finir la phase de reception
clrf donn1 ; donn1=0
clrf donn2 ; donn2=0
movlw .13 ; 13 bits a capturer
movwf Loop3 ; 12 sont traites
call Tempo888 ; 1/4 du 2' Bit
nextbit rlf donn1,f ; rotation a gauche de tous les bits
rlf donn2,f ;
bcf donn1, 0 ; forcer a "0" le bit0 de "donn1"
btfsc PORTB, 6 ; si RB6 (infra rouge) =0
bsf donn1, 0 ; forcer a "1" le bit0 de "donn1"
call Set_bit ; attendre flanc montant ou desc en fonction de l'etat de RB6 (infra rouge)
call Tempo444 ; attendre 3/4 de Bit pour se ;tempo ; = 444,5 us
call Tempo888 ; placer a 1/4 du bit suivant ;tempo ; = 889 us
decfsz Loop3,f ; les 13 bits sont t-ils tous reçus
goto nextbit ; si non, recommencer reception du bit suivant
;Recuperation des bits du code RC5 des variables "donn1" "donn2"
movfw donn1 ; recuperation des 6 bits de Données RC5
andlw b'00111111' ; 0 sur les bits non utilisés
movwf RC5_DATA ; Placer val dans "RC5_DATA"
rlf donn1,f ; decalage a gauche de 2
rlf donn2,f ; pour faire "remonter" les bits
rlf donn1,f ; de l'Adresse RC5
rlf donn2,f ; de donn1
movfw donn2 ; vers donn2
andlw b'00011111' ; 0 sur les bits non utilisés
movwf RC5_ADR ; recuperation des 5 bits dans "RC5_ADR"
clrf RC5_CTRL ; recuperation du bit
btfss donn2, 5 ; de controle RC5
bsf RC5_CTRL, 0 ; dans "RC5_CTRL"
Fin_RC5
return
;*************************************
;Attendre fin bit fonction de PORTB6 (IR)
;*************************************
Set_bit movlw 0x09 ; Tempo
movwf Loop1
tim11 movlw 0x20 ;
movwf Loop2
tim22 decfsz Loop2,f
goto tim22
btfsc PORTB, 6 ; si "0"
goto haut
bas btfsc donn1, 0 ; bit en cours =0 ?
return ; flanc haut/bas
goto saut_l
haut btfss donn1, 0 ; bit en cours =1 ?
return ; flanc bas/haut
saut_l decfsz Loop1,f
goto tim11
return
;****************************
; TEMPORISATION POUR RC5
;****************************
Tempo888 movlw 0x12 ; Temporisation de 888µs
goto tim0
Tempo444 movlw 0x09 ; Temporisation de 444µs
tim0 movwf Loop1
tim1 movlw 0x0F
movwf Loop2
tim2 decfsz Loop2,f
goto tim2
decfsz Loop1,f
goto tim1
return
;****************************
; TEMPORISATION DES LEDs
;****************************
Tempo3
movlw 0xFF
movwf Retard1
movwf Retard2
Attente
decfsz Retard1,f
goto Attente
movlw 0xff
movwf Retard1
decfsz Retard2,f
goto Attente
return
end
J'ai juste suivi la suite logique de cette commande très particulière pour lequel je pense qu'il s'agit de vérifier une différence entre registre mais je ne suis pas arrivé à trouver d'autres explications.
Télécommande IR à 10 canaux
Télécommande IR à 10 canaux
Bonsoir Triac01, nondediode, et tout le forum,
Effectivement, il ont parle en chapitre 18, j'ai jamais fini la fin du cours 1 du maître BIGONOFF
Triac01
Pour revenir à notre télécommande, je me rappelle que certaine télécommande ont deux codes pour la même touche,
en général ça concerne presque toujours le volume.
A+
Triac01 a écrit :Source du message Regarde sur le cours 1 du maître BIGONOFF dans le chapitre 18 astuces de programmation une explication en est donnée.
Effectivement, il ont parle en chapitre 18, j'ai jamais fini la fin du cours 1 du maître BIGONOFF
Triac01
Pour revenir à notre télécommande, je me rappelle que certaine télécommande ont deux codes pour la même touche,
en général ça concerne presque toujours le volume.
A+
Télécommande IR à 10 canaux
Bonjour,
En voilà un sujet qui m'a toujours intrigué. Le fonctionnement d'une télécommande
Si j'ai bien compris, la télécommande envoie une série de clignotement via l'infrarouge et le récepteur sais du coup la touche. C'est bien sa ?
Genre
Touche 1 = 10101010
Touche 2 = 10110010
Etc...
Et la led s'allume quand elle rencontre un 1 et s'éteint quand elle rencontre un 0 ?
@++
En voilà un sujet qui m'a toujours intrigué. Le fonctionnement d'une télécommande
Si j'ai bien compris, la télécommande envoie une série de clignotement via l'infrarouge et le récepteur sais du coup la touche. C'est bien sa ?
Genre
Touche 1 = 10101010
Touche 2 = 10110010
Etc...
Et la led s'allume quand elle rencontre un 1 et s'éteint quand elle rencontre un 0 ?
@++
Télécommande IR à 10 canaux
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour,
un sujet effectivement tres interessant ..
non seulement une serie de bit, mais aussi
la frequence porteuse
36KHz
38KHz
40KHz
...
Le protocole de codage
RC5
RC6
SONY
...etc
la duree d'un bit
la duree des silences
les repetitions
donc tout un programme ..
elles reviennent en force, ces telecommandes IR :
ex: Led RGB ou ruban + telecommande IR pour moins de 4€ chez ACTION , où je n'en ai pas .(.. des actions)
peut etre intressant pour piloter autre chose via un PIC
venom a écrit :Bonjour,
En voilà un sujet qui m'a toujours intrigué. Le fonctionnement d'une télécommande
Si j'ai bien compris, la télécommande envoie une série de clignotement via l'infrarouge et le récepteur sais du coup la touche. C'est bien sa ?
Genre
Touche 1 = 10101010
Touche 2 = 10110010
Etc...
Et la led s'allume quand elle rencontre un 1 et s'éteint quand elle rencontre un 0 ?
@++
un sujet effectivement tres interessant ..
non seulement une serie de bit, mais aussi
la frequence porteuse
36KHz
38KHz
40KHz
...
Le protocole de codage
RC5
RC6
SONY
...etc
la duree d'un bit
la duree des silences
les repetitions
donc tout un programme ..
elles reviennent en force, ces telecommandes IR :
ex: Led RGB ou ruban + telecommande IR pour moins de 4€ chez ACTION , où je n'en ai pas .(.. des actions)
peut etre intressant pour piloter autre chose via un PIC
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 53 invités