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 ;возврат из подпрограммы обработки прерываний
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
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
Все это очень интересно, но где сам вопрос? В чем хотите разобраться?
P.S. Когда даете код, помещайте его между тегами [ code ] и [ /code ] (без пробелов). Пока есть возможность редактировать сообщение, исправьте, а то читать тяжело.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Да какой там вопрос, это не вопрос, это рыба Студер на нерест пошла. Конец декабря, курсачи, допуски, сессия. А это экземпляр студера жил весело, да беда пришла. Сейчас у него два пути - либо в армию, там научат, либо в петлю, чтоб не мучиться.
По теме - там в коде все написано. Серьезно
_________________ Подпись убрал вместе с автором. aen
Так и быть, поможем студню. Если блоки разделены строкой ======, то Первый блок - указание названия микроконтроллера и подключение заголовка. Второй блок - объявление пеерменных Третий - указание стартового адреса и адреса вектора прерываний Далее - вход в обработчик прерываний потом - выход из обработчика прерываний затем - инициализация микроконтроллера, очистка регистров, подготовка к работе следом - бесконечный цикл после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события. и в конце - конец концов конца программы наконец
_________________ Подпись убрал вместе с автором. aen
Так и быть, поможем студню. Если блоки разделены строкой ======, то Первый блок - указание названия микроконтроллера и подключение заголовка. Второй блок - объявление пеерменных Третий - указание стартового адреса и адреса вектора прерываний Далее - вход в обработчик прерываний потом - выход из обработчика прерываний затем - инициализация микроконтроллера, очистка регистров, подготовка к работе следом - бесконечный цикл после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события. и в конце - конец концов конца программы наконец
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения