Home Page . . . . . . . Email: . . . . . . . . neelandan-at-gmãil·çöm

;=======ESR.ASM===================================08/may/04==
        list    p=16f876
        radix   hex
        ERRORLEVEL  -302    ;SUPPRESS BANK SELECTION MESSAGES
;------------------------------------------------------------
;     cpu equates (memory map)
indf		equ     0x00
tmr0		equ     0x01
status		equ     0x03
fsr		equ     0x04
porta		equ     0x05
portb		equ     0x06
portc		equ     0x07
intcon		equ     0x0b
adc_hi		equ	0x1e
adcon0		equ	0x1f
count1		equ     0x20
count2		equ     0x21
count3		equ     0x22
tick_lo		equ     0x23
tick_mid	equ     0x24
tick_hi		equ     0x25
t_tim		equ	0x26
t_lo		equ	0x27
t_mid		equ	0x28
t_hi		equ	0x29
rel_tmr		equ	0x2a
rel_lo		equ	0x2b
rel_mid		equ	0x2c
rel_hi		equ	0x2d
safe_w		equ	0x2e
safe_s		equ     0x2f
disp_u		equ	0x30
disp_1		equ	0x40
flags		equ     0x50
keys		equ     0x51
scratch		equ     0x52
temp		equ	0x53
ii		equ	0x54
cnt		equ	0x55
acc		equ	0x56
bcd		equ	0x5b
ascii		equ	0x60
ptr_bcd		equ	0x6a
ptr_asc		equ	0x6b
accx		equ	0x6c
option_reg	equ     0x81
trisa 		equ     0x85
trisb		equ     0x86
trisc		equ     0x87
adc_lo		equ	0x9e
adcon1		equ	0x9f
ACCaLO		equ	accx+0
ACCaMID		equ	accx+1
ACCaHI		equ	accx+2
ACCbLO		equ	accx+3
ACCbMID		equ	accx+4
ACCbHI		equ	accx+5
ACCcLO		equ	accx+6
ACCcMID		equ	accx+7
ACCcHI		equ	accx+8
ACCdLO		equ	accx+9
ACCdMID		equ	accx+0x0a
ACCdHI		equ	accx+0x0b
;
;------------------------------------------------------------
;     bit equates
w	equ	0
f	equ	1
c	equ	0
dc	equ	1
z	equ	2
rp0	equ	5
;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
;     Port Configuration Words
Port_A_Config	equ b'00001011'
;/NA/NA/3K3/5mA/Vref/50mA/An1/An0/
;
;      Port A bit equates
An0  equ 0
An1  equ 1
i50  equ 2
i5   equ 4
R3k  equ 5
;
;
Port_B_Config	equ b'10101100'
;/NU/backlight/CompIn/CapDis/Prog/Key/lcdDC/lcdEn/
;
;       Port B bit equates
lcdEn  equ 0
lcdDc  equ 1
key    equ 2
Capdis equ 4
CompIn equ 5
Blight equ 6
;
;
Port_C_Config	equ	b'00000000'
;/All outputs for LCD data/
;
;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;------------------------------------------------------------
		;
 org 0x000	;  Device Reset
 b start	;
;
;------------------------------------------------------------
;
      org             0x004	; *** Interrupt ***
;
   	 movwf   safe_w         ;save w
   	 swapf   status,w       ;swap status, w
   	 movwf   safe_s         ;save status  
; 	 incf    tick_lo,f      ;increment first
;  	 btfsc   status,z
 	 incf    tick_mid,f     ;increment second
   	 btfsc   status,z
  	 incfsz  tick_hi,f      ;increment third
 	 goto    tick_out
	 b timeout	    ;Time Out!
tick_out swapf  safe_s,w    ;fetch status, reswap nibbles
	movwf   status      ;restore status
	swapf   safe_w,f    ;swap nibbles in preparation
	swapf   safe_w,w    ;for the swap restoration of w
	bcf     intcon,2    ;clear interrupt flag
	retfie              ;return from interrupt
;
;
;------------------------------------------------------------
;
start
;
;		INITIALISE PORTS
;
        bsf      status,rp0  ;switch to bank 1
        movlw	Port_A_Config
        movwf	trisa
        movlw	Port_B_Config
        movwf	trisb
        movlw	Port_C_Config
        movwf	trisc

;		Initialise Analogue to Digital Converter

        movlw	0xf5	   ;2 ana in & Vref+ & left just
	movwf	adcon1
        bcf     status,rp0 ;switch back to bank 0
        movlw   0xfe 	   ;all outputs inactive
        movwf   portb
	movlw	0xff
        movwf   porta
        movwf   portc
	movlw	0xc3
	movwf	adcon0	   ; setup ADC for single ch input
	call	timer_init ;start timer
        call    del_5      ;allow lcd time to initialize
        call    initlcd    ;initialize display
	call	cap
	call	esr
	call	disp32	   ;initial message in display
	b circle
;
;
;------------------------------------------------------------
; Create Text messages to be shown on the display
;------------------------------------------------------------
;
msg  movlw     'F'
     movwf     0x30
     movlw     'a'
     movwf     0x31
     movlw     'r'
     movwf     0x32
     movlw     'a'
     movwf     0x33
     movlw     'd'
     movwf     0x34
     movlw     ' '
     movwf     0x35
     movlw     'E'
     movwf     0x36
     movlw     'S'
     movwf     0x37
     movlw     'R'
     movwf     0x38
     movlw     ' '
     movwf     0x39
     movlw     'M'
     movwf     0x3a
     movlw     'e'
     movwf     0x3b
     movlw     't'
     movwf     0x3c
     movlw     'e'
     movwf     0x3d
     movlw     'r'
     movwf     0x3e
     movlw     ':'
     movwf     0x3f
     return
;
;------------------------------------------------------------
;
nam1 movlw     'A'
     movwf     0x40
     movlw     'n'
     movwf     0x41
     movlw     'u'
     movwf     0x42
     movlw     'r'
     movwf     0x43
     movlw     'o'
     movwf     0x44
     movlw     'o'
     movwf     0x45
     movlw     'p'
     movwf     0x46
     movlw     ' '
     movwf     0x47
     movlw     'J'
     movwf     0x48
     movlw     'o'
     movwf     0x49
     movlw     'y'
     movwf     0x4a
     movlw     ' '
     movwf     0x4b
     movlw     ' '
     movwf     0x4c
     movlw     ' '
     movwf     0x4d
     movwf     0x4e
     movwf     0x4f
     return
;
;------------------------------------------------------------
;
nam2 movlw     'J'
     movwf     0x40
     movlw     'o'
     movwf     0x41
     movlw     's'
     movwf     0x42
     movlw     'e'
     movwf     0x43
     movlw     ' '
     movwf     0x44
     movlw     'G'
     movwf     0x45
     movlw     'e'
     movwf     0x46
     movlw     'o'
     movwf     0x47
     movlw     'r'
     movwf     0x48
     movlw     'g'
     movwf     0x49
     movlw     'e'
     movwf     0x4a
     return
;
;------------------------------------------------------------
;
nam3 movlw     'K'
     movwf     0x40
     movlw     'h'
     movwf     0x41
     movlw     'a'
     movwf     0x42
     movlw     'd'
     movwf     0x43
     movlw     'a'
     movwf     0x44
     movlw     'r'
     movwf     0x45
     movlw     ' '
     movwf     0x46
     movlw     'A'
     movwf     0x47
     movlw     ' '
     movwf     0x48
     movlw     'N'
     movwf     0x49
     movlw     ' '
     movwf     0x4a
     return
;
;------------------------------------------------------------
;
nam4 movlw     'P'
     movwf     0x40
     movlw     'r'
     movwf     0x41
     movlw     'a'
     movwf     0x42
     movlw     'v'
     movwf     0x43
     movlw     'e'
     movwf     0x44
     movlw     'e'
     movwf     0x45
     movlw     'n'
     movwf     0x46
     movlw     'r'
     movwf     0x47
     movlw     'a'
     movwf     0x48
     movlw     'j'
     movwf     0x49
     movlw     'M'
     movwf     0x4b
     movlw     'R'
     movwf     0x4d
     return
;
;------------------------------------------------------------
;
cap  movlw     'C'
     movwf     0x30
     movlw     'a'
     movwf     0x31
     movlw     'p'
     movwf     0x32
     movlw     ' '
     movwf     0x33
     movlw     '='
     movwf     0x34
     movlw     ' '
     movwf     0x35
     movwf     0x3d
     movlw     '0'
     movwf     0x36
     movwf     0x37
     movwf     0x38
     movwf     0x39
     movwf     0x3a
     movwf     0x3b
     movwf     0x3c
     movlw     0xe4 ;micro
     movwf     0x3e
     movlw     'F'
     movwf     0x3f
     return
;
;____________________________________________________________
;
esr  movlw     'E'
     movwf     0x40
     movlw     'S'
     movwf     0x41
     movlw     'R'
     movwf     0x42
     movlw     ' '
     movwf     0x43
     movlw     '='
     movwf     0x44
     movlw     ' '
     movwf     0x45
     movlw     '0'
     movwf     0x46
     movlw     '0'
     movwf     0x47
     movlw     '0'
     movwf     0x48
     movlw     ' '
     movwf     0x49
     movlw     0xf4 ;ohm
     movwf     0x4a
     movlw     ' '
     movwf     0x4b
     movlw     ' '
     movwf     0x4c
     movlw     ' '
     movwf     0x4d
     return
;------------------------------------------------------------
;
e_err	movlw	't'
	movwf	0x46
	movlw	'o'
	movwf	0x47
	movlw	'o'
	movwf	0x48
	movlw	' '
	movwf	0x49
	movlw	'h'
	movwf	0x4a
	movlw	'i'
	movwf	0x4b
	movlw	'g'
	movwf	0x4c
	movlw	'h'
	movwf	0x4d
	b disp32
;
;------------------------------------------------------------
;
c_err	movlw	'L'
	movwf	0x36
	movlw	'e'
	movwf	0x37
	movlw	'a'
	movwf	0x38
	movlw	'k'
	movwf	0x39
	movlw	'y'
	movwf	0x3a
	movlw	' '
	movwf	0x3b
	movwf	0x3c
	movwf	0x3d
	movwf	0x3e
	movwf	0x3f
	return	
;
;____________________________________________________________
;
timer_init
	bcf	intcon,2 ;clear tmr0 int flag
	bsf     intcon,7 ;enable global interrupts
	bsf     intcon,5 ;enable tmr0 int
	clrf    tmr0	 ;clear timer
 	movlw   option_reg ;Work around the OPTION
	movwf   fsr 	 ;warning
	movlw   0x58	 ;set up timer. no presc 
	movwf   indf	 ;pullups enabled on B port
	clrf    tmr0	 ;start timer
	return		 ;return to calling routine
;
;------------------------------------------------------------
;
credits call    msg     ;create message in display RAM
	call    nam1
        call    disp32  ;send 32 characters to display
	call 	wait
	call	nam2
	call 	disp32
	call 	wait
	call	nam3
	call	disp32
	call	wait
	call	nam4
	call	disp32
	call	wait
  goto   credits        ;keep doing it
