Микроконтроллеры | Ликбез по программированию PIC , vol. # 2 |
|
---|---|---|
Получил. Интересно будет сравнить. Рассказываю о своём первом варианте программы организации динамической индикации на mb. Для смены отображающихся разрядов использованы прерывания по переполнению таймера TMR0. Немного о прерываниях вообще. Прерывания позволяют следить за какими-либо определенными событиями, не отрываясь от выполнения основной программы. Когда происходит прерывание, контроллер временно останавливает выполнение основной программы и запоминает точку, где это случилось (адрес заносится в стек). Затем, если необходимо, контроллер анализирует - какое именно прерывание произошло (если источников могло быть несколько). Определив источник прерывания, контроллер выполняет предписанные ему программистом для этого случая действия, а затем возвращается к выполнению основной программы - в точку, которую ранее запомнил. PIC переходит по предусмотренному адресу (вектору прерываний) при выполнении следующих условий: Так вот, при выполнении сих трёх условий PIC сохранит следующее значение программного счетчика в стеке, т.е. запомнит - в какой точке произошло прерывание. Затем АППАРАТНО сбросит бит GIE и перейдет по адресу 04, где и располагается заботливо подготовленная нами подпрограмма - обработчик прерываний. После выполнения этой подпрограммы по команде retfie произойдет возврат в исходную точку, при этом будет АППАРАТНО установлен бит GIE. Манипуляции с битом GIE позволяют обрабатывать запросы на прерывания по очереди, чтоб они друг другу не мешали. Флаг запроса на прерывание аппаратно НЕ СБРАСЫВАЕТСЯ! Это - забота программиста. В обработчике прерываний следует предусмотреть сброс флага запроса на прерывание. Спрятать чёртика обратно в коробочку. Иначе получится "заколдованный круг" - контроллер обрабатывает запрос, возвращается к выполнению основной программы, а флаг-то установлен! И опять то же самое прерывание, и так бесконечно. Если хотя бы одно из трёх условий не выполнено - переход на обработку прерывания не произойдёт, и контроллер продолжит выполнение основной программы как ни в чём ни бывало. Теперь немного о самом обработчике. Прежде всего следует помнить, что регистры W, STATUS, а также при необходимости FSR и PCLATH (да и другие) могут использоваться программистом как в основной программе, так и в обработчике прерываний. Как сортир и ванная в коммуналке. Прерывание может возникнуть внезапно, в любой момент - как сосед, которому невтерпёж. Поэтому содержимое регистров W, STATUS, а при необходимости FSR, PCLATH (и др.) следует перед началом обработки запроса на прерывание тщательно сохранить. И затем перед возвратом из обработчика заботливо восстановить. В общем, сосед за собой убирать должен. Так, чтобы основная программа совершенно не почувствовала прерывания, и в счастливом неведении успешно продолжила свою работу. Это называется "сохранение контекста" и "восстановление контекста". Иначе неприятности будут. mikrobasic предусматривает при компиляции сохранение и восстановление контекста сам, автоматически - регистры W, STATUS, FSR, PCLATH. Это облегчает жизнь программиста. О прерываниях рассказано также в "Радио" № 12 за 2001г., стр.23-25 (очень рекомендую прочитать). И ещё вот: |
|
|
ОК! Ждемс. |
|
|
Отлично написано! Коротко, но вместе с тем очень понятно и информативно! |
|
|
Zandy, это от задачи зависит. Однозначно сразу не могу сказать. Splav56, беру на вооружение префиксы g и l для обозначения глобальных и локальных переменных. Отличная задумка, очень полезно. Продолжаю. Для организации динамической индикации предстоит поочередно отображать четыре разряда на индикаторе. Т.е. поочередно выводить информацию о состоянии сегментов на выводы PORTB, информацию о состоянии анодов - на выводы младшей тетрады PORTA. Чтобы убедиться в правильной работе программы, достаточно записать в массив gLED_DIGITS желаемые комбинации сегментов и разрешить прерывания от TMR0. На индикаторе мы увидим вожделенные символы. Например ПU8O. В учебной программе символы отображаются на индикаторе по мере нажатия на кнопки, по порядку. Новый символ появляется в правом разряде, остальные сдвигаются влево. Предусмотрено подавление дребезга. При нажатии на * отображается символ "|_", при нажатии на # - символ "_|". Если нажаты одновременно две кнопки - дополнительно отображается точка. Одновременно три и более кнопки - отображается "П". |
|
|
picmaniac: Предусмотрено подавление дребезга. |
|
|
picmaniac: беру на вооружение префиксы g и l для обозначения глобальных и локальных переменных. Отличная задумка, очень полезно. Так проще не запутаться когда переменных становится много. А в чем провинились префиксы s (symbol) и c (const)? :о) |
|
|
Ни в чём, они тоже при деле. Префикс "с" использован, а символов мне пока не потребовалось. |
|
|
Всем привет. Решил написать здесь так как большая часть этого топика посвящена клавиатурам, а я сам услышал слово пик полторы недели назад. |
|
|
+ блок схема |
|
|
не захотел цеплять |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |