Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 42 99

Zandy: всю динамическую индикацию - в прерываниях делать
Именно так мы и сделали в "Ликбезе № 2", причём на микробейсике.

 

У меня вопрос по поводу макросов.
Имеем команду ветвления (любую). Если после нее будет стоять макрос, будет ли он восприниматься, как единственная команда? В том смысле, что будет ли осуществляться "перескок" через него, если сценарий предписывает пропустить следующую команду?

 

Zandy: макрос, будет ли он восприниматься, как единственная команда?
Нет, ассемблер его в любом случае разворачивает. И "перескок" будет только через первую ассемблерную команду в составе макроса.

 

Ну вот, наконец сваял. Пришлось малость попотеть. Привык уже к зацикливанию нескольких команд для организации задержек, а также к локальным зацикливаниям при ветвлении сценариев. А тут вся программа имеет единственный цикл через прерывания. При работе в прерываниях нельзя же локальные циклы создавать, если только совсем быстрые, без задержек. А у нас то весь смысл программы в задержках.
Удалить метки Мет1 и Мет2 не получилось по причине того, о чем я спрашивал выше.
Выкладываю в аттаче. В симуляторе все проверено, работает, как положено.
Жду дальнейших указаний.

61451.asm

 

Щас погляжу...
Zandy, да какие указания - стадию "ликбеза" Вы уже прошли. Зач0т Направление дальнейшего развития можете выбирать сами.

 

picmaniac: Направление дальнейшего развития можете выбирать сами.
Да мы ведь только освоили самые простейшие процедуры. Куда дальше то тыркнуться? С точки зрения методологии и постепенного "врубания" в эту науку?
Просто сам я себе пока не могу поставить задачу, т. к. все МОИ задачи требуют гораздо более серьезной подготовки. Вопрос - какой?
Или вы предлагаете завершить "ликбез"?
Просто мне думается, что и для других, читающих эту ветку (я надеюсь, что читатели есть), разбор всяких разных программ может быть полезен. Жалко, что никто из новичков по делу не присоединяется.
А я готов и с удовольствием буду пытаться писать разные программы. Были бы задания.

 

А у меня есть замечание: инициализацию начального значения таймера лучше производить в начале прерывания сразу после сохранинения регистров, т.к. время выполнения процедуры прерывания в большинстве случаев не определено и не постоянно. По этим причинам загрузка счёчика перед завершением прерывания может привести к нестабильности временных интервалов при длительной обработке прерывания.

 

SAK: По этим причинам загрузка счёчика перед завершением прерывания может привести к нестабильности временных интервалов при длительной обработке прерывания.
Здорово! Понял! Я как-то об этом не подумал.
Еще не все высказались. После всех замечаний поправлю.

 

Ещё одно замечание: в процедуре инициализации можно не задавать начальное значение счётчика таймера. Вместо этого можно в команде загрузки INTCON установить флаг прерывания от таймера, сразу после этой команды произойдёт прерывание и установит счётчик в нужное значение. Т.е. дать команду:
ld INTCON,B'10100100'

 

Ясно, спасибо.
А вот по поводу инициализации. Я вставлял там команды "на всякий случай". Нужны ли они реально?
clrf INTCON
clrf SecL
clrf SecR
clrf PORTA
Т. е. регистры после включения питания и так имеют нулевое значение. Или в этом есть какой-то смысл?
Я их ставил потому, что когда гоняешь программу в симуляторе, при сбросе программы на начало, состояние регистров не обнуляются. Поэтому и обнулял их таким образом.