16c84 hexi 16f84 yapabilirmiyiz?

Başlatan rayman, 19 Ekim 2017, 10:59:44

rayman

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