Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro
Скачать 6.79 Mb.
|
200 о 100 о 50 Программный цикл Цикл с переключателем т 1 2 3 4 5 6 7 Число выходов Рис. 4.36. Рост размера обработчика прерываний при количества программно реализованных модулей ШИМ На рис. 4.37 показано, как при добавлении новых выходов растет время вы- полнения обработчика прерываний (в командных циклах). Как здесь преимущество за методом копирования, так как наклон прямой в случае его при- менения меньше, чем для всех остальных методов. Результаты проведенного тестирования не слишком-то изменили мое мнение: я по-прежнему предпочитаю для выполнения похожих действий использовать про- граммные циклы. Дело в том, что при копировании кода и его исправлении (которое в этом случае сводится к приписыванию числовых индексов к именам переменных) Подключение к микроконтроллеру периферийных устройств 189 200 2? 150 о 3 х (О а 100 50 Число выходов I Рис. 4.37. Рост времени выполнения обработчика прерываний при увеличении количества программно реализованных мод/лей легко допустить ошибку, которую потом будет не так-то просто заметить и исправить. Кроме того, многократное копирование похожих участков кода проигрывает про- граммному циклу с точки зрения простоты и легкости понимания программы. Итак, тестирование было проведено с целью выяснить, как изменяются размер кода и скорость его выполнения при добавлении новых периферийных устройств к микроконтроллеру. Должен признаться, что результаты оказались совершенно противоположными чего я ожидал, приступая к эксперименту. Но здесь рассматривалась несколько искусственная ситуация с одинаковыми периферий- ными устройствами. В реальной жизни они чаще оказываются разными, поэтому соответствующие фрагменты обработчика прерываний в принципе не могут быть объединены в одном программном цикле. Итак, можно сделать вывод, что при использовании микроконтроллера PIC16F627 (или PIC16F84) и компилятора Lite наиболее эффективный метод добавления новых выходных устройств - это простое размещение в обра- ботчике прерываний от таймера соответствующих фрагментов кода, напрямую работающих с добавляемыми устройствами. Разумеется, для какого-нибудь дру- гого микроконтроллера или другого компилятора результаты аналогичного экс- перимента могут оказаться совершенно другими. 4.14. ИСПОЛЬЗОВАНИЕ ПЬЕЗОЭЛЕКТРИЧЕСКИХ ИЗЛУЧАТЕЛЕЙ И ЗВУКОВЫХ ДИНАМИКОВ Надо сказать, что микроконтроллеры мало приспособлены к тому, чтобы управ- лять звуковыми выходными устройствами. Большинство МК не имеют аппарат- средств для выполнения операции умножения, не работают с числами в фор- ате с плавающей точкой и не могут непосредственно оперировать даже целыми 190 Устройства управления роботами числами, если их разрядность превышает 8 бит. Архитектура микроконтроллеров оптимизирована для работы с цифровой информацией в реальном времени и не рассчитана на вывод аналоговой информации. Несмотря на это, не так уж сложно добавить к нашему устройству простой звуковой сигнализатор. Разумеется, возможности индикации в этом случае све- дутся всего лишь к нескольким гудкам или щелчкам, количество которых и будет сигнализировать о текущем состоянии робота. Как уже говорилось, такое реше- ние имеет многие преимущества по сравнению с использованием жидкокристал- лического дисплея. Схема подключения (или звукового динамика) к микрокон- показана на рис. 4.38. Благодаря конденсатору на динамик подается напряжение только в момент изменения сигнала на выходе микроконтроллера (постоянная составляющая отфильтровывается). Эпюры напряжений на динамике и на выводе микроконтроллера показаны на рис. 4.39. Внешний конденсатор и внутренняя емкость и индуктивность звукового Vcc (R = Ом) (R = 15 Ом) 0,47 Рис. 4.38. Схема подключения звукового индикатора к • ; на выводах • динамика . Напряжение на выводе микроконтроллера 1: , , , Рис. 4.39. Осциллограммы сигналов на звуковом излучателе и на выводе Подключение к микроконтроллеру периферийных устройств 191 излучателя приводят к тому, что цифровой сигнал на выходе микроконтроллера искажается. Реализовать подачу сигнала нужной частоты в выходной порт, к которому подключен звуковой индикатор, можно либо с помощью аппаратного модуля ШИМ, либо с помощью прерываний от таймера. При этом на каждый период выводимого колебания должно приходиться два вызова обработчика, чтобы сфор- мировались два всплеска противоположной полярности. Если прерывания от таймера генерируются каждую 1 мс, то частота сигнала составит 500 Гц - получится нечто среднее между нотами «си» и «до». Нельзя сказать, что этот звук слишком неприятен, но он заметно отличается от чистого «ля» (440 Гц), обычно используемого в электронных приборах. Разумеется, мы могли бы период срабатывания таймера TMRO, но это отразится и на работе всех остальных интерфейсов, которые мы договорились реализовывать с помощью прерываний. 4.15. УСТРОЙСТВО ЗВУКОВОЙ СИГНАЛИЗАЦИИ Как было показано в предыдущем разделе, не слишком трудно заставить микро- контроллер генерировать звуковые сигналы. Как и раньше, для реализации функ- ций нижних уровней используются прерывания от таймера. В этом разделе мы рассмотрим законченное приложение для звуковой сигнализации и, кроме этого, обсудим еще один важный вопрос: как в коде биологического уровня можно реа- лизовать задержки указанной длительности. Схема устройства мало отличается от двух предыдущих, только вместо свето- диода к выводу микроконтроллера подключены конденсатор и звуковой динамик (рис. 4.40). Размещение элементов на макетной плате показано на рис. 4.41, а спи- сок используемых элементов содержится в табл. 4.5. Vcc U1 Vcc 14 + 0,1 R1 10К 4 МГц I 1 15 С RB4 Osc2 Vss - C2 0,47 мкФ Gnd Рис. 4.40. Принципиальная схема сигнализации 192 Устройства управления роботами Рис. Схема размещения элементов на плате Таблица 4.5. Список используемых элементов Исходный текст управляющей программы можно найти в файле Code\ Beeper\beeper.c: // Звуковая сигнализация. // Звуковой динамик включается на 1 с, а затем выключается на 1 с. // // Используются прерывания от таймера TMRO, генерируемые каждую 1 мс. // Частота сигнала составляет около 500 Гц. // // Используемое аппаратное обеспечение: // микроконтроллер PIC16F84/PIC16F627, // тактовая частота 4 МГц, // PIC16F627 использует внутренний тактовый генератор, Обозначение UI R1 С1 С2 SPKR Элемент PIC16F627 или PIC16F84 10 0,25 Вт 0, 7 0,47 мкФ пьезоэлектрический преобразователь Керамический резонатор на 4 МГц, со встроенными конденсаторами Материалы Примечание Микроконтроллер Для «подтягивания» напряжения на выводе _MCLR до напряжения положительной шины питания Для фильтрации напряжения питания Для подключения динамика; можно использовать конденсатор любого типа Для генератора тактовых импульсов микроконтроллера PIC16F84. Для PIC16F627 не требуется Макетная плата, монтажные провода, источник питания +5 В Подключение к микроконтроллеру периферийных устройств 193 // внешний сигнал сброса _MCLR, // подключен к выводу RB4 // через конденсатор емкостью 0,47 // Слово defined PIC16F84 selected _CONFIG(Ox03FF1); // Для PIC16F84: // кварцевый тактовый генератор, // таймер включен, // сторожевой таймер выключен, // защита кода PIC16F627 with internal oscillator selected _CONFIG(Ox03F70); // Для МК PIC16F627: // внутренний тактовый генератор, // RA6/RA7 используются для ввода-вывода, // внешний сигнал сброса, // таймер включен, таймер выключен, // защита кода отключена, // детектор BODEN «else Unsupported selected // Глобальные переменные: volatile unsigned int RTC unsigned char BeeperFlag = 0; // Счетчик реального времени. // Флаг разрешения звучания. static bit trisBeeper (unsigned) // Биты управления выводом RB4. static bit Beeper (unsigned) // Обработчик прерываний: void interrupt { if { // Обработчик прерываний от таймера. = 0; // Сброс флага прерываний. RTC++; // Инкремент счетчика реального времени. // Здесь можно разместить другой код // для обработки прерываний от таймера. if (BeeperFlag) // Переключить состояние звукового динамика. "= 1; } // Конец обработчика прерываний от таймера. // Здесь можно разместить код // для обработки других прерываний. } // Конец обработчика прерываний. ' void Dlay(unsigned int // Задержка на указанное число миллисекунд. 7-2101 194 Устройства управления роботами unsigned int DlayEnd = RTC + + 1; while (DlayEnd != RTC); } // Конец функции void // Разрешить работу звукового динамика. trisBeeper = 0; // Вывод, к которому подключен динамик, // перевести в режим выходного. } // Конец функции разрешения работы динамика. // Главная программа: void = 0; OPTION = OxOD1; = 1; = 1; // Начальный сброс таймера. // Предделитель работает с // коэффициент деления равен 4. // Разрешить прерывания от таймера. // Разрешить обработку прерываний. // Здесь можно разместить код для инициализации // других периферийных устройств. while (1 == 1) { // Разрешить работу звукового динамика. // Бесконечный цикл. // Здесь можно разместить код для реализации // функций биологического уровня. BeeperFlag = 1; BeeperFlag = 0; Dlay(1000); // Включить звуковой динамик // на 1 секунду. // Выключить динамик // на 1 секунду. } // Конец главной программы. Как и прежде, таймер срабатывает каждую миллисекунду. Если флаг разреше- ния работы звукового динамика установлен, то состояние выходного порта изме- няется на противоположное. В результате генерируется сигнал частотой пример- но 500 Гц. Так продолжается секунду, после чего флаг разрешения работы динамика сбрасывается, и в течение еще одной секунды он молчит. В этой программе нам впервые понадобилась функция задержки. Здесь она реализована с помощью счетчика реального времени. Замечу, что к количеству миллисекунд, в течение которых длится задержка, была прибавлена 1 мс, чтобы в любом случае время ожидания не оказалось чуть меньше заданной длительнос- ти (этот вопрос уже обсуждался раньше). Однако необходимо заметить, что такую функцию задержки внутри кода, реа- лизующего функции верхнего (биологического) уровня, надо очень внимательно Подключение к микроконтроллеру периферийных устройств 195 использовать в реальных приложениях, так как во время ее выполнения не могут выполняться другие операции верхнего уровня. Мы еще вернемся к этой пробле- ме в главе 5. 4.16. ИСПОЛЬЗОВАНИЕ ЖИДКОКРИСТАЛЛИЧЕСКОГО ДИСПЛЕЯ Жидкокристаллические часто используются для вывода информации о те- кущем состоянии управляющей программы и для показа получаемых от входных датчиков. К сожалению, для считывания показаний на жидкокристалли- ческом экране часто приходится бегать вслед за роботом по всей комнате. Более удобны в этом отношении вакуумные люминесцентные индикаторы; многие из них по своему внешнему интерфейсу аналогичны жидкокристаллическим. Для подключения ЖКИ к процессору (микроконтроллеру) обычно использу- ется специальный контроллер (чаще всего - микросхема 44780 фирмы Hitachi). Хотя некоторые радиолюбители неохотно такого типа в своих конструкциях, почему-то считая, что для них трудно найти хорошую документацию (к тому же такие контроллеры обычно не слишком дешевы), я ис- пользую их уже много лет - и вам рекомендую. Для управления ЖКИ в большин- стве случаев достаточно всего трех (а то и двух) дополнительных линий; система их команд достаточно проста, а что касается высокой стоимости, то всегда можно найти старое устройство с еще работающим жидкокристаллическим дисплеем. У большинства ЖКИ, которые рассчитаны на работу с контроллером, совмес- тимым с микросхемой 44780, имеется 14 внешних выводов, расположенных на расстоянии дюйма (2,5 мм) друг от друга. Назначение этих выводов описано в табл. 4.6. Таблица 4.6. жидкокристаллических дисплеев Вывод Обозначение Назначение 1 «Земля» (общий) 2 Vcc Положительное напряжение питания 3 Contrast Регулировка контрастности 4 R/S регистра 5 6 Е Тактовые импульсы Data Данные: DO - 7, ..., D7 - 14 Запись информации происходит в параллельном коде по фронту тактовых импульсов Е. Можно не только записывать данные в регистры ЖКИ, но и читать (их; для выбора режима доступа используется линия Типичные временные сигналов показаны на рис. 4.42. Также распространено название жидкокристаллические индикаторы (ЖКИ). - Прим. перев. 196 Устройства управления роботами Рис. 4.42. Временные диаграммы сигналов Здесь показано, как ASCII-код символа записывается в регистр ЖКИ. В коде ASCII символы кодируются одним байтом, все 8 бит которого можно записать в регистры ЖКИ одновременно или в два приема, группами по 4 бита (их называ- ют Сначала записываются старшие 4 бита, а затем младшие. Стро- бирование данных осуществляется сигналом Е (Enable - разрешение). Разработчик должен решить, какой из двух режимов записи он будет использо- вать в своем проекте: 4-разрядный или 8-разрядный. Для реализации первого тре- буется всего шесть внешних выводов (используются только старшие четыре выво- да данных), а для последнего - десять, зато в этом случае скорость работы выше. Специальная управляющая линия R/S предназначена для указания типа ин- формации, которая в данный момент подается на выводы данных. При уровне сигнала R/S на выводы Data можно подавать ASCII код символа, который должен отображаться в текущей позиции курсора (если напряжение на линии имеет низкий уровень), или прочитать код символа, который отображается в данный момент в этой позиции (при высоком уровне сигнала При низком уровне сигнала на линии R/S на выводы Data подается код команды = 0) или с этих выводов читается текущее состояние ЖКИ. Команды контроллера ЖКИ 44780 (и его многочисленных аналогов) приведе- ны в табл. 4.7. Таблица 4.7. Команды контроллера 44780 4 0 0 0 0 0 0 5 0 0 0 0 0 0 D7 14 0 0 0 0 0 0 D6 13 0 0 0 0 0 0 D5 12 0 0 0 0 0 1 D4 11 0 . 0 0 0 1 DL D3 10 0 0 0 1 SC N D2 9 0 0 1 DE RL F D1 8 0 С * * DO 7 1 * S В * * Команда Входы/выходы данных ' дисплея Перемещение курсора в верхний левый угол (Ноте) Указание направления перемещений курсора Включение/выключение дисплея/курсора Смещение курсора/ сдвиг изображения Выбор режимов Подключение к микроконтроллеру Таблица 4 R/S 0 0 0 ] ] 0 0 1 0 1 периферийных устройств 197 .7. Команды контроллера 44780 (окончание) 0 1 BF D D D6 1 А * D D D5 А А * D D А А * D D 03 А А * D D А А * D D А А D D DO А А * D Команда Выбор курсора в области программируемых символов Выбор позиции курсора на дисплея Прочесть занятости Записать код символа Прочитать код символа Примечания: отмечены биты, состояние которых безразлично. ID - если этот бит установлен, то после записи очередного символа курсор перемещается в следующую позицию. S - если этот бит установлен, то после записи очередного символа изображение на дисплее сдвигается. DE - (1) или выключить (0/ экран. С - включить или выключить (0) курсор. В - включить (1) или выключить (0) мигание курсора. SC - включить или выключить режим сдвига изображения на экране. - направление сдвига курсора/экрана: вправо или влево (0). - разрядность данных: 8-разрядные или (0). N г число строк на экране: одна (0) или две символов: или - бит устанавливается, если занят выполнением операции. А - адрес. D - данные. Режим чтения кода символа, находящегося в текущей позиции курсора, поле- зен в тех случаях, когда включена прокрутка изображения. Флаг занятости (Busy Flag - BF) используют, чтобы узнать, завершено ли выполнение предыдущей команды. Этот флаг сбрасывается, если команда уже выполнена. В большинстве конструкций, в которых используется ЖКИ, вывод R/W под- соединен к общей шине питания, так как обычно нет необходимости использо- вать режим чтения. Это упрощает схему устройства, потому что в режиме чте- ния выводы Data становятся выходными и интерфейсная часть схемы должна обеспечить переключение направления передачи данных. Следует учесть, что если вывод R/W заземлен, то уже нет возможности прочитать состояние флага занятости, поэтому после подачи текущей команды приходится делать задерж- ку перед началом следующей, причем длительность этой задержки следует вы- бирать, исходя из максимально возможного времени выполнения команд. На выполнение команд ЖКИ затрачивает разное время. Например, для стира- ния экрана и/или перемещения курсора в начальную (левую верхнюю) позицию требуется около 4,1 мс, а на многие другие команды достаточно и 160 мкс. Вообще говоря, скорость выполнения команд может заметно отличаться у различных ЖКИ, поэтому при составлении программы желательно рассчитывать на самый 198 Устройства управления роботами медленный вариант. В противном случае при замене дисплея придется заново программировать микроконтроллер. Что касается режимов отображения символов, то обычно используемый раз- мер символов — 5x7, что соответствует сброшенному биту F при подаче команды Перед тем как подавать команды или записывать данные, необходимо проини- ЖКИ. Если используется 8-разрядный режим, то алгоритм ини- циализации выглядит следующим образом: 1. Ждать не менее 15 мс после включения питания. 2. Записать в ЖКИ команду 0x030 и ждать 5 мс, пока она не выполнится. 3. Опять записать в ЖКИ команду 0x030 и ждать 160 мкс. 4. В третий раз подать команду 0x03 0 и ждать 160 мкс (или пока не сбросится флаг занятости). 5. Установить режимы: - подать команду выбора режимов работы и тем самым установить разряд- ность данных, число строк и размер символов; - подать команду чтобы выключить экран; - подать команду чтобы стереть изображение на экране; - установить направление перемещения курсора/экрана; - подать команду включения экрана и, если необходимо, курсора. Для инициализации 4-разрядного режима необходимо: 1. Ждать не менее 15 мс после включения питания. 2. Записать в ЖКИ команду 0x03 и ждать 5 мс, пока она не выполнится. 3. Опять записать в ЖКИ команду 0x03 и ждать 160 мкс. 4. В третий раз подать команду 0x03 и ждать 160 мкс (или пока не сбросится флаг занятости). 5. Установить режимы: - подать команду 0x02 для установки курсора в начальную позицию; - подать команду 0x028 для выбора 4-битного режима, после чего все по- следующие команды и данные будут передаваться в два приема; - установить число строк и размер символов; - подать команду 0x00/0x08 (то есть команду 0x008), чтобы выключить экран; - подать команду 0x00/0x01 (то есть команду 0x001), чтобы стереть изоб- ражение на экране; - установить направление смещения курсора/экрана; - подать команду включения экрана и, если необходимо, курсора. Запись данных производится так же, как и запись команд, только в первом случае на линии R/S должно быть напряжение высокого уровня. Во время ини- циализации ЖКИ мы задали режим смещения курсора/экрана, поэтому каждый раз после записи очередного символа либо курсор, либо все изображение на Подключение к микроконтроллеру периферийных устройств 199 экране будет смещаться в нужную сторону - налево или направо. Обычно биты SC и RL устанавливают в 1, то есть ЖКИ работает в режиме телетайпа, когда текст пишется слева направо, а ранее написанный текст уходит за пределы экрана. Можно производить запись символов в различные позиции жидкокристалли- ческого дисплея. В табл. 4.8 приведены форматы различных ЖКИ, совместимых с контроллером 44780. 4.8. Форматы наиболее распространенных жидкокристаллических дисплеев Формат Верхняя Девятый левая символ позиция верхней строки 16x1 8x2 /0x2 20x2 0x2 •2x2 6x4 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0x040 8 • 8 8 8 8 8 8 8 8 8 Начало второй строки - - • - 0x040 0x040 0x040 0x040 0x040 0x040 0x040 0x040 0x040 Начало Начало Наличие третьей четвертой встроенного строки строки контроллера Нет Нет Да Нет До Да Да Да Да Да Да 0x020 0x060 Да 0x020 0x060 Да Для включения курсора (он обычно реализован в виде знака подчеркивания) надо установить бит С. Что касается режима мигания символов (бит В), я не сове- тую его использовать, так как в результате начинается мигание всей прямоуголь- ной области, занятой символом, а это выглядит не слишком привлекательно. Если прокрутка экрана выключена и задано смещение курсора вправо, то при записи очередного символа курсор автоматически передвигается в соседнюю пра- вую позицию, а по достижении правого края очередной строки производится пе- реход на начало следующей. Однако, когда будет заполнена нижняя правая пози- ция, надо подать команду очистки дисплея, чтобы можно было продолжить вывод информации. При подаче команды установки позиции курсора на экране дисплея семь младших разрядов (биты А в табл. 4.7) используются для указания номера пози- ции, на которую должен переместиться курсор. Нужный номер можно узнать с помо- щью табл. 4.8. Используя семь битов, можно адресовать до 128 различных пози- ций, что более чем достаточно для существующих типов жидкокристаллических дисплеев. Коды символов, отображаемые дисплеем 44780 (и совместимыми с ним), в большинстве случаев совпадают с обычным кодом ASCII. Но есть и отличия. 200 Устройства управления роботами Например, не реализован символ «обратный слэш» (\), имеющий ASCII-код Что касается управляющих символов с кодами от до то они не распознаются ЖКИ как управляющие, а соответствуют различным символам (часто это японские иероглифы). ЖКИ 44780 могут отображать восемь различных символов, которые запро- граммировал пользователь; им соответствуют коды от 0x000 до 0x007. Для пе- реключения в режим программирования надо дать команду установки курсора в область программируемых символов, указав нужный адрес в памяти знако- генератора (Character Generator RAM - CGRAM), для этого предназначены биты А в поле команды (см. табл. 4.7). После этого надо последовательно выполнить запись восьми байтов, каждый из которых определяет вид одной горизонтальной линии в изображении программируемого символа (начиная с верхней). Перемещая позицию курсора по области CGRAM, следует помнить, что одно- му символу в памяти знакогенератора соответствует восемь последовательно рас- положенных байтов. Поэтому адрес первого символа равен 0x000, второго - 0x008, третьего - и т.д. Таким образом, вся память CGRAM имеет объем 64 байт, что соответствует восьми программируемым символам. Обычно все во- семь символов программируют за один раз (поэтому используют команду что соответствует установке курсора на нулевую ячейку памяти знакогенерато- ра), после чего производят запись всех 64 байтов. Для регулировки контрастности отображаемых символов надо иметь возмож- ность изменять напряжение на выводе 3. Обычно для этого используется регули- руемый делитель напряжения - потенциометр (рис. 4.43). Изменяя положение движка переменного резистора, можно задать любое напряжение в диапазоне от О до Vcc. Для разных ЖКИ одно и то же напряжение на выводе 3 к раз- личным Для упрощения схемы включения жидкокристаллических индикаторов часто используют сдвиговый регистр, с помощью которого количество подключаемых выводов можно уменьшить до трех или даже двух. Пример схемы для водного интерфейса показан на рис. 4.44. |