Enregistrement de trame de telecommande dans une PIC

jayahti Messages postés 2 Date d'inscription dimanche 12 septembre 2010 Statut Membre Dernière intervention 5 mai 2011 - 5 mai 2011 à 22:14
rawigoto Messages postés 1 Date d'inscription dimanche 5 juin 2011 Statut Membre Dernière intervention 14 mai 2012 - 14 mai 2012 à 21:51
bonsoir à tous!
avec une pic 16F84A je voudrai commander un relai par télécommande.
Pour être plus claire,le pic doit en premier lieu enregistrer la trame d'une bouton de la télécommande dans son EEPROM. En suite quand il recevrai la même trame, il actionne le relai.
J'ai déjà commencé avec la réception de trame mais le problème c'est sur la sauvegarde et la récupération de la trame sur l'EEPROM.
Est ce que quelqu'un pourrai m'aider a résoudre ce problème.
Je vous remercie déjà pour votre aide.

1 réponse

rawigoto Messages postés 1 Date d'inscription dimanche 5 juin 2011 Statut Membre Dernière intervention 14 mai 2012
14 mai 2012 à 21:51
; Récepteur 3 voies - Télécommande HF
; Doumai.Terret@Wanadoo.fr
; Merci de laisser mon adresse si vous modifiez le programme
; Résonnateur = 4Mhz
;
LIST P=16F628, F=INHX8M, r=dec
include "P16F628.inc"
;
__CONFIG _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _XT_OSC
;
; Do not show warnings
ERRORLEVEL -224
;
; Déclaration des variables
;
cblock 0x20
TRAME0,TRAME1,TRAME2 ; 4 bits de la trame reçue, en cours, 1ère mémo, 2ème mémo
I,J,K ; pour le comptage
ST3 ; pour le comptage entre deux trames
endc
;
; Define
;
#define CAV1 PORTB,0 ; Cavalier Mode impulsionnel / bistable
#define REL1 PORTB,5 ; Relais K3
#define REL2 PORTB,6 ; Relais K2
#define REL3 PORTB,7 ; Relais K1
#define LED1 PORTA,1 ; Témoin de réception
#define REC PORTA,2 ; Entrée numérique en provenance du récepteur

;
org 0
goto Start
;
org 10

Start bcf STATUS,RP0 ; Bank 0
movlw 0x07 ; Désactivation du mode comparateur et
movwf CMCON ; passe en mode Entrées / Sorties
;
bsf STATUS,RP0 ; Bank 1
movlw B'00000001' ;
movwf TRISB ; RB0 Cavalier, RB5 à RB7 relais
movlw B'00000100' ;
movwf TRISA ; RA1 LED, RA2 réception HF
bcf STATUS,RP0 ; Bank 0
;
clrf PORTB ; Tous les relais non alimentés
clrf PORTA ; LED éteinte
;
Debut bcf LED1 ; Eteint la LED de réception
;
; Lecture du cavalier
; Si on est en mode impulsionnel, on coupe l'alim des relais
;
btfss CAV1 ; Test l'état du cavalier
clrf PORTB ; Coupe l'alim relais
;
; Détection d'un état 0 de 1,5 ms sur REC pour la lecture de la première trame
; On test 255 fois si le signal reçu est à 0
; Si c'est le cas, on se situe entre deux trames
;
movlw 0xFF
movwf ST3 ; ST3=255
InterT0 btfss REC ; Test de l'état logique du signal HF reçu
goto InterT1 ; Le signal est à 0
goto Debut ; Le signal est à 1, on attend une inter trame
InterT1 decfsz ST3,F ; Décrémente ST3
goto InterT0 ; On continu à tester REC
;
; On est dans une inter-trame
; Lecture et sauvegarde des 4 bits ( les 3 poussoirs + 1 bit à 0 )
;
call Trame ; Lecture des 4 bits
movf TRAME0,W
movwf TRAME1 ; Sauvegarde des 4 bits qui viennent d'être lus dans TRAME1
;
; Détection d'un état 0 de 1,5 ms sur REC pour la lecture de la deuxième trame
;

Det1 movlw 0xFF
movwf ST3
InterT2 btfss REC
goto InterT3
goto Debut
InterT3 decfsz ST3,F
goto InterT2
;
; On est dans une inter-trame
; Lecture et sauvegarde des 4 bits
;
call Trame ; Lecture des 4 bits
movf TRAME0,W
movwf TRAME2 ; Sauvegarde des 4 bits qui viennent d'être lus dans TRAME2
;
; Comparaison des deux trames recues par HF. Les 2 trames doivent être identiques
;
movf TRAME1,W ; W=TRAME1
subwf TRAME2,W ; W=TRAME2-TRAME1
btfsc STATUS,Z ; Test si le résultat est nul
goto Comp0 ; Les deux trames sont identiques
goto Debut ; Les deux trames sont différentes
Comp0
;
; Détection d'un état 0 de 1,5 ms sur REC pour la lecture de la troisième trame
;

