; PROGRAM TIL STYRING AF PULSER TIL PI DETEKTOR
; REV. 4.0
; REV. 13/06-98
; AF MARK PAULS
;
; Ved opstart allerførste gang holdes RA4 (port A.4) høj og
; derved intialiseres rec, puls, wait tiden i EE prommen.
; Hvis RA4 er lav under start aflæses EE prommen istedet.
; Bemærk at RA4 har dobbelt funktion idet den ved høj (efter
; start kan bruges (via RA0,RA1) til justering af antal pulser
; HUSK at sætte lav igen inden næste ON/OFF.
;
;
;
; LIST P=16C84, F=INHX8M
include "p16c84.inc" ;
; uP PIC16C84 include modul ver. 1.00
;----------------- DIV -----------------
ORG 0 ;Dummy origin
goto INIT; ;hop til INIT
;-------------Constanter--------------
d1 equ .20 ; pulstid i us
d2 equ .10 ; (wait before rec.) vent på respons i us
d3 equ .5 ; modtag i ms
d4 equ .40 ; (ms wait before next) vent ms inden n‘ste puls
delay equ .6; ; delay til 1 ms timer
loop equ 0Ch ; RAM 0C
xus equ 10h ; RAM 10
xms equ 11h ; RAM 11
puls_time equ 15h ; RAM 15
w_b_r equ 16h ; RAM 16
rec_time equ 17h ; RAM 17
w_b_n equ 18h ; RAM 18
; RAM 11 ;benyttes af x ms timer
; RAM 12,13 ;benyttes af us timer
; RAM 14 ;8 flag, F0..F7
; RAM 15 ;puls_time
; RAM 16 ;w_b_r
; RAM 17 ;rec_time
; RAM 18 ;w_b_n
;
; EEADR 00 ;s‘ttes 0 ved opstart
;---------------- TIMER ------------------
wait_1us; ; ca 1us wait
nop;
return
wait_xus ;vent x mikrosek.
J4
call wait_1us
decfsz xus,1 ;T‘l xus-1
goto J4
return
wait_1ms; ;1 ms timer
movlw .5 ;antal gennemloeb for 1 ms
movwf 13 ;flyt w til RAM 13
J2 movlw delay; ;w = delay (korrigering)
movwf 12 ;flyt w til RAM 12
J1 decfsz 12,1 ;T‘l RAM12-1 eller fors‘t
goto J1 ;repeat
decfsz 13 ;T‘l RAM13-1 eller slut
goto J2 ;repeat
return
wait_xms; ;Vent x millisek
J3 call wait_1ms
decfsz xms,1 ;T‘l xms-1
goto J3
return
;----------- EEPROM MODUL TIL PIC16C84
;Rev 1.00
;d.27/07-95
; note: use timer
wadr equ 2Fh ; adresse i RAM 2F
value equ 2Eh ; Data i RAM 2E
WR_EEPROM ; skriv EEPROM (data i RAM 2E+adr i RAM 2E)
movf wadr,W ; w=adr
movwf EEADR ; EEADR=w
movf value,W ; w=data
movwf EEDATA ; EEDATA=w
; --- write sequnce
bsf STATUS,RP0 ; EEPROM write enable
bcf INTCON,GIE ; disable interupts
movlw 0x55 ; w=55h
movwf EECON2 ; EECON2=w
movlw 0xAA ; w=AAh
movwf EECON2 ; EECON2=w
bsf EECON1,WR ; EECON1=write
movlw .100 ;load tid skrivning
movwf xms ;flyt w til xms
call wait_xms ;vent i ms
; --- end
;return
RD_EEPROM ; adr.skal v‘re i RAM 2F
movf wadr,W ; data afleveres i RAM 2E
movwf EEADR ; EEADR=w (adr)
bsf STATUS,RP0 ; bank 1
bsf EECON1,RD ; set RD bit (slukker selv)
bcf STATUS,RP0 ; bank 0
movf EEDATA,W ; w=data
movwf value ; data=w
; --- end
return
;-------------- END EEPROM MODUL
;------------ DATA ÆNDRINGER -----------
Update
btfsc 5,4 ;tjek først bit 4
goto pulsjust ;juster antal pulser
btfsc 5,0 ;Hvis bit 0 er sat
incf rec_time,1 ;"step up" rec. time + 1
btfsc 5,1 ;Hvis bit 1 er sat
decfsz rec_time,1 ;"step down" rec. time - 1
btfsc 5,2 ;Hvis bit 2 er sat
incf w_b_r,1 ;"step up" wait before rec + 1
btfsc 5,3 ;Hvis bit 3 er sat
decfsz w_b_r,1 ;"step down" wait before - 1
goto slut ;ellers slut
;hvis 5.4
pulsjust
btfsc 5,0 ;Hvis bit 0 og 4 er sat
incf puls_time,1 ;"step up" puls + 1
btfsc 5,1 ;Hvis bit 1 og 4 er sat
decfsz puls_time,1 ;"step down" puls - 1
GOTO slut ;hop til slut
slut
;opsæt adresse + data til EEPROM ændring
;gem antal pulser
movf puls_time,W ;flyt til W
movwf value ;value = rec_time
movwf wadr ;set adresse
movlw 01h ;til 01 hex i EE
CALL WR_EEPROM ;skriv i EE
;gem ventetid før modtagning
movf w_b_r,W ;flyt til W
movwf value ;value = rec_time
movwf wadr ;set adresse
movlw 02h ;til 02 hex i EE
CALL WR_EEPROM ;skriv i EE
;gem modtager tid
movf rec_time,W ;flyt til W
movwf value ;value = rec_time
movwf wadr ;set adresse
movlw 03h ;til 03 hex i EE
CALL WR_EEPROM ;skriv i EE
;timer start
movlw 04h
movwf loop ;sæt 2 i RAM 0C
T_1
nop ;VENT 1 sek
movlw .255; ;1/4 sek load
movwf xms ;flyt w til xms
call wait_xms ;vent i w_b_n ms
decfsz loop,1 ;loop
goto T_1
;end
return
DEFAULT
movlw d1 ; w= delay 1
movwf puls_time ; Puls tid = w
movwf d2 ; w= delay 2
movwf w_b_r ; wait before receive
movwf value ; data (EE) = w
movlw d3 ; w= delay 3
movwf rec_time ; record time
movwf value ; data (EE) = w
movlw d4 ; w= delay 4
movwf w_b_n ; ventetid (slettes sidenhen)
CALL Update ; skriv til EE
goto MAIN
;--------------INIT-------------------
INIT
;output init
movlw B'11111111' ;set w= 0D
movwf PORTB ;flyt w til port B
movlw B'00000000' ;set w= 00
tris PORTB ;set alle I/O retning til ud
;input init
movlw B'11111' ;set bit 0..4 til input
tris PORTA ;sæt port A
;init RAM/EEPROM
btfsc PORTA,4 ;Hvis port A bit 0 læs default
goto DEFAULT
movlw 01h; ;w=01h
movwf wadr ;adr=w
call RD_EEPROM ;Læs EE
movf value,W ;w=data fra EEPROM
movwf puls_time ;puls=w
movlw 02h; ;w=02h
movwf wadr ;adr=w
call RD_EEPROM ;Læs EE
movf value,W ;w=data fra EEPROM
movwf w_b_r ;wait before receive
movlw 03h; ;w=03h
movwf wadr ;adr=w
call RD_EEPROM ;Læs EE
movf value,W ;w=data fra EEPROM
movwf rec_time ;record time
movlw d4 ;w=d4 (slettes sidenhen)
movwf w_b_n ;ventetid (slettes sidenhen)
goto MAIN; ;HOP TIL HOVEDLØKKE
;---------------- PULS -------------------
puls
bcf PORTB,0 ;s‘t bit 3 = 0 (output)
movf puls_time,0 ;flyt puls_time til w
movwf xus ;flyt tid til RAM11
call wait_xus ;vent i x us
bsf PORTB,0
return
;--------------- MODTAG ------------------
Receiver
bcf PORTB,3 ;s‘t bit 0 = 0 (modtager åbner)
movf rec_time,0 ;flyt tid i us til w
movwf xus ;flyt tid i RAM16
call wait_xus ;vent i x us
bsf PORTB,3 ;luk modtager
return
;-----------------MAIN--------------
MAIN
; Puls
call puls ;kald puls rutine
; vent
movf w_b_r,W ;load w med ventetid
movwf xus ;flyt w til xus
call wait_xus ;vent i w_b_r us
; modtag
call Receiver ;åben modtager
; vent
movf w_b_n,W ;load tid til næste puls
movwf xms ;flyt w til xms
call wait_xms ;vent i w_b_n ms
; aflæs input
btfsc 5,0 ;hvis up aktiv
call Update ;kald update
btfsc 5,1 ;hvis down aktiv
call Update ;kald update
btfsc 5,2 ;hvis up aktiv
call Update ;kald update
btfsc 5,3 ;hvis down aktiv
call Update ;kald update
; repeat
goto MAIN
end
;SLUT