;
;------------------------------------------------------------
;
initlcd bcf    portb,lcdEn     	;E line low
     bcf       portb,lcdDc     	;RS line low, set up for control
     call      del_125   	;delay 125 microseconds
     movlw     0x3f        	;8-bit, 5X7
     movwf     portc      	;0011 1111
     call      pulse    	;pulse and delay
     call      del_125     	;delay 125 microseconds
     movlw     0x3f       	;8-bit, 5X7
     movwf     portc      	;0011 1111
     call      pulse       	;pulse and delay
     call      del_125   	;delay 125 microseconds
     movlw     0x3f       	;8-bit, 5X7
     movwf     portc      	;0011 1111
     call      pulse      	;pulse and delay
     call      del_125    	;delay 125 microseconds
     movlw     0x3f       	;8-bit, 5X7
     movwf     portc   		;0011 1111
     call      pulse     	;pulse and delay
     movlw     0x0f      	;display on
     movwf     portc     	;0000 1111
     call      pulse
     movlw     0x06		;increment mode, no display shift
     movwf     portc      	;0000 0110
     call      pulse
     call      del_5      	;delay 5 milliseconds - required
     return               	;before sending data
;
;------------------------------------------------------------
;
disp32 bcf     portb,lcdEn   ;E line low
     bcf       portb,lcdDc   ;RS line low, set up for control
     call      del_125       ;delay 125 microseconds
     movlw     0x80          ;control word = address first half
     movwf     portc
     call      pulse         ;pulse and delay
     bsf       portb,lcdDc   ;RS=1, set up for data
     call      del_125       ;delay 125 microseconds
     movlw     0x30          ;initialze file select register
     movwf     fsr
getchar movf   0x00,w        ;get character from display RAM
;                             location pointed to by file select
;                             register
     movwf     portc
     call      pulse         ;send data to display
     movlw     0x3f          ;16th character sent?
     subwf     fsr,w         ;subtract w from fsr
     btfsc     status,z      ;test z flag
     goto      half          ;set up for last 16 characters
     movlw     0xb0          ;test number
     addwf     fsr,w
     btfsc     status,c      ;test Carry flag
     return                  ;32 characters sent to lcd
     incf     fsr,f          ;move to next character location
     goto     getchar
half bcf     portb,lcdDc     ;RS=0, set up for control
     call     del_125        ;delay 125 microseconds
     movlw     0xa8          ;control word = address second half
     movwf     portc
     call     pulse          ;pulse and delay
     bsf     portb,lcdDc     ;RS=1, set up for data
     incf     fsr,f          ;increment file select register to
;                            ;select next character
     call     del_125        ;delay 125 microseconds
     goto     getchar
;
;------------------------------------------------------------
;
del_20	movlw 0x06	;approx 6x3 cycles
	movwf count1	;for 20 microsecond delay
	goto	repeat	;for ADC operation
;------------------------------------------------------------
del_125 movlw 0x2a      ;approx 42x3 cycles (decimal)
     movwf     count1   ;load counter
repeat decfsz  count1,f ;decrement counter
     goto     repeat    ;not 0
     return             ;counter 0, ends delay
;
;------------------------------------------------------------
;
delay
        movlw	0xff
	b get
del_5 movlw   0x29      ;decimal 40
get  movwf    count2    ;to counter
del6 call    del_125    ;delay 125 microseconds
     decfsz   count2,f  ;do it 40 times = 5 milliseconds
     goto     del6
     return             ;counter 0, ends delay
;
;------------------------------------------------------------
;
pulse  bsf  portb,lcdEn ;pulse E line
     nop                ;delay
     bcf     portb,lcdEn
     call     del_125   ;delay 125 microseconds
     return
;
;------------------------------------------------------------
;  Wait between flashing names
;
wait
	movlw	0x60
	movwf	count3  ; delay 64*5 mS
again	call    del_5
	decfsz  count3,f
	goto    again
	return
;
;-----------------------------------------------------------
;       Toggle Backlight
backlit
 btfsc	portb,Blight
 goto	setb
 bsf	portb,Blight
 return
setb bcf portb,Blight
 return
;
;------------------------------------------------------------
;	Clear interrupt count area
zero	movlw   0x80
        movwf	tick_hi
	clrf	tick_lo
	clrf	tick_mid
	clrf	tmr0
	return
