Помогите разобраться с прогой
Уважаемые форумчане.
Возник вопрос у понимании этой программы
Мне нужно запрограммировать PIC контроллер p16f64
Но уже в самом начале загвоздка.
Есть код:
#incl*ude p16f84a.inc
list p = 16f84
; incl*ude <p16f84.inc>
c1 equ 0*0c
org 0*00
reset
goto start
org 0*04
start
movlw 0*09
movwf c1
loop
incfsz c1,F
goto loop
goto start
end
Вопрос:
- Что такое org и зачем оно нужно.
Еще один текст:
…
loop
sleep
goto loop
…
Это вставлено в середине программы. Я так понимаю, что если заходим туда, то засипаем навечно…
Просветите пожалуйста.
Отвечаю:
-
ORG *** - указатель на область памяти программы, с которой начинается написанный ниже код этой программы.
Например: ORG 0x00h - это указатель на начало программы. Когда включается контроллер он начинает выполнение программы с этого адреса (нулевого), то есть начинается выполнение следующей за этой ORG 0x00h командой.
ORG 0x04h - это указатель на выполние прерываний, существующих в программе
В общем ORG - штука, без которой не обойдется ни одна программа. -
По поводу второго текста:
Да, происходит зацикливание программы и процессор впадает в ‘спячку’.
ORG 0x04h - это указатель на выполние прерываний, существующих в программе
А можно пример именно когда надо использовать ORG 0x04h
Да, происходит зацикливание программы и процессор впадает в ‘спячку’.
В программе куча кода значит процессор как то выходит из спячки, как?
Я конечно извиняюсь, возможно эти вопроси для Вас кажутся совершенно тупими, но для меня они непонятные 😦
А можно пример именно когда надо использовать ORG 0x04h
допустим если в описании на процессор сказано, что при переходе сигнала из 0 в 1 на ножке 4 в процессоре происходит прерывание и управление передается по адресу 123. вам нужно начать код обработчика прерываний с адреса 123, для этого и нужна директива org 123. она “перескакивает” на указанный адрес, при этом возможно оставляя неиспользуемую дырку в прошивке.
В программе куча кода значит процессор как то выходит из спячки, как?
значит весь полезный код работает только по прерываниям.
значит весь полезный код работает только по прерываниям.
Очень популярен еще такой вариант. Программа пишется как-бы “линейно”. Типа инициализировались, потом, например, ждем какой-нибудь импульс, потом выдаем какой-нибудь ответ, потом входим в вечный цикл и “зависаем”. То есть программа срабатывает только один раз, затем повисает. Чтобы была постоянная работа такой программы, в процессе инициализации настраивают т.н. watchdog timer, который после определенного интервала времени просто делает этому контроллеру reset.
Это один из способов повышения надежности: линейный код более простой; если в какой-то из редко выполняемых ветвей алгоритма есть глюк, ничего страшного, все равно рано или поздно сбросится и пойдет по-новой.
0x04 - это адрес-указатель на процедуру обработки прерывания, возникающего при возникновении фронта/среза (определяется в регистре option_reg) на ногах RB(7…4) контроллера. Собственно, контроллер будет спать до тех пор, пока не изменится состояние на хотя бы одной ноге из RB(7…4), затем он выполнит эту обработку и опять ляжет спать 😃 .
что при переходе сигнала из 0 в 1 на ножке 4 в процессоре
У конкретно PIC16{CR/F}8{3/4} 4ая нога - MCLR. Я думаю, имелась в виду RB4 ?