Помогите разобраться с кодом программы частотомера. Для чего
Добавлено: Ср дек 21, 2016 05:32:06
LIST p=PIC16F84A
#include <p16f84a.inc>
__CONFIG 0x3FF1
;==========
TEMPSTATUS equ 0x4E
TEMPW equ 0x4F
cblock 0x20 ;присвоение имён: первая запись, далее +1
TMR_COUNT ;вторая запись
IMP_COUNT_LO ;третья запись
IMP_COUNT_HI ;4 запись
RESULT_LO ;5 запись
RESULT_HI ;6 запись
endc ;конец присовоения имён
;==========
org 0x00 ;адрес начала программы
goto PIC_Initial
org 0x04 ;подпрограмма обработки прерываний
goto Interrupt
org 0x05
;==========
Interrupt: ;прерывание
movwf TEMPW ;поместить значение W в TEMPW
swapf STATUS, W ;поменять местами полубайты в STATUS, результат в W
movwf TEMPSTATUS ;поместить значение W в TEMPSTATUS
btfsc INTCON, T0IF ;если T0IF=0 (переполнения не было) в регистре INTCON, то пропустить след. каманду
goto Intrpt_of_T0
btfsc INTCON, INTF ;если INTF=0 (прерывания не было) в регистре INTCON, то пропустить след. каманду
goto Intrpt_of_INT
;==========
end_interrupt:
swapf TEMPSTATUS, W ;поменять местами полубайты в TEMPSTATUS, результат в W
movwf STATUS ;поместить значение W в статус
swapf TEMPW, F ;поменять местами полубайты в TEMPW, результат в TEMPW
swapf TEMPW, W ;поменять местами полубайты в TEMPW, результат в W
retfie ;возврат из подпрограммы обработки прерываний
;==========
PIC_Initial:
clrf PORTA
clrf PORTB
clrf TMR_COUNT
clrf IMP_COUNT_HI
clrf IMP_COUNT_LO
clrf RESULT_HI
clrf RESULT_LO
bsf STATUS, RP0 ;установить бит RP0 в регистре STATUS - выбираем 1 банк
movlw b'11010111' ;записать слово в W, инициализация TMR0
movwf OPTION_REG ;поместить значение W в OPTION_REG
bcf INTCON, T0IF ;очистить бит T0IF в регистре INTCON
bcf STATUS, RP0 ;очистить бит RP0 в регистре STATUS
clrf TMR0 ;очистить TMR0 (Configuration Interrupt)
movlw 0xF0 ;записать слово в W
movwf INTCON ;поместить значение W в INTCON
;==========
start nop
nop
nop
goto start
;==========
Intrpt_of_T0:
bcf INTCON, T0IF ;очистить бит T0IF в регистре INTCON
incf TMR_COUNT ;инкремент TMR_COUNT (увеличение)
movf TMR_COUNT, W ;перемещение содержимого TMR_COUNT в W
xorlw .16 ;исключающее ИЛИ над словом и W (десятичное число 16)
btfsc STATUS, Z ;если Z = 0 в регистре STATUS, то пропустить след. команду
goto End_Sec
movf TMR_COUNT, W ;перемещение содержимого TMR_COUNT в W
xorlw .15 ;исключающее ИЛИ над словом и W
btfss STATUS, Z ;если Z = 1 в регистре STATUS, то пропустить след. команду
goto end_interrupt
movlw .190 ;записать слово в W
movwf TMR0 ;поместить значени W в TMR0
goto end_interrupt
;==========
End_Sec:
clrf TMR_COUNT ;очистить TMR_COUNT
movf IMP_COUNT_HI, W ;перемещение содержимого IMP_COUNT_HI в W
movwf RESULT_HI ;Поместить значение W в RESULT_HI
movf IMP_COUNT_LO, W ;перемещение содержимого IMP_COUNT_LO в W
movwf RESULT_LO ;Поместить значение W в RESULT_HI
clrf IMP_COUNT_HI
clrf IMP_COUNT_LO
goto end_interrupt
;==========
Intrpt_of_INT:
bcf INTCON, INTF ;очистить бит INTF в регистре INTCON
incf IMP_COUNT_LO ;инкремент IMP_COUNT_LO (увеличение)
btfsc STATUS, Z ;если Z = 0 в регистре STATUS, то пропустить след. команду
incf IMP_COUNT_HI ;инкремент incf IMP_COUNT_HI
goto end_interrupt
;==========
end
#include <p16f84a.inc>
__CONFIG 0x3FF1
;==========
TEMPSTATUS equ 0x4E
TEMPW equ 0x4F
cblock 0x20 ;присвоение имён: первая запись, далее +1
TMR_COUNT ;вторая запись
IMP_COUNT_LO ;третья запись
IMP_COUNT_HI ;4 запись
RESULT_LO ;5 запись
RESULT_HI ;6 запись
endc ;конец присовоения имён
;==========
org 0x00 ;адрес начала программы
goto PIC_Initial
org 0x04 ;подпрограмма обработки прерываний
goto Interrupt
org 0x05
;==========
Interrupt: ;прерывание
movwf TEMPW ;поместить значение W в TEMPW
swapf STATUS, W ;поменять местами полубайты в STATUS, результат в W
movwf TEMPSTATUS ;поместить значение W в TEMPSTATUS
btfsc INTCON, T0IF ;если T0IF=0 (переполнения не было) в регистре INTCON, то пропустить след. каманду
goto Intrpt_of_T0
btfsc INTCON, INTF ;если INTF=0 (прерывания не было) в регистре INTCON, то пропустить след. каманду
goto Intrpt_of_INT
;==========
end_interrupt:
swapf TEMPSTATUS, W ;поменять местами полубайты в TEMPSTATUS, результат в W
movwf STATUS ;поместить значение W в статус
swapf TEMPW, F ;поменять местами полубайты в TEMPW, результат в TEMPW
swapf TEMPW, W ;поменять местами полубайты в TEMPW, результат в W
retfie ;возврат из подпрограммы обработки прерываний
;==========
PIC_Initial:
clrf PORTA
clrf PORTB
clrf TMR_COUNT
clrf IMP_COUNT_HI
clrf IMP_COUNT_LO
clrf RESULT_HI
clrf RESULT_LO
bsf STATUS, RP0 ;установить бит RP0 в регистре STATUS - выбираем 1 банк
movlw b'11010111' ;записать слово в W, инициализация TMR0
movwf OPTION_REG ;поместить значение W в OPTION_REG
bcf INTCON, T0IF ;очистить бит T0IF в регистре INTCON
bcf STATUS, RP0 ;очистить бит RP0 в регистре STATUS
clrf TMR0 ;очистить TMR0 (Configuration Interrupt)
movlw 0xF0 ;записать слово в W
movwf INTCON ;поместить значение W в INTCON
;==========
start nop
nop
nop
goto start
;==========
Intrpt_of_T0:
bcf INTCON, T0IF ;очистить бит T0IF в регистре INTCON
incf TMR_COUNT ;инкремент TMR_COUNT (увеличение)
movf TMR_COUNT, W ;перемещение содержимого TMR_COUNT в W
xorlw .16 ;исключающее ИЛИ над словом и W (десятичное число 16)
btfsc STATUS, Z ;если Z = 0 в регистре STATUS, то пропустить след. команду
goto End_Sec
movf TMR_COUNT, W ;перемещение содержимого TMR_COUNT в W
xorlw .15 ;исключающее ИЛИ над словом и W
btfss STATUS, Z ;если Z = 1 в регистре STATUS, то пропустить след. команду
goto end_interrupt
movlw .190 ;записать слово в W
movwf TMR0 ;поместить значени W в TMR0
goto end_interrupt
;==========
End_Sec:
clrf TMR_COUNT ;очистить TMR_COUNT
movf IMP_COUNT_HI, W ;перемещение содержимого IMP_COUNT_HI в W
movwf RESULT_HI ;Поместить значение W в RESULT_HI
movf IMP_COUNT_LO, W ;перемещение содержимого IMP_COUNT_LO в W
movwf RESULT_LO ;Поместить значение W в RESULT_HI
clrf IMP_COUNT_HI
clrf IMP_COUNT_LO
goto end_interrupt
;==========
Intrpt_of_INT:
bcf INTCON, INTF ;очистить бит INTF в регистре INTCON
incf IMP_COUNT_LO ;инкремент IMP_COUNT_LO (увеличение)
btfsc STATUS, Z ;если Z = 0 в регистре STATUS, то пропустить след. команду
incf IMP_COUNT_HI ;инкремент incf IMP_COUNT_HI
goto end_interrupt
;==========
end