;
;------------------------------------------------------------
;	Clear accumulator
zeroacc	clrf	acc+0
	clrf	acc+1
	clrf	acc+2
	clrf	acc+3
	return
;
;------------------------------------------------------------
;
inc     	;increment accumulator and check keypress

        clrf    portc   ;zeroes into the C port
        btfss   portb,key
        b       debnce
nokey	incfsz	acc+0,f
	return
	incfsz	acc+1,f
	return
	incf	acc+2,f
        movlw   0xf0
        andwf   acc+2,w
        btfsc   status,z
        return        
 	b timeout	;Accumulator Overflow.
debnce  
        clrw
        movwf scratch
ssdel   decfsz scratch,f
        b ssdel
        btfsc portb,key
        return
                        ;/0-Credits/1-Backlight/2-OFF/
        movlw 0xfb
        movwf portc
        btfss portb,key ;Check if OFF key pressed
        sleep
        movlw 0xfe
        movwf portc
        btfss portb,key ;Check if Credits key
        b credits
        call backlit
        b wait

        
;
;------------------------------------------------------------
;	Value calculation
;
calcu	movlw	0x38
	movwf	fsr
	call 	initasc
loop6	decf	t_tim,f
	btfss	status,z
	goto	loop7
	return
	movf	t_lo,f
	btfsc	status,z
	return
	decf	t_lo,f
	goto	loop6
loop7	movlw	0x38
	movwf	fsr
	call 	incasc
	goto 	loop6
;
;------------------------------------------------------------
;
calc	call 	b2bcd
	call	bcd2asc
	return
;
;------------------------------------------------------------
;	Initialise fsr area to ascii zero
initasc	movlw   0x03
	movwf	temp
	movlw	'0'
loop5	movwf	indf
	decf	fsr,f
	decfsz	temp,f
	goto loop5
	return
;
;------------------------------------------------------------
;	Increment fsr area in ascii
incasc	movlw 0x03
	movwf	temp
loop4	incf	indf,f
	movlw	0xc6	; test for over nine
	addwf	indf,w;
	btfss	status,c
	return
	movlw	'0'
	movwf	indf
	decf	fsr,f
	decfsz	temp,f
	goto 	loop4
	bsf	flags,2	;notify overflow
	return
;
;____________________________________________________________
;
conv	bcf	status,c  ;convert bin in w to asc
	incf	scratch,f
loop8	decfsz	scratch,f
	goto	loop9
	return
loop9	movlw	0x48
	movwf	fsr	
	call 	incasc
	goto	loop8
;
;____________________________________________________________
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;____________________________________________________________
;
; Convert 32-bit binary number at  into a bcd number
; at . Uses Mike Keitz's procedure for handling bcd
; adjust; Modified Microchip AN526 for 32-bits.
;
b2bcd 	movlw 0x18	; 24-bits
	movwf	ii	; make cycle counter
	clrf	bcd+0	; clear result area
	clrf	bcd+1
	clrf	bcd+2
;	clrf	bcd+3
;	clrf	bcd+4
b2bcd2	movlw	bcd	; make pointer
	movwf	fsr
	movlw	3
	movwf	cnt
;
; Mike's routine:
;
b2bcd3	movlw	0x33
	addwf	0,f	; add to both nybbles
	btfsc	0,3	; test if low result > 7
	andlw	0xf0	; low result >7 so take the 3 out
	btfsc	0,7	; test if high result > 7
	andlw	0x0f	; high result > 7 so ok
	subwf	0,f	; any results <= 7, subtract back
	incf	fsr,f	; point to next
	decfsz	cnt,f
	goto	b2bcd3
	rlf	acc+0,f	; get another bit
	rlf	acc+1,f
 	rlf	acc+2,f
;	rlf	acc+3,f
	rlf	bcd+0,f	; put it into bcd
	rlf	bcd+1,f
	rlf	bcd+2,f
