Kamelon output

;
; Decodeur de trame pulsadis EJP et préavis EJP
; (pic 12C508 ou 509)
; Alain Gibaud, 20-2-2001
;
; ========================================================
list r=hex,p=p12c508
include "p12c508.inc"
GP0 equ 0
GP1 equ 1
GP2 equ 2
GP3 equ 3
GP4 equ 4
GP5 equ 5
TO equ 4
; masques pour acceder aux pattes
GP0bit equ 1 << GP0
GP1bit equ 1 << GP1
GP2bit equ 1 << GP2
GP3bit equ 1 << GP3
GP4bit equ 1 << GP4
GP5bit equ 1 << GP5
; ========================================================
; affectation des pattes
;
; sorties: (actives niv bas)
NORMAL equ GP0 ; LED verte
ALERTE equ GP1 ; LED orange
EJP equ GP2 ; LED rouge
; entrees:( actives niv bas)
SIGNAL equ GP3 ; avec pull-up, en provenance filtre 175 Hz
; GP4-5 sont utilisees par l'horloge
; ========================================================
; variables:
TICKS equ 0x7 ; compteur de ticks (1 tick = 2/100 s)
SLOT equ 0x8 ; numero slot dans la trame
; =======================================================
; Macros pour alleger le code ...
;
; Teste si min <= (var) < max
; branche en "in" si oui, en "out" si non.
;
Lminmax macro var,min,max,outm,in,outp
movlw min
subwf var,W ; (var) - min
btfss STATUS,C
goto outm ; C=0 => resutat < 0 => var < min
movlw max
subwf var,W ; (var) - max
btfss STATUS,C
goto in
goto outp ; C=1 => resutat >= 0 => var >= min
endm
;
; Attend que le bit "bit" du registre "reg" soit a 1
;
Waitbit1 macro reg,bit
local Wait1
Wait1 btfss reg,bit
goto Wait1
endm
;
; Attend que le bit "bit" du registre "reg" soit a 0
;
Waitbit0 macro reg,bit
local Wait0
Wait0 btfsc reg,bit
goto Wait0
endm
;
; Branche en "label" si (reg) == num, sinon continue
;
Beq macro label,reg,num
movlw num
subwf reg,W
btfsc STATUS,Z
goto label
endm
;
; Branche en "label" si (reg) != num, sinon continue
;
Bne macro label,reg,num
movlw num
subwf reg,W
btfss STATUS,Z
goto label
endm
;
; Branche en "label" si (reg) < num, sinon continue
;
Blt macro label,reg,num
movlw num
subwf reg,W ; reg - W
btfss STATUS,C
goto label ; C=0 => reg - W < 0
endm
;
; Branche en "label" si (reg) >= num, sinon continue
;
Bge macro label,reg,num
movlw num
subwf reg,W ; reg - W
btfsc STATUS,C
goto label ; C=1 => reg - W >= 0
endm
; ========================================================
; CONFIG word ( en FFF )
; bits 11:5 don't care
; bit 4 : MCLRE enabled = 1, tied to Vdd = 0
; bit 3 : code protection off = 1, on = 0
; bit 2 : no watchdog = 0, watchdog = 1
; bit 1-0 ; EXTRC = 00, INTRC = 10, XT = 01, LP = 00
__CONFIG B'000000001101' ; (horloge a quartz, avec watchdog)
; ========================================================
org 0
goto debut
;=========================================================
; sous-programmes
; ========================================================
; regarde si le timer est passe a 0
; si oui, le compteur de ticks est incremente
; et on attend le repassage a 1
; Cette routine DOIT etre appelee tout les 2/100 s ou plus souvent
tickcount
clrwdt
movf TMR0,W
btfss STATUS,Z
retlw 0
incf TICKS,F
; attendre que le timer ait depasse 0
waitnoZ
clrwdt
movf TMR0,W
btfsc STATUS,Z
goto waitnoZ
retlw 0
;
; les 2 fct qui suivent maintiennent, le compteur de ticks
; (en plus de scruter une patte)
; attente d'un signal (logique negative)
waitsignal
call tickcount
btfsc GPIO,SIGNAL
goto waitsignal
retlw 0
; attente fin signal
waitnosignal
call tickcount
btfss GPIO,SIGNAL
goto waitnosignal
retlw 0
; remet a zero le compteur de ticks et le timer et le watchdog
clearticks
clrwdt
clrw
movwf TICKS
movwf TMR0
; pour eviter un timeout immediat, le timer est charge
; a 1, et le 1er tick ne fait que 0.019922s au lieu de 0.2s
; (ce n'est pas grave dans la mesure ou de toute facon,
; le temps de traitement entre les different declenchements
; de chrono n'est pas nul)
incf TMR0,F
retlw 0
;
; ==========================================================
;
debut
; reset par Watchdog ?
btfsc STATUS,TO
goto notimeout
; TO == 0 : OUI
clrwdt
goto 0x1FF ; recalibrage, 0x3FF sur 12C509
; TO == 1 : NON
notimeout
movwf OSCCAL ; recalibrer l'horloge
clrf TMR0 ; RAZ timer
; GPWU=1 : disable wake up on pin change
; GPPU=0 : enable pullups (a voir avec le hard ..)
; T0CS=0 : timer connected to F/4
; T0SE=x : dont't care
; PSA=0 : prescaler assigned to timer
; PS2-0= : timer prescaler 111= 1/256, 101 = 1/64, 011 = 1/16
movlw B'10010101'
option
; config des pattes
movlw B'00001000' ; GP0-2 en sortie, GP3 entree
tris GPIO
; se mettre en mode normal
bcf GPIO,NORMAL
bsf GPIO,ALERTE
bsf GPIO,EJP
attendre_trame
call waitnosignal ; attendre ...
call waitsignal ; ... front montant
call clearticks
call waitnosignal
; 45 tk = 0.9s, 55 tk = 1.1s
Lminmax TICKS,D'45',D'55',attendre_trame,pulse1s,attendre_trame
pulse1s
; attendre 162,5 tk = 2.75 s + 0.5 s = 3.25 s
call clearticks
again325
call tickcount
Lminmax TICKS,D'162',D'162',again325,again325,end325
end325
; on est maintenant au centre du 1er bit
; il suffit d'echantillonner toutes les 2.5s
movlw 1
movwf SLOT
sample btfsc GPIO,SIGNAL ; logique negative
goto slot40
; signal detecte !!
Bne not5,SLOT,D'5' ; slot == 5 ?
; oui - 5 = passage en alerte
bsf GPIO,NORMAL ; bit a 1 = LED eteinte
bsf GPIO,EJP ; bit a 1 = LED eteinte
bcf GPIO,ALERTE ; bit a 0 = LED allumee
goto nextslot
not5
Bne not15,SLOT,D'15' ; slot == 15 ?
; oui
btfsc GPIO,ALERTE ; deja en alerte ?
goto endejp
; oui - 5 & 15 = debut ejp
bsf GPIO,NORMAL ; bit a 1 = LED eteinte
bsf GPIO,ALERTE ; bit a 1 = LED eteinte
bcf GPIO,EJP ; bit a 0 = LED allumee
goto nextslot
endejp
; non - 15 seul = fin ejp
bsf GPIO,EJP ; bit a 1 = LED eteinte
bsf GPIO,ALERTE ; bit a 1 = LED eteinte
bcf GPIO,NORMAL ; bit a 0 = LED allumee
goto nextslot
not15
slot40
; slot 40 ?
Bne nextslot,SLOT,D'40' ; slot == 40 ?
; et attendre une nouvelle trame
goto attendre_trame
nextslot
incf SLOT,F
; si le signal est a 1, on en profite pour se resynchroniser
; sur son front descendant, au cas ou l'emetteur ne soit pas
; bien conforme au protocole.
btfss GPIO,SIGNAL
goto resynchro
; attendre 125 ticks = 2.5s
call clearticks
again125
call tickcount
Lminmax TICKS,D'125',D'126',again125,sample,again125
resynchro
call waitnosignal
call clearticks
again100 ; attente 2 s (100 ticks)
call tickcount
Lminmax TICKS,D'100',D'101',again100,sample,again100
end