;******************************************
;* 2 ? 1 ????-???-???? PIC 16F873 *
;******************************************
;=====================================================================================
; ????? 10 ???
; Hopefully this works for 8000 pulses/mile
list p = 16F876
#include <P16F876.INC>
__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF
; ?????????
RCSwitch equ 1 ; RC1
RCPower equ 0 ; RC0
RCButton equ 3 ; RA3
RCPoint equ 4 ; RA4
; ??????????
; ????? ????????? ????????
INDNO equ 0x20
; ????? ??????? ????????, ??????? ? ???? ?????????? ?????????
IND01 equ 0x21
IND02 equ 0x22
IND03 equ 0x23
IND04 equ 0x24
IND05 equ 0x25
IND06 equ 0x26
; ????? ??????? ??????????
INDS1 equ 0x27
INDS2 equ 0x28
INDS3 equ 0x29
; ???????? ??????? ??????? ???????
tot_prev equ 0x2A
tor_k001 equ 0x2B
tot_k010 equ 0x2C
tot_k100 equ 0x2D
tot_001k equ 0x2E
tot_010k equ 0x2F
tot_100k equ 0x30
tot_001t equ 0x31
tot_010t equ 0x32
tot_100t equ 0x33
; ?????????????? ??????? ????????? ???????
aux_prev equ 0x34
aux_k001 equ 0x35
aux_k010 equ 0x36
aux_k100 equ 0x37
aux_001k equ 0x38
aux_010k equ 0x39
aux_100k equ 0x3A
IPM equ 0x3B
SCR_MODE equ 0x3C
BTN_MODE equ 0x3D
BTN_CNTR equ 0x3E
BTN_STAT equ 0x3F
cntr2 equ 0x40
iHCNT equ 0x41
iLCNT equ 0x42
cHCNT equ 0x43
cLCNT equ 0x44
PreDIG equ 0x45
EspDIG equ 0x46
DspDIG equ 0x47
HspDIG equ 0x48
newCntr equ 0x49
; BTN_MODE - ?????????, ??? ????????? ? ???????
; 00 - ?????? ????????? ? ?????
; 01 - ??????? (??? ????)
; 11 - ????????? ?????
; 10 - ?????????? (??? ?????)
; SCR_MODE - ????????? ????????? FILL_VB, ??? ????????? ??????????
; 0 - ?????? ??????
; 1 - ????????
; 2 - ?????
; 3 - ????? ?????
; ?????????
org 0x00
goto START
; ????????????? ????? ? ??? 7-??????????? ??????????
SEG7 ; ? ????????? ?? ???? ????????, ? (10-????????)
sublw d'010' ; ????????? ????????
andlw 0x0F ; ?? ?????? ??????
addwf PCL,f
; ebfdacg ???? ? ???? ???????? ???????
retlw b'00000011' ; 0
retlw b'10111011' ; 1
retlw b'00100101' ; 2
retlw b'10100001' ; 3
retlw b'10011001' ; 4
retlw b'11000001' ; 5
retlw b'01000001' ; 6
retlw b'10110011' ; 7
retlw b'00000001' ; 8
retlw b'10000001' ; 9
retlw b'11110111' ; 10
retlw b'10111111' ; 11
retlw b'11111011' ; 12
retlw b'11101111' ; 13
retlw b'01111111' ; 14
retlw b'11011111' ; 15
; ?????????? ???? ????????? ??????? ?? ?????? ????????? ?????
ANOD_C
andlw 0x07 ;?? ?????? ??????
addwf PCL,f
; 123465 ??????? ? ???? ???????? ??????
retlw b'00000000' ; 0
retlw b'10000000' ; 1
retlw b'01000000' ; 2
retlw b'00100000' ; 3
retlw b'00010000' ; 4
retlw b'00000100' ; 5
retlw b'00001000' ; 6
retlw b'00000000' ; 7
; ?????????? ???? ????????? ??????? ?? ?????? ????????? ?????
ANOD_A
andlw 0x03 ;?? ?????? ??????
addwf PCL,f
; 321 ??????? ? ???? ???????? ?????? 1-????? 2-??????? 3-???????
retlw b'00010000' ; 0
retlw b'00010001' ; 1
retlw b'00010010' ; 2
retlw b'00010100' ; 3
START
bcf STATUS, RP0 ; ???? 0
bcf STATUS, RP1
clrf T2CON
clrf TMR0
clrf TMR2
clrf INTCON
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS, RP0 ; ???? 1
movlw 0x06 ; ??? ???? ? ?? ?????
movwf ADCON1
movlw b'00001000'
movwf TRISA ; RA3 - ??????, ????????? ?????
movlw b'00000001'
movwf TRISB ; RB0 - ??????, ????????? ?????
movlw b'00000001'
movwf TRISC ; RC0 - ?????????, ????????? ?????
; ???????? ????????????? ?????????, TMR0 ?? ?????????? ???? ? ????????????? 16 (4 ms ?? ?????)
movlw b'01000011'
movwf OPTION_REG
; ???????? TIMER2
clrf PIE1
movlw d'249' ; ??? ?????? 10 ??? ??????? clock = Fosc/4 = 2,5 ??? 0,4 ???
movwf PR2 ; ??????? ??????? TIMER2 = 250 clock = 100 ??? ?? ????
; ???? = 100 ??? * 1(PRE) * 1 (POST) = 100 ???
bcf STATUS,RP0 ; ???? 0
movlw b'00000100' ; none:7 (POST-1):6-3 On/Off:2 PRE: 1-0
movwf T2CON ; b0000 = 1:1 1=On b00 = 1
clrf PIR1
bsf PORTC, RCSwitch
call READ_EEPROM
movlw d'10'
movwf HspDIG
movwf DspDIG
movwf EspDIG
; ***
movlw 1 ; ???? 8
movwf PreDIG
movlw 9
movwf INDNO
clrf TMR0
bcf INTCON,T0IF ; ???????? ??????
call PROLOG
clrf BTN_MODE
clrf SCR_MODE
call FILL_VB
call FILL_SPD
; ***
movlw d'23' ; ???? d'37' ??? 30 ???/?
movwf iHCNT
; ***
movlw d'112' ; ???? d'128' ??? 30 ???/?
movwf iLCNT
clrf cHCNT
movlw 1
movwf cLCNT
movlw d'80'
movwf newCntr
MAIN_LOOP
; Check the power
btfss PORTC,RCPower; ??????? ??????????, ???? 1
goto PowerDown
PowerRise
; Dimensional check the timer
btfsc PIR1,TMR2IF ; ???? 0 (??? ??????? ?? TIMER2), ?? ?????
call DO_TICK ; ? ???? 1, ?? ???? ??????????? ????????
; Check the sensor
btfss INTCON,INTF ; if 0 (no signal from the sensor), by bypassing
goto Skipit ;jump over the next piece of code if no sensor signal
decfsz newCntr,1 ;wait for 80 sensor pulses before incrementing
call DO_INCR ; and if one, then go to increase the counter
Skipit: nop ; used as a way to skip over the added code
; ?????????????? ????????? ???????
; btfsc PORTB,0
; bsf PORTA,5
; btfss PORTB,0
; bcf PORTA,5
; ????????? ?????? ??? ???????????? ?????????
btfss INTCON,T0IF ; ???? ?????? ???????? ??????, ?? ???? ?????? ??????
goto MAIN_LOOP ; ????? ????????? ???????? ? ?????
; ???, ??? ????, ??????????? 1 ??? ? 1,6 ?? (?? 10???)
call ChkButton ; ????????? ?????
call ChAnod ; ???????????? ???????? ??????????
bcf INTCON,T0IF ; ???????? ??????
goto MAIN_LOOP
; ????????? ?????? ? ?????????????
ChkButton
rlf BTN_MODE,f ; ?????? ??? BTN_MODE ???????? ?? 1 ??? ?????
bcf BTN_MODE,0 ; ? ? 0? ??? ???????
btfss PORTA, RCButton ; 0, ???? ?????? ??????
bsf BTN_MODE,0 ; 1, ???? ?????
movf BTN_MODE,w ; ????? ???????? ??????? ??? ????
andlw 3 ; ? ?? ??? ???????? ??????? ?????????
addwf PCL,f ;
goto Btn_UpUp ; 00 - ?????? ???? ? ???????? ??????? (????????? ??????)
goto Btn_UpDn ; 01 - ??????? ?????? ???? (??????)
goto Btn_DnUp ; 10 - ??????? ????? ????? (?????????)
goto Btn_DnDn ; 11 - ???? ? ???????? ????? (????????? ???????)
Btn_UpDn ; ??????
clrf BTN_CNTR ; ? ?????? ??????? ??????
clrf BTN_STAT ; ???????? ???????? ??????? ?????????
goto Btn_UpUp
Btn_DnDn ; ?????????? ?????????? ??????????? ???????
incfsz BTN_CNTR,f ; ????? ??????? ????????? ?? 256 (0,4???)
goto TestSTATUS
incf BTN_STAT,f ; ??????? ??? ??????? ?? ?????? ??????
TestSTATUS ; ? ??????????? ?? ??????? ?????????
btfss BTN_STAT,2 ; 0, 1 , 2, 3 ( ?? 0,4 ?? 0,8 ?? 1,2 ?? 1,6 ???)
goto Btn_UpUp
decf BTN_STAT,f ; ???? ??? ????? ?? 4, ?? ?????? ??? ? 3
bsf SCR_MODE,1 ; ??????? ????? ??????????? ?????? ?? ??????????
call FILL_VB ; ?????? ??? ??????? ?? ?????? ??????
goto Btn_UpUp ; ??? ????????? ?? ?????? ????? ?????
Btn_DnUp ; ?????????
btfss SCR_MODE,1 ; ???? ??? ???????? ?????
goto SwitchMode ; ?? ???? ?? ???????????? ?????? ???????????
TestReset
bcf SCR_MODE,1 ; ??? ???????? ?????
btfss SCR_MODE,0 ; ??????? ?????????? ????? ?????????? ??????/????????
goto ODOmode
movf IPM,w ; ? ??? ????????? ????? ????
movwf aux_prev ; ??????? ????? ???????? ? 000.00
movlw d'10'
movwf aux_100k
movwf aux_010k
movwf aux_001k
movwf aux_k100
movwf aux_k010
movwf aux_k001
goto ODOmode
SwitchMode ; ???????????? ?????? ?????????? ??????/????????
movlw 1
xorwf SCR_MODE,f
ODOmode ; ?????????????? ?????? ??????????
call FILL_VB
Btn_UpUp ; ???? ?????? ????????? ?? ?????, ?? ?????? ?????? ?? ????
return
FILL_SPD ; ????????? ????? ??????? ??????????? ?????? ? ??????????
movf HspDIG,w
call SEG7 ; ????? ?????
movwf INDS1 ;
movf DspDIG,w
call SEG7 ; ????? ????????
movwf INDS2
movf EspDIG,w ; ????? ?????? ??????
call SEG7
movwf INDS3
call CLR_LEAD0 ; ???????? ?????????? ????
return
; ?????????? ??????????? ?????? ?????????
FILL_VB
movfw SCR_MODE ; ????????, ??? ????????? ????? ??????????
andlw b'00000011' ; ? ??????????? ?? ???????? ?????????? SRC_MODE
addwf PCL,f
goto Fill_ODOM
goto Fill_TRIP
goto Fill_NONE
goto Fill_TEXT
Fill_ODOM ; ????????? ?????
movfw tot_100t ; ??????? ??????? ???????
call SEG7
movwf IND01
movfw tot_010t
call SEG7
movwf IND02
movfw tot_001t
call SEG7
movwf IND03
movfw tot_100k
call SEG7
movwf IND04
movfw tot_010k
call SEG7
movwf IND05
movfw tot_001k
call SEG7
movwf IND06
return
Fill_TRIP ; ??????? ????????? ???????
movlw b'11111111' ; ??????? ?????? ??????
movwf IND01
movfw aux_100k
call SEG7
movwf IND02
movfw aux_010k
call SEG7
movwf IND03
movfw aux_001k
call SEG7
movwf IND04
movfw aux_k100
call SEG7
movwf IND05
movfw aux_k010
call SEG7
movwf IND06
bcf IND04,0 ; ????????? ??????? "????? ?????" ??? ??????? ???????
return
Fill_TEXT ; ????? ?????
; ebfdacg ???? ????????
movlw b'11111111'
movwf IND01
movlw b'01000111' ; ?
movwf IND02
movlw b'01000001' ; ?
movwf IND03
movlw b'00010101' ; ?
movwf IND04
movlw b'00000011' ; 0
movwf IND05
movlw b'01000111' ; ?
movwf IND06
return
Fill_NONE ; ???????? ??? ???????
movlw b'11111111' ; ??? ??? ?????????? ?????????
movwf IND01 ; ?????? ? ?????? ??????? ???????
movwf IND02
movwf IND03
movwf IND04
movwf IND05
movwf IND06
return
ChAnod
;???????????? ????????? (?????? ??? ????? ??????? ???????? ??????? ????? 1,6?? ? 6 ???????? = 100??)
movlw IND01-1
movwf FSR
movlw 0x03
andwf PORTC,f ; ????????? ??????
movlw 0xF8
andwf PORTA,f
bsf PORTA, RCPoint
movlw 9 ; ?????????? ?????? ?????????? ???????
decfsz INDNO,f ; ??????????
movfw INDNO ; 9 8 7 6 5 4 3 2 1 ? ?? ????? 9 8 7 6 5 ...
movwf INDNO
addwf FSR,f ; ????????? ?????????? ???????
movfw INDF ; ??? ?????????? ???????
movwf PORTB
movfw INDNO
sublw 6
btfss STATUS,C
goto ANOD_SPD
btfss INDF,0 ; ???? ??????? "????? ?????" ???????, ?? ????? ?????????
bcf PORTA, RCPoint ; ???????? ?????
movfw INDNO
call ANOD_C
iorwf PORTC,f ; ???????? ???? ?????????? ???????
return
ANOD_SPD
call ANOD_A
iorwf PORTA,f ; ???????? ???? ?????????? ???????
return
; ?????? ??? ?? ??????? ??????? (?????? 100 ???)
DO_TICK
bcf PIR1,TMR2IF ; ???????? ???? ??????????
decfsz cLCNT,f
return
; ?????????? ????????? ????????? ???????
movf cHCNT,f ; ????????? ??????? ???????
btfsc STATUS,Z ; ???? cHCNT=0
goto ResetCNTS ; ?? ???? ?????????????? ???????? ?? ????? ??????
movf iLCNT,w
decfsz cHCNT,f ; cHCNT=cHCNT-1
movlw 0 ; ???? <>0, ?? cLCNT=256
movwf cLCNT ; =0, =iLCNT
return
ResetCNTS
movf iHCNT,w
movwf cHCNT ; cHCNT=iHCNT
clrf cLCNT ; cLCNT=256
call FILL_SPD
; call FILL_VB
; ????????? ??? ?????? ??????
movlw d'10'
movwf HspDIG
movwf DspDIG
movwf EspDIG
; ***
movlw 1 ; ???? 8
movwf PreDIG
return
; Increment counters
DO_INCR ; 1 2 3 4 5 6 7 8 9 10
movlw d'10' ; 10 bits for a full run 999,999 kilometers (see). 999 m + IPM (not ; visible)
movwf cntr2
movlw tot_prev-1
call CH_CNTR ; 123 45 June 7
movlw 7 ; 7 bits to 999 km daily .99 (visible) 9m + IPM (not visible)
movwf cntr2
movlw aux_prev-1
call CH_CNTR
movlw 4 ; first three digits speedometer
movwf cntr2
movlw PreDIG-1
movwf FSR
; ***
movlw 1 ; was 8
call CH_LOOP
call FILL_VB ; updated the code in the cathode buffer indicator
;call FILL_SPD
bcf INTCON,INTF ; dropped the flag of external interrupt
movlw d'80' ;reload the new counter
movwf newCntr
return
CH_CNTR
movwf FSR
movf IPM,w ; ??? ???????????????? ???????? ?????? IPM (impacts per meter)
CH_LOOP
incf FSR,f
decfsz INDF,f
return
movwf INDF
movlw d'10' ; ??? ???? ????????? ???????? ????????
decfsz cntr2,f
goto CH_LOOP
return
PowerDown
call WRITE_EEPROM ; ?????????? ???????? ? ????????????????? ??????
; ????? ?????? ? ????? ??????????
; ebfdacg ???? ? ???? ???????? ???????
movlw b'10100001' ; 3
movwf IND01
movlw b'00010001' ; A
movwf IND02
movlw b'00010011' ; ?
movwf IND03
movlw b'00001011' ; ?
movwf IND04
movlw b'01000111' ; ?
movwf IND05
movlw b'01001001' ; ?
movwf IND06
SDeadLoop
movlw D'255'
movwf cntr2
bcf INTCON,T0IF ; ???????? ??????
DeadLoop
btfss INTCON,T0IF
goto DeadLoop
call ChAnod
decfsz cntr2,f
goto DeadLoop-1
; goto SDeadLoop
btfsc PORTC,RCPower ; ???? ??????? ?? ?????????????? (0), ?? ????? ????????
goto PWRRestoted ; ???? ?????????????? (1), ?? ????????????
; ??? ????????? ???????
bcf PORTC,RCSwitch
goto SDeadLoop
PWRRestoted
call FILL_VB
bsf PORTC,RCSwitch ; ???????? ????? ????????
goto PowerRise
READ_EEPROM ; ???????? ????????? ?? ????????????????? ??????
movlw d'18'
movwf cntr2
movlw tot_prev
movwf FSR
RD_LOOP
movfw FSR
addlw -tot_prev
bsf STATUS,RP1 ; ???? 2 - ?? ????? ???? 0
movwf EEADR
bsf STATUS,RP0 ; ???? 3
bcf EECON1,EEPGD
bsf EECON1,RD
bcf STATUS,RP0 ; ???? 2
movfw EEDATA
bcf STATUS,RP1 ; ???? 0
movwf INDF
incf FSR,f
decfsz cntr2,f
goto RD_LOOP
return
WRITE_EEPROM ; ?????????? ????????? ? ????????????????? ??????
movlw d'17'
movwf cntr2 ; cntr2 = 15
movlw tot_prev
movwf FSR ; FSR = @tot_prev = ?????? ????????? RAM
WR_LOOP
movfw FSR
addlw -tot_prev ; W = 0, 1, ... , 14 = ?????? ????????? EEPROM
; ????????? ?????? ????? ? EEPROM
bsf STATUS,RP1 ; ???? 2
movwf EEADR ; ????????? W ? EEADR
bcf STATUS,RP1 ; ???? 0
movfw INDF ; ??????? ? W ?????????? ???????? RAM
bsf STATUS,RP1 ; ???? 2
movwf EEDATA ; ?? W ? EEDATA
bsf STATUS,RP0 ; ???? 3
bcf EECON1,EEPGD; ???????? EEPROM
bsf EECON1,WREN ; ????????? ??????
movlw h'55' ; ** ???????????? **
movwf EECON2 ; ** ????????? **
movlw h'AA' ; ** ??? **
movwf EECON2 ; ** ???????????? **
bsf EECON1,WR ; ??????? ?????? ??????
btfsc EECON1,WR ; ???? ???????? ?????????? ??????
goto $-1 ; ?????????
bcf EECON1,WREN
bcf STATUS,RP1
bcf STATUS,RP0 ; ???? 0
incf FSR,f ; FSR = @tot_prev +1, +2, ..., + 15
decfsz cntr2,f
goto WR_LOOP ; ????????? 17 ???
return
CLR_LEAD0
movf HspDIG,w
sublw d'10'
btfss STATUS,Z
return
movlw b'11111111'
movwf INDS1
movf DspDIG,w
sublw d'10'
btfss STATUS,Z
return
movlw b'11111111'
movwf INDS2
return
PROLOG
clrf IND01
clrf IND02
clrf IND03
clrf IND04
clrf IND05
clrf IND06
clrf INDS1
clrf INDS2
clrf INDS3
clrf cLCNT
movlw 3
movwf cHCNT
PRO_LOOP
btfss INTCON,T0IF
goto PRO_LOOP
call ChAnod
bcf INTCON,T0IF ; ???????? ??????
decfsz cLCNT,f
goto PRO_LOOP
decfsz cHCNT,f
goto PRO_LOOP
return
org 0x2100
; ????? ?? ????????? ( ??????? ?? ??????! ??????? ?????!)
; ? EEPROM ??? ???????? ? ???? 10-?
; ?????? ??????
; ***
eet_prev de d'06' ; ??????????????? ??????????????
eet_k001 de d'10'-0
eet_k010 de d'10'-0
eet_k100 de d'10'-0 ; ???????????? ??????? ????
eet_001k de d'10'-0 ; 1 ??
eet_010k de d'10'-0
eet_100k de d'10'-0
eet_001t de d'10'-5
eet_010t de d'10'-9
eet_100t de d'10'-0 ; 100 000 ??
;???????? ??????
; ***
eea_prev de d'06' ; ??????????????? ??????????????
eea_k001 de d'10'-0
eea_k010 de d'10'-0 ; 10 ?
eea_k100 de d'10'-0
eea_001k de d'10'-0 ; 1 ??
eea_010k de d'10'-0
eea_100k de d'10'-0 ; 100 ??
; ????? ????????? ?? 1 ????
; ***
eeIPM de d'06'
end ;????? ?????????