Vous êtes sur la page 1sur 17

;=======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
movwf adcon1
bcf
status,rp0
movlw 0xfe
movwf portb
movlw 0xff
movwf porta
movwf portc
movlw 0xc3
movwf adcon0
call
timer_init
call
del_5
call
initlcd
call
cap
call
esr
call
disp32
b circle

;2 ana in & Vref+ & left just


;switch back to bank 0
;all outputs inactive

; setup ADC for single ch input


;start timer
;allow lcd time to initialize
;initialize display
;initial message in display

;
;
;-----------------------------------------------------------; 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
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
return

0x34
' '
0x35
'E'
0x36
'S'
0x37
'R'
0x38
' '
0x39
'M'
0x3a
'e'
0x3b
't'
0x3c
'e'
0x3d
'r'
0x3e
':'
0x3f

;
;-----------------------------------------------------------;
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
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
return

0x43
'e'
0x44
'e'
0x45
'n'
0x46
'r'
0x47
'a'
0x48
'j'
0x49
'M'
0x4b
'R'
0x4d

;
;-----------------------------------------------------------;
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

nokey

clrf
btfss
b
incfsz
return
incfsz
return
incf
movlw

portc ;zeroes into the C port


portb,key
debnce
acc+0,f
acc+1,f
acc+2,f
0xf0

andwf acc+2,w
btfsc status,z
return
b timeout
;Accumulator Overflow.
debnce
ssdel

clrw
movwf scratch
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
decfsz
goto
rlf
rlf
rlf
rlf
rlf
rlf
rlf
rlf
rlf
decfsz
goto
return

fsr,f
cnt,f
b2bcd3
acc+0,f
acc+1,f
acc+2,f
acc+3,f
bcd+0,f
bcd+1,f
bcd+2,f
bcd+3,f
bcd+4,f
ii,f
b2bcd2

; point to next
; get another bit

; put it into bcd

; all done?
; no, loop

;
;-----------------------------------------------------------; 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
movlw
movwf
movlw
movwf
call
bsf
movf
bcf
movwf
movf
bnz
addlw
bnc
call
b

del_20
0xff
porta
0x48
fsr
initasc
status,rp0
adc_lo,w
status,rp0
scratch
adc_hi,f
e_err
0xe7
testesrh
conv
disp32

;wait for conversion


;turn 5mA off

;switch to bank 1
;get result
;switch to bank 0

;test if too small

;
;____________________________________________________________
;
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
incf fsr,f
movf indf,w
addlw 0 - '0'
bnz more10
incf fsr,f
movf indf,w
addlw 0 - '0'
bnz moreone
return

; >100

; >10

; >1

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
;-----------------------------------------------------------;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;============================================================

Vous aimerez peut-être aussi