;================================================= ===========================================
; Émetteur 8 voies pour télécommande
; Doumai.Terret*Wanadoo.fr
; Merci de laisser mon Mail pour toute modification du logiciel
;================================================= ===========================================
;
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
#DEFINE ALIM PORTA,0 ; Alimentation de l'émetteur si 0
#DEFINE EM1 PORTA,1 ; Signal à émettre
#DEFINE LED PORTB,6 ; LED d'indication de l'émission si 1
#DEFINE COL1 PORTB,4 ; Clavier Colonne 1 - S1 à S4
#DEFINE COL2 PORTB,5 ; Clavier Colonne 2 - S5 à S8
;
cblock 0x20
MOT : 1 ; Sauvegarde de l'état des BP
MOT1 : 1 ; Mot de 8 bit à émettre
I : 1 ; Comptage Tempo
J : 1 ; Comptage général
w_temp : 1 ; Pour interruption
status_temp : 1 ; Pour interruption
endc
;
;================================================= ===========================================
ORG 0x0000
goto main
;
ORG 0x0004
goto inter
;
main: 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'00110000' ; RB0 à RB3 en sortie clavier
movwf TRISB ; RB4 et RB5 en entrée clavier
clrf TRISA ; PortA en sortie
bcf STATUS,RP0 ; Bank 0
;
movlw 0x01 ;
movwf PORTA ; ALIM = 1, transistor bloqué
movlw 0x0F ; RB0 à RB3 = 1,
movwf PORTB ; attente d'interruption sur RB4 ou RB5
;
bcf INTCON,RBIF ; RAZ flag d'interruption sur RB4 à RB7
movlw 0x88 ; Valide les GIE et
movwf INTCON ; les interruptions sur RB4 à RB7
Dodo sleep ; Mode sommeil, en attente
goto Dodo ; d'une interruption
;
; ================================================== ================================
; Gestion de l'interruption sur modification RB4 ou RB5 (action sur un BP)
; ================================================== ================================
inter:
; Sauvegarde des registres W et STATUS (Normalement inutile)
movwf w_temp
swapf STATUS,W
movwf status_temp
;
bcf STATUS,RP0 ; Bank 0
bcf INTCON,GIE ; Désactive une nouvelle interruption
;
bcf ALIM ; Alimente l'émetteur
;
;==================================
; Lecture des boutons poussoirs
;==================================
;
Lect movlw 0x01 ; Lecture de S1
movwf MOT ; État des BP dans MOT
movlw 0x08 ; RB3 = 1
movwf PORTB
nop
btfsc PORTB,4 ; Test si S1 est actionné, skip dans le cas contraire
goto FinL ; S1 actionné, fin de la lecture des 8 BP
;
movlw 0x02 ; Lecture de S2
movwf MOT ; État des BP dans MOT
movlw 0x04 ; RB2 = 1
movwf PORTB
nop
btfsc PORTB,4 ; Test si S2 est actionné, skip dans le cas contraire
goto FinL ; S2 actionné, fin de la lecture des 8 BP
;
movlw 0x04 ; Lecture de S3
movwf MOT ; État des BP dans MOT
movlw 0x02 ; RB1 = 1
movwf PORTB
nop
btfsc PORTB,4 ; Test si S3 est actionné, skip dans le cas contraire
goto FinL ; S3 actionné, fin de la lecture des 8 BP
;
movlw 0x08 ; Lecture de S4
movwf MOT ; État des BP dans MOT
movlw 0x01 ; RB0 = 1
movwf PORTB
nop
btfsc PORTB,4 ; Test si S4 est actionné, skip dans le cas contraire
goto FinL ; S4 actionné, fin de la lecture des 8 BP
;
movlw 0x10 ; Lecture de S5
movwf MOT ; État des BP dans MOT
movlw 0x08 ; RB3 = 1
movwf PORTB
nop
btfsc PORTB,5 ; Test si S5 est actionné, skip dans le cas contraire
goto FinL ; S5 actionné, fin de la lecture des 8 BP
;
movlw 0x20 ; Lecture de S6
movwf MOT ; État des BP dans MOT
movlw 0x04 ; RB2 = 1
movwf PORTB
nop
btfsc PORTB,5 ; Test si S6 est actionné, skip dans le cas contraire
goto FinL ; S6 actionné, fin de la lecture des 8 BP
;
movlw 0x40 ; Lecture de S7
movwf MOT ; État des BP dans MOT
movlw 0x02 ; RB1 = 1
movwf PORTB
nop
btfsc PORTB,5 ; Test si S7 est actionné, skip dans le cas contraire
goto FinL ; S7 actionné, fin de la lecture des 8 BP
;
movlw 0x80 ; Lecture de S8
movwf MOT ; État des BP dans MOT
movlw 0x01 ; RB0 = 1
movwf PORTB
nop
btfsc PORTB,5 ; Test si S8 est actionné, skip dans le cas contraire
goto FinL
;
clrf MOT ; Aucune touche d'actionnée MOT = 0
FinL bsf LED ; LED allumée
;
;==============================================
; Émission
; Une trame comprend 8 bits suivie d'un Stop
; Un bit est constitué d'un Start à l'état 1
; suivi d'un 0 suivi par l'état du bit
;==============================================
Trame movf MOT,W
movwf MOT1 ; État des interrupteurs dans MOT1
movlw 0x08
movwf J ; J=8 pour les 8 bits à transmettre
DebBit bsf EM1 ; Start du 1er bit,
call Temp250 ; d'une durée de 250

s
bcf EM1 ; Front descendant
call Temp250 ; État 0 durant 250

s
rlf MOT1,F ; Bit à émettre danc Carry
btfss STATUS,C ; Test si le bit courant est à 1
goto Ec0 ; On va écrire un 0 sur l'entrée de l'émetteur
bsf EM1 ; Bit à émettre à 1
call Temp250 ; État 1 durant 250

s
goto FinBit ; Fin d'émission d'une trame
Ec0 nop
bcf EM1 ; Bit à émettre à 0
call Temp250 ; État 0 durant 250

s
FinBit decfsz J,F ; J = J - 1
goto DebBit ; Si J<>0 on retourne émettre un bit
;
bsf EM1 ; Bit Stop à 1
call Temp250 ; État 1 durant 250

s
bcf EM1 ; Signal à l'état 0
;==============================================
; Inter Trame
;==============================================
movlw 8 ; 8 fois 250

s = 2ms d'inter-trame
movwf J ; 2ms à l'état 0 entre deux trames
InterT call Temp250
decfsz J,F
goto InterT
;
;==============================================
; Test si une touche est encore actionnée,
; sinon fin d'interruption et mode sleep
;==============================================
movf MOT,W ; W = MOT
btfss STATUS,Z ; Skip si MOT = 0
goto Lect ; On retourne lire l'état des BP
;
bsf ALIM ; Coupe l'alimentation de l'émetteur
movlw 0x0F ; LED éteinte et RB0 à RB3 = 1,
movwf PORTB ; pour l'attente de la prochaine interruption
;
bcf INTCON,RBIF ; Efface le flag d'interruption
movlw 0x88 ; Valide les GIE et
movwf INTCON ; les interruptions sur RB4 à RB7
; =============================================
; Restauration des registres W et STATUS
; =============================================
swapf status_temp,W
movwf STATUS
swapf w_temp,F
swapf w_temp,W
;
retfie
;
;=========================================
; Tempo de 250

s avec un quartz de 4 MHz
;=========================================
Temp250 movlw 80
movwf I
Temp250a
decfsz I,F
goto Temp250a
Return
;
end