
	LIST P=16F628, R=DEC    

        #include "P16F628.INC"  

         __config  _XT_OSC &_LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON 


   temp         equ       h'3a'
   temp1        equ       h'3b'
   cas0         equ       h'3c'
   cas1         equ       h'3d'
   cas2         equ       h'3e'
   count1       equ       h'3f'
   count2       equ       h'40'
   count3       equ       h'41'
   count4       equ       h'42'
     

w               equ             0
f               equ             1

#define   pwm      PORTA,0
#define   clock    PORTA,1
#define   vdd      PORTA,2
#define   led      PORTA,3
    
	ORG 0
	goto init		
	ORG 4

        retfie
  
init    
	movlw 7
	movwf CMCON		       

	bcf STATUS,RP0	
	bcf STATUS,RP1
        bcf STATUS,IRP
	call wait_1		
	call wait_1
        bsf STATUS,RP0          
	bcf OPTION_REG, 7		
        movlw b'11110000'		
        movwf TRISA		
        movlw b'01111010'	
        movwf TRISB
        clrf   INTCON
        bcf    PIE1,RCIE
        movlw 0x19              
        movwf SPBRG
        movlw b'00100100'       
        movwf TXSTA             
 	bsf	OPTION_REG,PS0			
 	bsf	OPTION_REG,PS1
 	bcf	OPTION_REG,PS2
 	bcf	OPTION_REG,PSA
        bcf     OPTION_REG,T0CS			 	
        bcf STATUS,RP0           
    	movlw b'10010000'       
        movwf RCSTA	
        clrf   FSR
        clrf   INDF
        bcf    pwm
        bcf    clock
        bcf    vdd  
        bcf    PORTB,0


 
main1   call   recieve
        movwf  temp
        movlw  H'50'
        subwf  temp,w
        btfsc  STATUS,Z
        goto   prog
        movlw  H'56'
        subwf  temp,w
        btfsc  STATUS,Z
        goto   ver
        movlw  H'52'
        subwf  temp,w
        btfsc  STATUS,Z
        goto   read
      
        goto   main1
; Programming algorithms:
; HCS500 (dekoder) - 0x29, 9 byte
; HCS512 (dekoder) - 0x23, 10 byte
; HCS515 (dekoder) - 0x29, 9 byte
; HCS101 (enkoder) - 0x0D, 25 byte
; HCS200 (enkoder) - 0x01, 24 byte
; HCS201 (enkoder) - 0x0B, 25 byte
; HCS300/301 (enkoder) - 0x02, 24 byte
; HCS320 (enkoder) - 0x0A, 24 byte
; HCS360 (enkoder) - 0x03, 24 byte
; HCS361 (enkoder) - 0x04, 24 byte
; HCS362 (enkoder) - 0x0C, 36 byte
;**************************************************************

prog    
        movlw  'p'
        call   send
        call   recieve
        movwf  temp
        movlw  h'ff'
        xorwf  temp,w
        call   send
        call   recieve
        movwf  temp
        movwf  count1
        movwf  count2
        movwf  count3
        movwf  count4
        movlw  h'ff'
        xorwf  temp,w
        call   send
        movlw   H'20'
        movwf   FSR
        call    recieve
        movwf   INDF
        incf    FSR
        decfsz  count1,f
        goto    $-4
        movlw   H'20'
        movwf   FSR
        movlw   H'ff'
        xorwf   INDF,w
        call    send
        incf    FSR
        movlw   252
        call    wait_t
        decfsz  count2,f
        goto    $-7 
        goto    program

ver     movlw  118
        call   send
        call   wait_480
        movlw  2
        call   send
        call   wait_480
        movlw  96
        call   send
        call   wait_480
        movlw  0
        call   send      
        goto   main1

read    movlw  'R'
        call   send 
        goto   main1

program  
         movf  count3,w
         movwf count2
         bcf   STATUS,C
         rrf   count2,f 
         bsf   STATUS,RP0
         bcf   TRISA,0
         bcf   STATUS,RP0
         bcf   pwm
         bcf   clock
         bsf   vdd
         movlw  20        ;36ms
         call   wait_th
         bsf    clock
         movlw  12 
         call   wait_t     ;3.9ms
         bsf    pwm  
         movlw  12
         call   wait_t     ;3.9ms
         bcf    pwm
         movlw  251
         call   wait_t     ;96us
         bcf    clock
         movlw  236        ;3,9ms
         call   wait_th
         movlw  h'20'
         movwf  FSR
