![]() | |
|
Главная Радио и связь Под действием положительного импульса «ЗАПИСЬ В ТРИГГЕРЫ РОКТЙ» информация, установленная на шине данных, записывается в восемь триггеров PORTB (в порт PORTB), в том числе и в триггер P0RTB2. Команда out PORTB,Яг вызывает запись в восемь триггеров порта В содержимого регистра Rr (Rr - любой регистр общего назначения микроконтроллера). Для записи единицы в триггер P0RTB2 хранящееся в регистре число должно иметь вид Obxxxxxlxx, для записи нуля - ОЬхххххОхх. Интересующий нас второй разряд находится не на второй, а на третьей позиции, так как нумерация разрядов начинается с нуля. Здесь х - любое значение (оно не повлияет на запись в триггер P0RTB2), ОЬ - признак двоичного представления числа, так же, как Ох или $ - признаки шестнадцатеричного представления, а отсутствие символов перед числом - признак десятичного представления. Вспомните окно Alarm, вызванное по нажатию Ctrl -Ь Fll: в пятой колонке с комментариями можно было встретить соот-i ветствие между шестнадцатеричным, двоичным и десятичным представле-: нием одного числа. j Под действием положительного импульса «ЗАПИСЬ В ТРИГГЕРЫ DDRB», информация, установленная на шине данных, одновременно записывается в восемь триггеров DDRB (в порт DDRB), в том числе и триггер DDRB2. Записи в порт DDRB соответствует команда out DDRB,Rr. Данные, хранящиеся в триггерах PORTB, могут быть считаны на шину! данных через соответствующие буферы под действием положительного импульса «ЧТЕНИЕ ВЫХОДОВ PORTB». Этой операции соответству команда in Rr, PORTB. Результат будет занесен в регистр Rr, состояние вто рого разряда регистра будет соответствовать информации, записанной триггер P0RTB2. Буферы на функциональной схеме изображены в виде треугольников Можно рассматривать треугольник как стрелку, указывающую направле ние передачи. Передача происходит только при ВЫСОКОМ уровне н; управляющей линии (линия, подведенная к треугольнику сверху ил: снизу). Данные, хранящиеся в триггерах DDRB, могут быть считаны на ши данных через соответствующие буферы под действием положительного импульса «ЧТЕНИЕ ВЫХОДОВ DDRB». Этой операции соответствует команда in Rr,DDRB. То есть не обязательно помнить, какие данные записывались в PORTB или в DDRB, их всегда можно считать из этих портов. Уровни, присутствующие на линиях РВ, в том числе и РВ2, могут быть считаны на шину данных через соответствующие буферы под действием положительного импульса «ЧТЕНИЕ PINB». Этой операции соответствует команда in Rr,PINB. Итак, для работы с портом В программа должна обращаться к трем портам PORTB, DDRB и PINB. Существенный момент: порт PIN В не снабжен триггерами, поэтому запись в этот порт не приводит к изменениям физических состояний схемы. Однако такую виртуальную запись удобно использовать при отладке программы. Посмотрим, что будет происходить при различных уровнях на выходах Q триггеров DDRB2 и P0RTB2. Для этого составим таблицу, отражающую состояние DDRB2, not DDRB2 (для учета инверсии на входе схемы &), P0RTB2, & (выход схемы &), резистора и РВ2 (Табл. 1). Таблица 1. Влияние выходных уровней триггеров DDRB2 и P0RTB2 на состояние линии РВ2
Из таблицы видно, что при ВЫСОКИХ уровнях на выходах триггеров DDRB2 и P0RTB2 на линии РВ2 также присутствует ВЫСОКИЙ уровень. Чтение как порта PORTB, так и порта PINB даст единицу во втором разряде. Но если на контакт микроконтроллера РВ2 подать НИЗКИЙ уровень (попросту соединить его с общим проводом), то чтение PORTB даст единицу в том же разряде, а чтение PINB даст ноль во втором разряде. Любую линию порта можно организовать как вход или как выход; 1. Линия порта - вход, если в DDRBn (п - номер линии) установить НИЗКИЙ уровень (при НИЗКОМ уровне в PORTBn входное сопротивление велико; при ВЫСОКОМ уровне в PORTBn вход соединяется через внутренний резистор с цепью питания микроконтроллера, при отсутствии внешнего сигнала на контакте микроконтроллера РВп присутствует ВЫСОКИЙ уровень). 2. Линия порта - выход, если в DDRBn установить ВЫСОКИЙ уровень (при НИЗКОМ уровне в PORTBn на контакте микроконтроллера РВп присутствует НИЗКИЙ выходной уровень; при ВЫСОКОМ уровне в PORTBn возможен ввод внешних данных через контакт РВп при подсоединении к нему мощного внешнего источника сигнала). Заметим, что все сказанное о порте В относится к любому другому по ту йвода/вывода. Для порта D, например, наименования портов в про грамме изменятся на PORTD, DDRD и PIND. Аналогичное изменение на именований надо делать для портов А и С при использовании микрокоц троллеров, имеющих эти порты. Надо заметить, что аппаратное прерывание RESET автоматически об-нуляет триггеры портов ввода/вывода. Продолжение отладки программы Переменная tmp обнулена. В окне Workspace раскрываем PORTB и PORTD, щелкнув по знаку плюс слева от них. Дважды нажимаем F11: состояние PORTB и PORTD в окне Workspace не изменилось, так как порты, которые инициализировались командами clrtmp, out DDRD, tmp и out PORTB, tmp, уже были обнулены отладчиком, а в реальной схеме были обнулены аппаратным прерыванием RESET. Поэтому перечисленные команды можно опустить, но их присутствие позволит сделать некоторые комментарии. Трижды нажимаем F11: в переменной imp появилась величина OxFF или Obllllllll. В W)rkspace/DDRB и PORTD установлены все флажки. Далее такой записи будет соответствовать «все разряды DDRB и PORTD установлены». Нажать Fll: все разряды PIND установлены. Это физически бессмысленная операция, об этом говорилось выше. Однако не установленные PIND в окне Workspace эквивалентны одновременному нажатию кнопок SA1, SA2 и SA3 схемы контроллера сигнализации (НИЗКИЕ уровни на входных линиях DOOR, CODE и OPEN). Этим способом установить линии проще, чем вручную при каждой новой отладке, щелкая мышкой в окошках для установки галочек. Нажимаем дважды F11: произошла инициализация сторожевого таймера (Witchdog Timer). Сторожевой таймер защищает микроконтроллер от зависания. Его работа не зависит от тактового генератора микроконтроллера, она определяется отдельным внутренним генератором микроконтроллера. Если программно не определить режим работы сторожевого таймера, он будет вызывать прерывание RESET через каждые 16 мс при напряжении питания +5 В (частота генератора сторожевого таймера сильно зависит от напряжения питания). Периодичность прерывания может быть задана программно, мы определили период повторения прерываний примерно в 2 с при напряжении питания +5 В. Сторожевой таймер можно и отключить, но это вряд ли понадобится. 0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 0.0052 |