summaryrefslogtreecommitdiffstats
path: root/kate/tests/ejp1.asm
diff options
context:
space:
mode:
Diffstat (limited to 'kate/tests/ejp1.asm')
-rw-r--r--kate/tests/ejp1.asm285
1 files changed, 285 insertions, 0 deletions
diff --git a/kate/tests/ejp1.asm b/kate/tests/ejp1.asm
new file mode 100644
index 000000000..d94dc4ca0
--- /dev/null
+++ b/kate/tests/ejp1.asm
@@ -0,0 +1,285 @@
+;
+; 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
+
+