;	rlf	bcd+3,f
;	rlf	bcd+4,f
	decfsz	ii,f	; all done?
	goto	b2bcd2	; no, loop
	return
;
;------------------------------------------------------------
; Unpack BCD data into ASCII coded string for display
bcd2asc movlw 	3		;three bcd bytes
	movwf	ii		;byte counter
	movlw	bcd		;start of BCD, LSD first
	movwf	ptr_bcd
	movlw	0x32 + 0x09	;destination + length of result
	movwf	ptr_asc
loopz	movf	ptr_bcd,w
	movwf	fsr		;get next couple of digits
	movf	indf,w	;into temp
	movwf	temp
	movf	ptr_asc,w
	movwf	fsr
	movf	temp,w
	andlw	0x0f	;lower digit
	iorlw	0x30
	movwf	indf	;store
	decf	fsr,f	;higher digit
	swapf	temp,w
	andlw	0x0f
	iorlw	0x30
	movwf	indf
	incf	ptr_bcd,f
	decf	ptr_asc,f
	decf	ptr_asc,f
        decfsz  ii,f
	goto	loopz
	return
;______________________________________________________________
;
;	Measure ESR
;
testesr
	bsf	portb,Capdis	;discharge
	movlw	0xc3
	movwf	adcon0		;turn adc ON
	call	esr
	call	delay		;time for discharging
	bcf	portb,Capdis
	bcf	porta,i5	;turn 5mA on
	call	del_20
	movlw	0xc7
	movwf	adcon0		;start conversion
	call 	del_20		;wait for conversion
	movlw	0xff
	movwf	porta	        ;turn 5mA off
	movlw	0x48
	movwf	fsr
        call 	initasc	
	bsf     status,rp0      ;switch to bank 1
	movf	adc_lo,w	;get result
	bcf     status,rp0      ;switch to bank 0
	movwf	scratch
	movf	adc_hi,f
	bnz	e_err
	addlw	0xe7    	;test if too small
	bnc	testesrh
	call	conv
	b 	disp32
;
;____________________________________________________________
;	Measure ESR - hi current range
;
testesrh 
	bsf	portb,Capdis	;discharge
	movlw	0xc3
	movwf	adcon0		;turn adc ON
	call	esr
	call	delay		;time for discharging
	bcf	portb,Capdis	;stop discharge
	bcf 	porta,i50	;turn 50mA on
	call	del_20
	movlw	0xc7
	movwf	adcon0		;start conversion
	call 	del_20		;wait for conversion
	bsf	porta,i50	;turn 50mA off
	movlw	0x48
	movwf	fsr
	call 	initasc	
	bsf     status,rp0     ;switch to bank 1
	movf	adc_lo,w	;get result
	bcf     status,rp0     ;switch to bank 0
	movwf	scratch
	call 	conv		;convert result
e_ten   movf	0x48,w
	movwf	0x49
	movlw	'.'
	movwf	0x48
	b       disp32		;display result
;
;____________________________________________________________
;		Measure Value of Capacitance - low ramge
;
captestl	
	bsf	porta,R3k	;turn 3k3 off
	bsf	portb,Capdis	;discharge capacitor
        call    delay
	bcf 	portb,Capdis	;start charging capacitor
	call	zeroacc		;clear counts
loop	btfss	portb,CompIn    ;wait for high
	goto	loop
        movlw   0x85
        movwf   scratch         ;delay to adjust zero
zeroadj decfsz  scratch,f       
        b       zeroadj
loop2	btfss   portb,CompIn	;wait for low again
	goto    charged
        call	inc	        ;increment accumulator
	nop
nex2	goto	nex3
nex3	goto	nex4
nex4	goto	nex5
nex5	goto    loop2
charged
	call	calc
	bsf	portb,Capdis    ;discharge capacitor
	bsf	porta,R3k	;turn resistor off
	movf	0x3b,w
	movwf	0x3c
	movf	0x3a,w
	movwf	0x3b
	movf	0x39,w
	movwf	0x3a
	movf	0x38,w
	movwf	0x39
	movf	0x37,w
	movwf	0x38
	movlw	'.'
	movwf	0x37		
	b disp32
