Помогите разобраться с кодом программы частотомера. Для чего
Помогите разобраться с кодом программы частотомера. Для чего
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
- Реклама
- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: Помогите разобраться с кодом программы частотомера. Для
Все это очень интересно, но где сам вопрос? В чем хотите разобраться?
P.S. Когда даете код, помещайте его между тегами [ code ] и [ /code ] (без пробелов). Пока есть возможность редактировать сообщение, исправьте, а то читать тяжело.
P.S. Когда даете код, помещайте его между тегами [ code ] и [ /code ] (без пробелов). Пока есть возможность редактировать сообщение, исправьте, а то читать тяжело.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-
Мурато Мяуконни
- Прорезались зубы
- Сообщения: 203
- Зарегистрирован: Сб ноя 19, 2016 21:05:48
Re: Помогите разобраться с кодом программы частотомера. Для
Да какой там вопрос, это не вопрос, это рыба Студер на нерест пошла. Конец декабря, курсачи, допуски, сессия. А это экземпляр студера жил весело, да беда пришла.
Сейчас у него два пути - либо в армию, там научат, либо в петлю, чтоб не мучиться.
По теме - там в коде все написано. Серьезно
Сейчас у него два пути - либо в армию, там научат, либо в петлю, чтоб не мучиться.
По теме - там в коде все написано. Серьезно
Подпись убрал вместе с автором. aen
- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: Помогите разобраться с кодом программы частотомера. Для
Он вопрос написал в названии темы, "Для чего", но дальше не поместилось, а в сообщении вопрос не продублировал.
Если ник содержит 2 цифры, то это обычно бывает или год рождения, или возраст. Судя по данному нику, студент в 24 года скорее всего уже отслужил
Если ник содержит 2 цифры, то это обычно бывает или год рождения, или возраст. Судя по данному нику, студент в 24 года скорее всего уже отслужил
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Re: Помогите разобраться с кодом программы частотомера.
Для чего нужен каждый блок программы, после начала прерывания?
24 это регион проживания.
24 это регион проживания.
- Реклама
-
Мурато Мяуконни
- Прорезались зубы
- Сообщения: 203
- Зарегистрирован: Сб ноя 19, 2016 21:05:48
Re: Помогите разобраться с кодом программы частотомера. Для
Так и быть, поможем студню.
Если блоки разделены строкой ======, то
Первый блок - указание названия микроконтроллера и подключение заголовка.
Второй блок - объявление пеерменных
Третий - указание стартового адреса и адреса вектора прерываний
Далее - вход в обработчик прерываний
потом - выход из обработчика прерываний
затем - инициализация микроконтроллера, очистка регистров, подготовка к работе
следом - бесконечный цикл
после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события.
и в конце - конец концов конца программы наконец
Если блоки разделены строкой ======, то
Первый блок - указание названия микроконтроллера и подключение заголовка.
Второй блок - объявление пеерменных
Третий - указание стартового адреса и адреса вектора прерываний
Далее - вход в обработчик прерываний
потом - выход из обработчика прерываний
затем - инициализация микроконтроллера, очистка регистров, подготовка к работе
следом - бесконечный цикл
после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события.
и в конце - конец концов конца программы наконец
Подпись убрал вместе с автором. aen
Re: Помогите разобраться с кодом программы частотомера. Для
То это ни чего не значит. Где хочу там и подчёркиваю.Если блоки разделены строкой ======, то
-
Мурато Мяуконни
- Прорезались зубы
- Сообщения: 203
- Зарегистрирован: Сб ноя 19, 2016 21:05:48
Re: Помогите разобраться с кодом программы частотомера. Для
Это вы про что? Вы - автор вопроса?
Подпись убрал вместе с автором. aen
Re: Помогите разобраться с кодом программы частотомера. Для
спасибо за ответ!
Мурато Мяуконни писал(а):Так и быть, поможем студню.
Если блоки разделены строкой ======, то
Первый блок - указание названия микроконтроллера и подключение заголовка.
Второй блок - объявление пеерменных
Третий - указание стартового адреса и адреса вектора прерываний
Далее - вход в обработчик прерываний
потом - выход из обработчика прерываний
затем - инициализация микроконтроллера, очистка регистров, подготовка к работе
следом - бесконечный цикл
после этого - сам обработчик прерывания, разбитый на два блока для обработки прерывания от таймера, там типа секунды считаются, и один блок прерывания от внешнего события.
и в конце - конец концов конца программы наконец


