Страница 1 из 1

Помогите разобраться с кодом программы частотомера. Для чего

Добавлено: Ср дек 21, 2016 05:32:06
saymon24
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

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 08:22:55
Zhuk72
Все это очень интересно, но где сам вопрос? В чем хотите разобраться?

P.S. Когда даете код, помещайте его между тегами [ code ] и [ /code ] (без пробелов). Пока есть возможность редактировать сообщение, исправьте, а то читать тяжело.

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 08:36:22
Мурато Мяуконни
Да какой там вопрос, это не вопрос, это рыба Студер на нерест пошла. Конец декабря, курсачи, допуски, сессия. А это экземпляр студера жил весело, да беда пришла.
Сейчас у него два пути - либо в армию, там научат, либо в петлю, чтоб не мучиться.

По теме - там в коде все написано. Серьезно

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 09:08:35
Zhuk72
Он вопрос написал в названии темы, "Для чего", но дальше не поместилось, а в сообщении вопрос не продублировал.

Если ник содержит 2 цифры, то это обычно бывает или год рождения, или возраст. Судя по данному нику, студент в 24 года скорее всего уже отслужил 8)

Re: Помогите разобраться с кодом программы частотомера.

Добавлено: Ср дек 21, 2016 11:27:01
saymon24
Для чего нужен каждый блок программы, после начала прерывания?
24 это регион проживания.

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 13:34:11
Мурато Мяуконни
Так и быть, поможем студню.
Если блоки разделены строкой ======, то
Первый блок - указание названия микроконтроллера и подключение заголовка.
Второй блок - объявление пеерменных
Третий - указание стартового адреса и адреса вектора прерываний
Далее - вход в обработчик прерываний
потом - выход из обработчика прерываний
затем - инициализация микроконтроллера, очистка регистров, подготовка к работе
следом - бесконечный цикл
после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события.
и в конце - конец концов конца программы наконец

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 14:25:05
otest
Если блоки разделены строкой ======, то
То это ни чего не значит. Где хочу там и подчёркиваю.

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 14:31:43
Мурато Мяуконни
Это вы про что? Вы - автор вопроса?

Re: Помогите разобраться с кодом программы частотомера. Для

Добавлено: Ср дек 21, 2016 14:39:12
saymon24
спасибо за ответ!
Мурато Мяуконни писал(а):Так и быть, поможем студню.
Если блоки разделены строкой ======, то
Первый блок - указание названия микроконтроллера и подключение заголовка.
Второй блок - объявление пеерменных
Третий - указание стартового адреса и адреса вектора прерываний
Далее - вход в обработчик прерываний
потом - выход из обработчика прерываний
затем - инициализация микроконтроллера, очистка регистров, подготовка к работе
следом - бесконечный цикл
после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события.
и в конце - конец концов конца программы наконец