#7 прерывания

Сентябрь 9, 2008

Основа любого мк. Что такое прерывание?
Само слово говорит за себя. Программа состоит из 2х частей: главной функции main и кусков кода, называемых обработчиками прерываний.
Когда срабатывает прерывание, то прерывается главная программа, и выполняется код в обработчике прерывания. Когда он выполнился, то программа продолжает работать с той точки, где она остановилась.
Прерывания можно сравнить с обычной жизнью.
Главная программа обычной офисной крысы - сидеть за компом и делать вид усердной работы, копипастя в жежешечку очередной баян.
Каждодневная рутина.
Однако время от времени звонит шеф и просит посмотреть его комп.

Приходится вставать со стула и идти к нему и делать там какую-то работу.
Вот шеф  и есть прерывание.
Приходя снова на свое место, крыса продолжает постить.
А тут звонит секретарша, у которой пропал ярлык ворда.
Секретарша тоже прерывает работу.

Если в жизни у прерываний есть приоритет, то в авр все прерывания важны. Т.е. есть сработало одно прерывание и во время выполнения кода пришло внешнее прерывание, то оно не будет обработано. Поэтому надо запрещать все прерывания на момент срабатывания и потом не забыл снова разрешить их.
Прерывания бывают внутренние от внутренних блоков и внешние.

Для включения прерываний надо записать 1 в определенное место определенного регистра. Для облегчения этой работы все биты были определены в заголовочном файле.
Например USART Control and Status Register B – UCSRB надо в нем включить прерывание, когда данные были полностью приняты с ком порта
Как работать с даташитом?
Нужно найти в списке USART и прочитать об этом модуле и его регистрах. В частности на странице 155 есть этот регистр с битами. Записав единицу в нужное место, мы разрешим прерывание по этому событию. Чтобы usart вообще работал, надо его включить, записав в этот же регистр 1 .
Бит включения прерывания называется Bit 7 – RXCIE: RX Complete Interrupt Enable, а для включения приемника Bit 4 – RXEN: Receiver Enable
 UCSRB = (1<<RXCIE) | (1<<RXEN); 
Для выключения вместо 1 надо писать 0.
Таким образом можно включать и выключать отдельные биты.
Биты можно так же писать и в виде цифр 0-7.
  UCSRB = (1<<7) | (1<<4); 

В АЛУ есть такой регистр SREG, в котором отражается статус работы мк. Там есть один бит, который может одним махом запретить все прерывания.
Bit 7 – I: Global Interrupt Enable
Для работы с прерываниями требуется #include <avr/interrupt.h>
Запретить можно sei(), а включить cli() без точки с запятой.
Это макросы препроцессора и они содержат асм инструкции.

Когда, как, для чего нужны прерывания и что писать в обработчике?
Прерывания используются в критических моментах, где требуется точность или альтернативность выполнения кода.
Самый простой вариант - часы. Нужно точно считать секунды.
Для счета у нас есть счетчики, которые генерируют прерывание при достижении максимального значения. Счетчики могут считать до 255 и до 65535.
Надо настроить счетчик так, чтобы он переполнялся каждую секунду.

Код в прерывании должен быть как можно короче и проще. Все некритичные ко времени процедуры надо выносить в главную функцию.
В нашем случае в прерывании мы будем только прибавлять по единице к переменной, которая хранит число секунд.
Потом у нас есть чуть меньше секунды, чтобы посчитать минуты и часы и вывести это на экран.

При работе с usart в обработчике надо принимать только данные и складывать их в буфер, если там сразу несколько байт в пакете

категория: учим мк avr

ответить

Авторизация только через loginza.

Yandex Google Вконтакте Mail.ru Twitter Loginza MyOpenID OpenID