Хартов В.Я. Микроконтроллеры AVR. Практикум для начинающих (2007) (1264222), страница 10
Текст из файла (страница 10)
Программирование портов ввода/вывода 2 2, Обработка внешнигпрерызалий ;задержка ?кнопка отпущена? ?короткая задержка ? перел гашением светодиодов младшеи группы Программа 2.3 ;установка указателя стека на последнюю ? ячейку ОЗУ ;настройка порта РВ на вывод ?настройка порта Ро на .Ьпс1пбе "8515бет.фпс" ?.Тпс1цбе "в8515бех.1пс" .бег "евр = г18 .бег зх Ь = г17 .бег зх Н = г18 .бег зн соб = х22 .бег гед 1еб = х23 ввод .васго ГезхН зи зЬТс Р1НО, 60 гзвр дцьх Ь1б зн сос(, 60 еох зг Н,зн соб воч гед 1еб,зх Н сов гед 1еб опх Ронтв,гед 1ес( с1г гед 1еб ;очистка кода кнопки ;очистка операнда Т=1 ;очистка маски О(МЯК или 61СК) от кнопки ВТАЩЕТ. Открыв при отладке программы окно памяти данных, проверить работу стека, разме- щаемого в памяти с адреса 5025Р. Отлаженную программу загру- зить в микроконтроллер и проверить ее работу.
Обработка кнопочного регистра с индикацией состояния Ввод данных от кнопок рассмотрим на примере программы 2.3, выполняющей последовательный опрос и индикацию нажатия кнопок а%х (х = 0,1,2,3) кратковременным включением соответствующего светодиода 1.Е0х, а также включением светодиодов ЕЕОх (х = 4, 5, б, 7) и выключением после повторного нажатия кнопок б%х (х = 4„5, б, 7).
Обратите внимание на использование в программе макроопределений для проверки состояния кнопок. При каждом нажатии кнопки значение соответствующего бита в слове состояния младшей и старшей групп кнопок (81 1., 8( Н) меняется на противоположное (командой еог) и сохраняется. Для вывода на светодиоды формируется байт вывода гея 1ес1. ;Программа 2.3 для обработки нажатий кнопок и индикации их ;состояний ?файл определений для АТ9088515 ;файл определений для АТведа8515 ;временный регистр ;состояние младшей группы Бн 0123 ;состояние старшей группы ЯН 4567 ;код состояния замкнутой кнопки ;регистр состояния светодиодов ;макроопределение ;проверка кнопки Янх(х=6,5,6,7) и установка бита замкнутой кнопки ;переключение бита состояния ;байт для индикации ;инвертирование для вывода на светодиоды с1г зн соб гса11 ОЕЬАХ наьг: зЬЬз РТНО, 60 гзвр натх Чп?Г: пор .епбвасго ХезсН зи .васго ГезГЬ зи зЬтс Р1НО, 60 гбвр дцтх Ь1б зн соб,60 еог зх Ь, зн сос? аюч гед 1еб, зн соб ог гед 1еб, зх Н сов гед 1еб опх РонтВ, гед 1еб с1г зн соб гса11 ОЕЬАХ 0 огф гед 1еб,ОХОТ оцг РОНТВ гед 1ес( дпьх: пор .еповасго Хезгь зн .огд 8000 гзвр Ьпьх ;***Инициализация*** 1нтТ: 1бб Гавр,1он(НАИЕНО) опх ЯРЬ,Гевр 1сп Гевр,вьдп(РАНЕНО) оцг ЯРН,Гевр зех гавр опх ООНВ,хевр оцх РОНТВ,Гевр с1г Хевр опс Ооно,совр зег гевр оцх РОНТО,Гевр с1г зн соб с1х зс 1 с1г зс Н с1г гед 1еб зев 1прцх: Гезсь Зи 0 Гезхь зн 1 гезгЬ зм 2 хезгь зн 3 ?макроопределение ;проверка кнопки Бих(х=0,1,2,3) и установка бита замкнутой кнопки ;переключение бита состояния ;байт для индикации ;инвертирование для вывода на светодиоды 58 2.
Програмиироваиие портов вводаГвывода геягн яп 4 геягн яи 5 геягп яи б Геяпн яи 7 гзжр гпрпг 1*** Задержка *** 0ВЬАУ 0: 1д1 г21,255 с0: пес г21 Ьгпе 40 гег 1*** Задержка *** РЬЬАХ: 101 г19,10 01: 1аь г20,255 02". 1с11 г21,255 с13: бес г21 Ьгпе дз с1ес г20 Ьгпе 02 с1ес г19 Ьгпе с11 гег Задание 5. На основе 2.3 разработать программу «кодового замка», которая после набора 4-разрядного РП4-кода с помощью кнопок 51й10 — 5%3 и ввода данных, например с помощью кнопки в%5, осуществляет сравнение с паролем и включает светодиод ЕЕП? при правильном вводе.
При трех неправильных попытках введения РПМ-кода кнопочная клавиатура должна быть заблокирована, а все светодиоды включены. Контрольные вопросы 1. Какова роль подтягивающих резисторов? Каким образом можно подключить и отключить резисторы? 2. Как задается альтернативная функция разряда порта? 3. Какие линии портов микроконтроллера можно использовать для внешних прерываний? Каковы адреса векторов внешних прерываний? Как управлять внешними прерываниями? Какое из них имеет более высокий приоритет? 4. Каким сигналом (логический 0 или логическая 1) можно включить светодиод ПТК500? Как должен выглядеть бит порта РПЧхХ в АЪ'В. 81пйо 4 при замыкании (размыкапии) кнопки? 5. Как повысить точность программной задержки? 3.
АРИФМЕТИЧЕСКАЯ ОБРАБОТКА ДАННЫХ Цель работы — изучение способов представления числовых данных в микроконтроллерах, алгоритмов арифметических операций, программирование арифметических процедур. 3.1. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В МИКРОКОНТРОЛЛЕРАХ При обработке числовой информации в микроконтроллерах обычно полагают, что целые числа имеют формат с фиксированной точкой справа — О = а1„1г1'„2...171170, дробные числа меньше 1 имеют формат с точкой слева — 10= а1 1а1 2...а' 1„0а' „, где и— число разрядов, равное 8 или 16.
Обрабатываемые числа могут быть со знаком и без знака. При целочисленном представлении а10 — младший разряд числа с весом 2, старший разряд Ы„ 1 используется для представления знака (Π— положительный, 1 — отрицательный). Старший цифрои-2 вой разряд — 01и 2 с весом 2 . При обработке чисел без знака рази †ряд г(и 1 является цифровым с весом 2 Дробь без знака имеет старший цифровой разряд а' 1с весом 2 '. Для дробных чисел со знаком разряд а1 1 отводится под знак, старший цифровой разряд в этом случае — а1 2 с весом 2 '. Отрицательные числа, как целые, так и дробные, обычно представляют в виде дополнений до основания системы счисления. Для и двоичных целых чисел это будет дополнение до 2, для дробных— дополнение до 2.
В общем случае дополнение любого целого л-разрядного числа 13 до основания Ь системы счисления можно получить путем вычитания 23 из Ь . Если 73 находится в пределах 1 до Ь" -1, то при вычитании получается другое число в тех же пределах. Если В = О, то результат вычитания равен Ь и имеет внд 100...0 при 60 Сложение оложательных чисел Вычитание положительных чисел $80 а Сложение Вычитание Рис. 3.1 Круговые диаграммы 3.
Арифметическая обработка данных общем числе разрядов, равном (и + 1). Отбросив цифру старшего разряда, получим О. Следовательно, в системе представления чисел дополнением до основания системы счисления существует только одно представление О. В системе, где отрицательные числа представлены в дополнительном коде, число является положительным, если значение старшего разряда а!„! = О, и отрицательным, если а!и ! = 1. Десятичный эквивалент двоичного числа, представленного дополнительным кодом, вычисляется так же, как и для числа без знака, за исключением того, что вес старшего разря(л-!) (и-!) да равен — 2 а не +2 . Представляемые числа находятся в (и!) (и-!) диапазоне от — 2 до +2 — 1.
Для дробных чисел дробь положительна, если разряд с( ! = О, и отрицательна, если с/ ! = 1. Диапазон дробных чисел составляет от — 1 до +(1 — 2 ). 3.2. СЛОЖЕНИЕ И ВЫЧИТАНИЕ ЧИСЕЛ В ДОПОЛНИТЕЛЬНОМ КОДЕ Графически 8-разрядные двоичные (2-разрядные шестнадцатеричные) числа со знаком в дополнительном коде показаны на рис. 3.1 позициями (внутри круга указаны десятичные значения, снаружи — их шестнадцатеричные изображения). Сложение с положительным числом )ч) легко интерпретировать, перемещая указатель по ходу часовой стрелки на Х позиций; вычитание ( — )ч()— против хода часовой стрелки или перемещая по ходу часовой стрелки на (256 †) позиций, что равносильно замене вычитания сложением с дополнением числа до 2 = 256. Если при сложении в (или вычитании) получают результат, который выходит за пределы диапазона чисел (от — 128 до +127), фиксируется переполнение.
Правило выявления переполнения. При сложении переполнение возникает только в том случае, если слагаемые имеют одинаковые знаки, а знак суммы отличается от знака слагаемых. При вычитании переполнение происходит, если операнды имеют разные знаки, а знак разности отличается от знака уменьшаемого. Правило переполнения можно сформулировать иначе, используя понятие переносов, возникающих при сложении/вычитании. Переполнение ОУК возникает, если значения переносов в знаковый разряд рт и из знакового разряда р8 различны (Оч'И = р8 ч) рт). Из анализа рис.
3.1, а следует, что переполнение возникает при сложении, если указатель перейдет границу между позициями +127 и — 1 28. 3.2. Сложение и вычитание чисел в дополнительном коде 61 Числа в дополнительном коде складываются и вычитаются так же, как и числа без знака той же длины. Поэтому при сложении (вычитании) чисел со знаком и без знака необходима одна и та же команда сложения (вычитания).
Различие заключается лишь в том, что результаты интерпретируются по-разному в зависимости от того, какими числами оперирует пользователь: числами со знаком (от — 128 до +127) или без знака (от О до 255). На рис. 3.1, б представлены графически 8-разрядные двоичные (2-разрядные шестнадцатеричные) числа без знака. Видно, что двоичные кодовые комбинации занимают те же позиции, что и на рис. 3.1, а, а сложение и вычитание можно осуществить, перемещая указатель на Х позиций в том или ином направлении. 63 3.4. Деление челых чисел 3.
Арифметическая обработка данных При сложении чисел без знака результат выходит за пределы диапазона представления при пересечении границы между 255 и О. В этом случае говорят о возникновении переноса из старшего разряда. При вычитании чисел без знака результат выходит за пределы диапазона при пересечении границы между 0 и 255.
В этом случае возникает заем, а разность получается в дополнительном коде. Но так как вычитание )ч1 можно заменить сложением с дополнительным кодом числа 1ч, равным (256 — Щ то из диаграммы видно, что заем возникает без переноса из старшего разряда. Тот же вывод следует при выполнении операции в машинном коде.
Действительно, вычитая из шестнадцатеричного числа $05 число $07, имеем $05 — $07 = $05 + $Е9 = $РЕ = — 2 . Переноса нет. Заем, определяемый по отсутствию переноса при операции вычитания, есть. И наоборот, вычитая из $07 число $05, имеем $07 — $05 = = $07 + $ГВ = $102 = $100 (перенос) + $02 = 2. Перенос есть, что при вычитании соответствует отсутствию заема. Сказанное необходимо учитывать при обработке операндов двойной длины, например 16-разрядных операндов в 8-разрядном процессоре.