
rawigoto
|
; 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
|