loop2    movf   INDF,w
         movwf  temp
         call   prog8b
         incf   FSR
         movf   INDF,w
         movwf  temp
         call   prog8b
         bcf    pwm
         movlw  29
         call   wait_th
         incf   FSR
         decfsz  count2,f
         goto    loop2
         goto    verif
    
        


prog8b  movlw   d'8'
        movwf   count1
c8      bcf    STATUS,C
        rrf    temp,f
        btfss  STATUS,C
        bcf    pwm
        btfsc  STATUS,C
        bsf    pwm
        bsf    clock
        movlw  251
        call   wait_t
        bcf    clock
        movlw   251
        call   wait_t
        decfsz  count1
        goto    c8
        return
;verification

verif    
         bsf   STATUS,RP0
         bsf   TRISA,0
         bcf   STATUS,RP0
         movlw  h'45'
         movwf  FSR
loop     call   verif8b
         movwf  INDF
         incf   FSR
         decfsz  count3,f
         goto   loop
         goto    compare

verif8b  clrf   temp1
         movlw  8
         movwf  count1
v8       bcf    STATUS,C
         btfsc  pwm
         bsf    STATUS,C
         rrf    temp1,f
         bsf    clock
         movlw  251
         call   wait_t
         bcf    clock
         movlw  251
         call   wait_t
         decfsz  count1
         goto    v8
         movf    temp1,w
         return

sendv    
         movlw   h'45'
         movwf   FSR
         movlw   254
         call    wait_t
         movf    INDF,w
         call    send
         incf    FSR
         decfsz  count4,f
         goto    $-6
         goto    main1

compare  
         movlw   h'20'
         movwf   count1
         movlw   h'45'
         movwf   count2
loop1    movf    count1,w
         movwf   FSR
         movf    INDF,w
         movwf   temp
         movf    count2,w
         movwf   FSR
         movf    INDF,w
         subwf   temp,w
         btfss   STATUS,Z
         goto    err
         incf    count1,f
         incf    count2,f
         decfsz  count4,f
         goto    loop1
         bcf     vdd
         bcf    PIE1,RCIE
         movlw   '0'
         call    send
         goto    main1

 err     bcf    PIE1,RCIE
         bcf    vdd
         movlw   '1'
         call   send
         goto   main1
                  
send	movwf TXREG            
        bsf STATUS,RP0		
WtHere  btfss TXSTA,TRMT        
        goto WtHere
        bcf STATUS,RP0          
        return

recieve 

	
	BTFSS	RCSTA,OERR
	GOTO	$+3
	BCF RCSTA,CREN
	BSF RCSTA,CREN
	BTFSS PIR1,RCIF
	GOTO $-1
	MOVF RCREG,W
	RETURN

wait_1	
        MOVLW 0x15  ;21 DEC
        MOVWF cas2
        MOVLW 0x59  ;89 DEC
        MOVWF cas1
        MOVLW 0x0B1  ;177 DEC
        MOVWF cas0
        DECFSZ cas0,F
        GOTO $-1
        DECFSZ cas1,F
        GOTO $-5
        DECFSZ cas2,F
        GOTO $-9
	return

wait
        MOVLW 0x0E5  ;229 DEC
        MOVWF cas1
        MOVLW 0x0D9  ;217 DEC
        MOVWF cas0
        DECFSZ cas0,F
        GOTO $-1
        DECFSZ cas1,F
        GOTO $-5
	return

wait_480
        MOVLW  32  ;229 DEC
        MOVWF cas1
        MOVLW  5  ;217 DEC
        MOVWF cas0
        DECFSZ cas0,F
        GOTO $-1
        DECFSZ cas1,F
        GOTO $-5
	return

wait_t
         movwf  TMR0        ;253-50uS
         btfss  INTCON,T0IF
         goto   $-1
         bcf    INTCON,T0IF
         return

wait_th  movwf  TMR0 
         bsf    STATUS,RP0
         bsf    OPTION_REG,PS2
         bcf    STATUS,RP0
         btfss  INTCON,T0IF
         goto   $-1
         bcf    INTCON,T0IF
         bsf    STATUS,RP0
         bcf    OPTION_REG,PS2
         bcf    STATUS,RP0
         return



         END	