;
;____________________________________________________________
;		Measure Value of Capacitance - high range
;
captesth
        call    cap
	bsf	portb,Capdis	;discharge capacitor
	call 	delay		;wait for it to really discharge
	bcf 	portb,Capdis	;start charging capacitor
	call	zeroacc		;clear counts
	bcf	porta,R3k	;turn 3k3 on
looph   btfss	portb,CompIn	;wait for high
	goto	looph
loop2h	btfss   portb,CompIn	;wait for low again
	goto    over
	goto	ntex1
ntex1	goto	ntex2
ntex2	goto	ntex3
ntex3	goto	ntex4
ntex4	goto	ntex5
ntex5	b	ntex6
ntex6	b	ntex7
ntex7	call	inc	        ;increment accumulator
	goto    loop2h
over
	movf	acc+2,f		;check nonzero
	bnz	notyet
	movf	acc+1,f		;check < 1024
	bnz     notyet
        movf    acc,w
        andlw   0x80
	bz      captestl        ;low value of cap
				;so measure at low
				;range
notyet	call	calc
	bsf	portb,Capdis	;discharge capacitor
	bsf	porta,R3k	;turn resistor off
	movf	0x3b,w
	movwf	0x3c
	movf	0x3a,w
	movwf	0x3b
	movlw	'.'
	movwf	0x3a		
	call    disp32
        b       wait
;
;____________________________________________________________
;
timeout
        call timer_init
        call c_err
        call disp32
circle  ;;            *******   Main Routine   ********
	call zero
	call testesr
	call zero
	call captesth
        call check
	goto circle
;------------------------------------------------------------
wrok          ;Write OK on display
        movlw   'O'
        movwf   0x4e
        movlw   'K'
        movwf   0x4f
        return
;
;------------------------------------------------------------
wrng          ;Write NG on display
        movlw   'N'
        movwf   0x4e
        movlw   'G'
        movwf   0x4f
        return
;
;------------------------------------------------------------
check                     ;Check whether ESR is within range
        movlw   ' '
        movwf   0x4e
        movwf   0x4f      ;clear earlier message
        movlw   '.'       ;Check for correct range
        xorwf   0x3a,w
        btfss   status,z 
        return 
;                       ;check for cap values
        movlw 0x36
        movwf fsr
        movf  indf,w
        addlw 0 - '0'
        bnz   more100   ; >1000
        incf  fsr,f
        movf  indf,w
        addlw 0 - '0'
        bnz   more100   ; >100
        incf  fsr,f
        movf  indf,w
        addlw 0 - '0'
        bnz   more10    ; >10
        incf  fsr,f
        movf  indf,w
        addlw 0 - '0'
        bnz   moreone   ; >1
        return
        
more100 ; If cap > 100 then ESR < 1
        movlw '.'
        xorwf 0x48,w
        bnz   wrng
        movlw '0'
        xorwf 0x47,w
        bnz   wrng
        movlw '0'
        xorwf 0x46,w
        bnz   wrng
        goto  wrok
more10  ; If cap > 10 then ESR < 5
        movlw '.'
        xorwf 0x48,w
        bnz   wrng
        movlw 0xcb
        addwf 0x47,w
        bc    wrng
        movlw '0'
        xorwf 0x46,w
        bnz   wrng
        goto  wrok
moreone ; If cap > 1 then ESR < 10
        movlw '.'
        xorwf 0x48,w
        bnz   wrng
        movlw '0'
        xorwf 0x46,w
        bnz   wrng
        goto  wrok
        
;
;------------------------------------------------------------
;
     end
;------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;============================================================

Home Page . . . . . . . Email: . . . . . . . . neelandan-at-gmãil·çöm