Det2 movlw 0xFF
movwf ST3
InterT4 btfss REC
goto InterT5
goto Debut
InterT5 decfsz ST3,F
goto InterT4
;
; On est dans une inter-trame
; Lecture et sauvegarde des 4 bits
;
call Trame ; Lecture des 4 bits
movf TRAME0,W
movwf TRAME2 ; Sauvegarde des 4 bits qui viennent d'être lus dans TRAME2
;
; Comparaison des deux trames recues par HF. Les 2 trames doivent être identiques
;
movf TRAME1,W ; W=TRAME1
subwf TRAME2,W ; W=TRAME2-TRAME1
btfsc STATUS,Z ; Test si le résultat est nul
goto Comp1 ; Les deux trames sont identiques
goto Debut ; Les deux trames sont différentes
Comp1
;
; Mode impulsionnel : Cavalier en place
; Les deux trames sont identiques
; Mise à l'état 1 de l'une des 3 sorties
;
btfsc CAV1 ; Test l'état du cavalier
goto Bist ; On saute au mode bistable
; On est en mode impulsionnel
bsf LED1 ; Allume la LED de réception
movf TRAME2,W ; W=TRAME2
;
movlw 0x40 ; Relais K1 à la réception
subwf TRAME2,W ; K1 ?
btfsc STATUS,Z ; Si pas K1, on va traiter K2
bsf REL1 ; K1 alimenté
;
movlw 0x20 ; Relais K2 à la réception
subwf TRAME2,W
btfsc STATUS,Z
bsf REL2
;
movlw 0x10
subwf TRAME2,W ; Relais K3 à la réception
btfsc STATUS,Z
bsf REL3
;
goto Att ; Attente 2 secondes évite les rebonds
;
; Mode bistable : pas de cavalier
; Les deux trames sont identiques
; Changement de l'état de l'une des 3 sorties
;
Bist bsf LED1 ; Allume la LED de réception
movf TRAME2,W ; W=TRAME2
;
Rel1 movlw 0x40 ; Relais K1 à la réception
subwf TRAME2,W ; K1 ?
btfss STATUS,Z ; Skip si K1
goto Rel2 ; Ce n'est pas K1, on va traiter K2
movlw 0x20 ; Masque pour K1
xorwf PORTB,F ; Change l'état du relais K1
;
Rel2 movlw 0x20 ; Relais K2 à la réception
subwf TRAME2,W
btfss STATUS,Z
goto Rel3
movlw 0x40
xorwf PORTB,F ; Change l'état du relais K2
;
Rel3 movlw 0x10 ; Relais K3 à la réception
subwf TRAME2,W
btfss STATUS,Z
goto Att ; A
movlw 0x80
xorwf PORTB,F ; Change l'état du relais K3
;
; On attend 2 secondes en mode bistable pour que le poussoir soit relâché
; On attend 2 secondes en mode impulsionnel pour éviter les rebonds du BP
; Trois boucles imbriquées
;
Att movlw 10
movwf K
T0 movlw 255
movwf J
T1 movlw 255
movwf I
T2 decfsz I,F
goto T2
decfsz J,F
goto T1
decfsz K,F
goto T0
;
goto Det1 ; On part relire une trame
;
; On sort d'une inter-trame
; Extraction des 4 bits d'une trame
;
Trame clrf TRAME0 ; TRAME0=0 La trame courante est stockée dans TRAME0
movlw 4 ; Pour lecture des 4 bits
movwf K ; K=4
Ext1 btfsc REC ; On est encore dans l'inter trame
goto Ext2 ; Front montant
goto Ext1 ; On attend le premier front montant
Ext2 btfss REC ; on est sur un état haut, on attend le front descendant
goto Ext3 ; Front descendant
goto Ext2 ; On attend le front descendant
;
Ext3 movlw 120 ; Attente d' 1,5 bit (environ 375 µs)
movwf I ; pour se retrouver au milieu du bit à lire
Temp15 decfsz I,F
goto Temp15
;
movf PORTA,W ; W=PORTA
movwf I ; I=PORTA
rrf I,F ; Trois rotations pour retrouver RA2 (bit à lire) sur Carry
rrf I,F ;
rrf I,F ; REC dans le bit de Carry
rrf TRAME0,F ; sauvegarde du bit qui vient d'être lu dans TRAME0,7
;
movlw 70 ; Attente d'une durée approximative d'un bit
movwf I ; pour se retrouver juste avant le prochain front descendant.
Temp10 decfsz I,F ; 212 µs
goto Temp10
;
decfsz K,F ; On décrémente K
goto Ext2 ; On passe à la lecture du bit suivant
; ; La lecture des 4 bits est terminée
; swapf TRAME0,F ; Le code sur les 4 bits sur le quartet de poids faible
;
movlw 160 ; Les 4 bits ont été lus, on passe le bit Stop et
movwf I ; on saute dans l'inter-trame
Temp16 decfsz I,F ; 482 µs
goto Temp16
;
Return
;
; Tempo de 127 µs
;
Temp300
movlw 41
movwf I
Temp300a
decfsz I,F ; 127 µs ()
goto Temp300a
Return
;
end
0
Rejoignez-nous