Помогите разобраться с прогой

FlAsh#

Уважаемые форумчане.
Возник вопрос у понимании этой программы
Мне нужно запрограммировать 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

Вопрос:

  1. Что такое org и зачем оно нужно.

Еще один текст:


loop
sleep
goto loop

Это вставлено в середине программы. Я так понимаю, что если заходим туда, то засипаем навечно…
Просветите пожалуйста.

Lom

Отвечаю:

  1. ORG *** - указатель на область памяти программы, с которой начинается написанный ниже код этой программы.
    Например: ORG 0x00h - это указатель на начало программы. Когда включается контроллер он начинает выполнение программы с этого адреса (нулевого), то есть начинается выполнение следующей за этой ORG 0x00h командой.
    ORG 0x04h - это указатель на выполние прерываний, существующих в программе
    В общем ORG - штука, без которой не обойдется ни одна программа.

  2. По поводу второго текста:
    Да, происходит зацикливание программы и процессор впадает в ‘спячку’.

FlAsh#
Lom:

ORG 0x04h - это указатель на выполние прерываний, существующих в программе

А можно пример именно когда надо использовать ORG 0x04h

Lom:

Да, происходит зацикливание программы и процессор впадает в ‘спячку’.

В программе куча кода значит процессор как то выходит из спячки, как?
Я конечно извиняюсь, возможно эти вопроси для Вас кажутся совершенно тупими, но для меня они непонятные 😦

Gold
FlAsh#:

А можно пример именно когда надо использовать ORG 0x04h

допустим если в описании на процессор сказано, что при переходе сигнала из 0 в 1 на ножке 4 в процессоре происходит прерывание и управление передается по адресу 123. вам нужно начать код обработчика прерываний с адреса 123, для этого и нужна директива org 123. она “перескакивает” на указанный адрес, при этом возможно оставляя неиспользуемую дырку в прошивке.

В программе куча кода значит процессор как то выходит из спячки, как?

значит весь полезный код работает только по прерываниям.

toxa
Gold:

значит весь полезный код работает только по прерываниям.

Очень популярен еще такой вариант. Программа пишется как-бы “линейно”. Типа инициализировались, потом, например, ждем какой-нибудь импульс, потом выдаем какой-нибудь ответ, потом входим в вечный цикл и “зависаем”. То есть программа срабатывает только один раз, затем повисает. Чтобы была постоянная работа такой программы, в процессе инициализации настраивают т.н. watchdog timer, который после определенного интервала времени просто делает этому контроллеру reset.

Это один из способов повышения надежности: линейный код более простой; если в какой-то из редко выполняемых ветвей алгоритма есть глюк, ничего страшного, все равно рано или поздно сбросится и пойдет по-новой.

porphirius

0x04 - это адрес-указатель на процедуру обработки прерывания, возникающего при возникновении фронта/среза (определяется в регистре option_reg) на ногах RB(7…4) контроллера. Собственно, контроллер будет спать до тех пор, пока не изменится состояние на хотя бы одной ноге из RB(7…4), затем он выполнит эту обработку и опять ляжет спать 😃 .

что при переходе сигнала из 0 в 1 на ножке 4 в процессоре

У конкретно PIC16{CR/F}8{3/4} 4ая нога - MCLR. Я думаю, имелась в виду RB4 ?