Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro
Скачать 6.79 Mb.
|
ГЛАВА 4 ПОДКЛЮЧЕНИЕ К МИКРОКОНТРОЛЛЕРУ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ В этой главе мы рассмотрим способы подключения различных периферийных устройств к микроконтроллеру. Здесь будут приведены примеры реа- лизующих функции механического и электронного уровней. Надеюсь, что эти примеры пригодятся вам при разработке собственных устройств. Хотя все опи- санные конструкции построены на основе микроконтроллера PIC16F627, при использовании других контроллеров PICmicro среднего семейства в большинстве случаев никаких переделок не потребуется. То же касается и других использован- ных в схемах элементов. Перед тем как начать читать эту главу, вам необходимо установить на свой компьютер программу MPLAB IDE, компилятор Lite и программный ин- терфейс программатора El Cheapo. Если вы уже провели тестирование програм- матора, описанного в конце предыдущей главы, то вам не составит повто- рить любое из описанных здесь устройств. Как уже упоминалось, первоначально приведенные в этой книге примеры (электронные схемы и программное обеспечение) проектировались на основе микроконтроллера PIC16F84. Этот МК не поддерживает некоторых расширен- ных функций ввода-вывода, которые имеются у МК PIC16F627. Тем не менее адаптация примеров к новому микроконтроллеру не вызвала особых затруднений. Некоторые фрагменты программ стали проще, но основные участки кода совер- шенно не изменились. В описанных здесь примерах функции верхнего (биологического) уровня вы- полняются в основной программе, которая прерывается каждую 1 мс процедурой обработки прерываний от таймера, чтобы выполнить необходимые функции ниж- них двух уровней. Благодаря использованию основного таймера TMRO, имеюще- гося во всех МК, основной код программы в минимальной степени зависит от модели микроконтроллера и используемой периферии. Поэтому при модерниза- ции или замене какого-либо внешнего устройства достаточно только переписать ту часть обработчика прерываний, которая работает с этим устройством. Основ- ной код программы при этом не изменится. Некоторые приведенные в книге конструкции могут вас позабавить, но они так же, как и все остальные, иллюстрируют способы решения проблем, возникающих 5-2101 130 Устройства управления роботами у разработчика автоматических устройств при реализации функций механическо- го и электронного уровней. Везде, насколько возможно, я основывал предлагае- мые решения на использовании прерываний, предоставляя основному коду программы принимать решения верхнего уровня, не отвлекаясь на работу с пери- ферией. Я надеюсь, что приведенные принципиальные схемы окажутся полезными при разработке ваших устройств, а примеры программ помогут научиться надлежа- щим образом проводить разграничение между разными уровнями абстракции при создании управляющего программного обеспечения. Во всех описанных схемах используются только широко распространенные электронные компоненты. Разумеется, при необходимости вы всегда сможете най- ти эквивалентную замену любому из них. 4.1. АППАРАТНЫЕ ИНТЕРФЕЙСЫ Довольно легко разработать схему на основе микроконтроллера, если требуется подключить к нему всего один источник входного сигнала и одно исполнительное устройство. Управляющая программа в этом случае тоже несложна. Трудности начинаются, когда входных и выходных устройств оказывается несколько. Быва- ет, что программа при добавлении новых периферийных устройств усложняется настолько, что не только отказываются должным образом исполнять свои обя- занности новые блоки, но и старые перестают работать. Причины многих неудач заключаются в неправильном планировании. Уже на начальных стадиях проекта необходимо тщательно распределить выполняемые функции и предусмотреть возможность их как можно менее трудоемкой модер- низации. Разумеется, очень трудно спланировать все заранее, тем более, в насто- ящее время темпы развития промышленных технологий настолько стремитель- ны, что многие интерфейсы и компоненты становятся доступны уже после начала работ над проектом. Но вам проще будет внести надлежащие изменения, если вы заранее подготовитесь к этому. Первая вещь, которая поможет вашим разработкам, - это осознание того, что реализация функций управления электромеханическими устройствами (механи- ческий уровень) должна быть отделена от реализации функций управления другими электронными устройствами и интерфейсами (электронный уровень). В свою очередь, оба эти слоя должны разрабатываться отдельно от основной управляющей программы (биологический уровень). Только при таком подходе можно добиться относительной независимости между программным и аппарат- ным обеспечением. Для достижения еще большей гибкости при настройке программного обеспе- чения, рассчитанного на работу с различным оборудованием, желательно создать для управляющей программы надлежащую операционную среду. В идеале это должна быть настоящая операционная система реального времени (Real Time Operating System - RTOS). К сожалению, при использовании большинства име- ющихся микроконтроллеров (в том числе и функционирование такой Подключение к микроконтроллеру периферийных устройств 131 операционной системы в полной мере невозможно. Но в любом случае следует стараться разделять свой проект на отдельные задачи, каждая из которых затем может быть модернизирована без особого ущерба для других. При использовании таких как PIC16F627, важно при проектировании определить последовательность операций, с помощью которых будут реализованы через встроенную в микроконтроллер систему прерываний необходимые функции механического и электронного уровней. Необходимо на- значить для каждой такой функции свою процедуру обработки прерывания или обособленный фрагмент общего обработчика, чтобы разные интерфейсы как мож- но меньше взаимодействовали с другом. Основывая свой проект на микро- контроллере PIC16F627, разработчик должен хорошо ориентироваться в том, ка- кие источники запросов на прерывания и в каких случаях можно использовать. Чтобы обеспечить максимальную совместимость с другими микроконтролле- рами PICmicro я обычно реализую управление последовательностью выполняе- мых операций с помощью таймера TMRO. В большинстве случаев период сраба- тывания таймера рекомендуется выбирать равным 1 мс (точнее, мкс). Такой обеспечивает достаточно быструю реакцию управляющей программы на внешние воздействия и в то же время предоставляет коду верхнего уровня необ- ходимое время для принятия решений. Разумеется, в отдельных случаях проме- жуток между прерываниями приходится уменьшать. Так как длительность командного цикла в микроконтроллерах равна четырем периодам работы системного тактового генератора, то при частоте тактирования 4 МГц задержка длительностью 1024 мкс эквивалентна 1024 командным циклам, поэтому приходится использовать В инициализирую- щей части программы разработчик должен разрешить работу таймера и а также обработку прерываний. После этого запрос на прерыва- ние будет вырабатываться каждый раз, когда счетчик таймера при пересечении границы между и будет сбрасываться в нулевое состояние. Хотя на фоне быстродействия современных компьютеров робот, имеющий задержку реакции на входные воздействия, может показаться слишком медлительным, по сравнению с человеческой реакцией этот показатель все равно впечатляет. Текст обработчика прерываний в наших программах будет выглядеть пример- но так: void interrupt // Обработчик прерываний от if { // Если таймер сработал, = Reset; // то сбросить флаг прерывания RTC++; // и выполнить инкремент счетчика // реального времени. // Здесь можно разместить дополнительный код ' // для обработки прерываний от таймера. } // Конец условного оператора. // Здесь надо разместить код для обработки других прерываний. } // Конец обработчика прерываний. Приведенный образец оформления процедуры обработки прерываний практи- чески не зависит от того, какой именно микроконтроллер вы используете. 132 Устройства управления роботами В главной программе с помощью значения счетчика реального времени RTC, устанавливаемого с помощью обработчика прерываний от таймера, можно реали- зовать выполнение различных операций, требующих точно выдержанных задер- жек во времени. Например, если некоторая операция должна длится 5 мс, то соот- ветствующий фрагмент главной программы выглядит следующим образом: = RTC + 6; != RTC); // Запомнить время окончания операции. // Ждать не менее 5 мс. Здесь к текущему значению счетчика прибавляется число, на 1 большее вели- чины требуемой задержки в миллисекундах. В результате обработчик прерыва- ний от таймера выполнится по крайней мере шесть раз. Это гарантирует, что дли- тельность задержки не окажется меньше 5 мс. В худшем случае она может составить почти 6 мс. Таким образом, реальная длительность задержки лежит в диапазоне 5-6 мс и зависит от того, в какой момент времени выполнен оператор Вставляя необходимый код обработки там, где указано в комментариях, вы можете реализовать выполнение достаточно сложных операций механического и электронного уровней. Если вся операция не может быть выполнена внутри об- работчика сразу (например, из-за того, что приходится выдерживать заданные временные промежутки), всегда можно сделать так, что при каждом вызове об- работчика будут выполняться отдельные части общей задачи. Чуть позже я про- демонстрирую несколько примеров. Во-первых, вы узнаете, как можно с помощью обработчика прерываний, выполняемого каждую 1 мс, реализовать пульсную модуляцию с шагом 30 мс сигнала частотой 32 Гц. Во-вторых, будет показано, как с помощью отдельной процедуры обработки прерываний, исполь- зующей текущее значение счетчика реального времени, реализуется программа для дистанционного управления роботом. Несмотря на то что обе процедуры ра- ботают с одними и теми же аппаратными ресурсами, между собой они напрямую не взаимодействуют. При проектировании периферийных интерфейсов я рекомендую использовать модель конечного автомата. Тогда управление последовательностью отдельных операций, каждая из которых выполняется при очередном вызове обработчика прерываний и реализует часть общей задачи, удобно осуществлять с помощью таблицы переходов или оператора выбора switch. При очередном вызове обра- ботчика по значению соответствующей переменной определяется текущее состо- яние автомата, и по этому состоянию осуществляется переход на тот фрагмент кода, который реализует необходимые действия. В текст описанного выше шаблона процедуры обработки прерываний можно вставить дополнительные фрагменты кода для реализации необходимых реакций на другие прерывания, формируемые, например, при изменении состояния входного От предыдущего запроса на до проходит 1 между шестью вызовами обработчика пять промежутков, к этому еще надо прибавить длительность проме- жутка времени, который прошел между выполнением оператора присваивания и первым запросом на прерывание от таймера. Ясно, что этот промежуток длился не более 1 мс. - Прим. перев. Подключение к микроконтроллеру периферийных устройств 133 порта; в результате прихода сигнала запроса на линию RBO/INT; при записи в EEPROM память данных и т.п. Так как система прерываний у большинства микроконтроллеров PICmicro яв- ляется одновекторной, то при формировании запроса от любого источника управ- ление передается на одну и ту же процедуру обработки. Поэтому каждый раз при- ходится определять, что послужило причиной возникновения запроса, чтобы какие действия необходимо выполнять. В нашем примере это делается помощью условного оператора, проверяющего состояние флага прерывания от Аналогично определяются остальные возможные источники запроса. Та- ким образом, добавление обработчика прерываний от какого-либо определенного устройства никак не влияет на обработку прерываний от других устройств. Чуть позже мы увидим, что обработка прерываний от блока инфракрасного приемника сигналов дистанционного нисколько не мешает обработ- ке прерываний от таймера, а наоборот, использует результат его работы для вы- числения длительности задержек между событиями. При проектировании программного обеспечения следует помнить, что все опе- рации по обработке прерываний должны выполняться как можно быстрее. Ведь во время обработки одного запроса все другие прерывания запрещены, и осталь- ным периферийным устройствам приходится ждать своей очереди. Если вы буде- те слишком долго работать с одним устройством, то рискуете так и не заметить запросы, пришедшие от других. Кроме того, не следует забывать, что для выпол- нения основной программы, реализующей функции биологического уровня, так- же необходимо время. 4.2. ШАБЛОН ПРОГРАММЫ НА ЯЗЫКЕ С Прежде чем начать детальное обсуждение примеров, рассмотрим шаблон прило- жения, на основе которого мы будем строить большинство наших программ. Этот шаблон разработан специально для того, чтобы облегчить возможность безболез- ненного добавления новых функций механического и электронного уровней. При- веденный ниже код можно найти в электронном к этой книге в пап- ке Code\Template: «include // // Шаблон программы управления роботом для компилятора Lite. // // Таймер установлен на срабатывание каждые 1024 // 28.03.2002 - Адаптировано для микроконтроллеров PIC16F627/PIC16F84. // 23.01.2002 - Разработано Майклом Предко. Электронное приложение к этой книге можно скачать с сайта издательства www.dmk.ru. Тексты программ в электронном приложении приведены в том виде, какой они имели в английском ориги- нале. - перев. 134 Устройства управления роботами // Примечания: // Микроконтроллер PIC16F84/PIC16F627 работает на частоте 4 МГц. // Микроконтроллер PIC16F627 использует внутренний тактовый генератор. // Используется внешний сигнал сброса _MCLR. // // Слово defined PIC16F84 selected // Выбран микроконтроллер PIC16F84. CONFIG(Ox03FF1); // Конфигурация PIC16F84: // тактовый генератор XT, // таймер включен, // сторожевой таймер выключен, // защита кода отключена. tfelif PIC16F627 with internal oscillator selected Выбран микроконтроллер PIC16F627. _CONFIG(Ox03F70); // Конфигурация PIC16F627: // внутренний тактовый генератор, // RA6/RA7 используются для ввода-вывода, // используется внешний сигнал сброса, таймер PWRT включен, // сторожевой таймер выключен, // защита кода отключена, // детектор падения напряжения питания включен. Unsupported selected // Ошибка: неправильно выбран тип // Глобальные переменные: volatile unsigned int RTC = 0; // Обработчик прерываний от таймера: void interrupt // Счетчик реального времени. if (TOIF) { // Если запрос на прерывание поступил от таймера TMRO, TOIF = 0; // то сбросить флаг прерывания RTC++; // и выполнить инкремент счетчика времени. // Здесь можно описать дополнительные действия // для обработки прерываний от таймера. } // Конец условного оператора. // Здесь можно разместить код для обработки // от других источников. } // Конец обработчика прерываний. // Главная программа: void TMRO = 0; // Начальное значение счетчика // реального времени. Подключение к микроконтроллеру периферийных устройств 135 OPTION = OxOD1; // Использовать предделитель совместно // с таймером коэффициент деления 4. TOIE = 1; // Разрешить прерывания от таймера. GIE = 1; // Разрешить обработку прерываний. // Здесь надо выполнить инициализацию периферийных while (1 1) // Бесконечный цикл. // Здесь надо разместить код для реализации // функций уровня. } // Конец оператора while. ) // Конец главной программы. Поясним назначение каждой строки, чтобы вы до конца разобрались в том, как строится приложение при использований компилятора Lite. В первой строке к программе подключается заголовочный файл pic.h, в кото- ром определена информация, специфичная для микроконтроллеров PICmicro. В частности, в нем содержатся прототипы библиотечных функций, названия ре- гистров и имена их отдельных разрядов. Как уже упоминалось, компилятор PICC Lite может выполнять трансляцию только для микроконтроллеров PIC16C84, PIC16F84, PIC16F84A и PIC16F627. Следует помнить, что компиляция программ для других микрокон- троллеров PICmicro может завершиться неудачно без каких бы то ни было пре- дупреждающих сообщений. Затем в нашем шаблоне содержится информация об используемых аппарат- ных средствах. Эта часть не является обязательной, но я рекомендую всегда пояс- нять в начале программы, какие особенности микроконтроллеров и периферий- ных устройств используются в приложении. Далее указана директива условной компиляции Она вы- полняется во время компиляции программы, а не во время ее выполнения, в отли- чие от обычного условного оператора Здесь мы используем различные значе- ния слова конфигурации в зависимости от для какого микроконтроллера компилируется программа. Кроме этого, используется еще одна директива - ttwarning: с ее помощью выводится предупреждающее сообщение о типе микроконтроллера, для которого в данный момент производится компиляция. В интегрированной среде MPLAB разработчик должен указать микроконтроллер того же самого типа. Об этом не следует забывать, особенно если новый проект создается на основе старого, кото- рый был рассчитан на работу с другим микроконтроллером. Если указанный тип не совпадает ни с одним из двух описанных вариантов (если используется МК PIC16C84), то выдается сообщение об ошибке - для это- го предназначена директива Для отсчета времени в программе служит беззнаковая переменная RTC (real time counter - счетчик реального времени). Ее значение увеличивается на 1 каждый раз, когда очередной раз выполняется код обработчика прерываний от 136 Устройства управления роботами таймера, а происходит это каждые 1024 мкс. Эта переменная используется для ре- ализации задержек заданной длительности. Переменная RTC является Она объявлена в программе вне какой бы то ни было функции и поэтому может быть использована для чтения и/или записи внутри любой из них, в том числе и в процедуре обработки прерываний. Модификатор указывает, что компилятор не будет оптимизировать доступ к этой переменной, подставлять во все выражения ее предыдущее значение, ведь оно может в любой момент (незаметно для главной программы) измениться в результате выполнения обработчика прерываний. Переменная RTC описана как беззнаковая (unsigned), поэтому ее значение мо- жет быть в диапазоне от 0 до 65535 (OxOFFFF). Напомним, что возможные значе- ния обычных переменных типа int лежат в диапазоне от -32768 до +32767. Код процедуры обработки прерываний располагается отдельно от остальной программы, в микроконтроллерах PICmicro он начинается с адреса 0x0004. Главная программа и вызываемые функции размещаются в конце памяти про- грамм. Функция, описанная как обработчик прерываний (с модификатором inter- rupt), будет вызываться каждый раз, когда произойдет какое-нибудь прерыва- ние. Поэтому в первую очередь требуется определить источник запроса. Для это- го мы проверяем, установлен ли IF прерывания от таймера. Если он установлен, значит произошло переполнение таймера и надо выполнить инкре- мент счетчика RTC. В противном случае прерывание было запрошено другим устройством, поэтому никаких действий со счетчиком реального времени выпол- нять не следует. Если в нашем приложении требуется обрабатывать запросы и других источников, то соответствующий код надо поместить после условного оператора В начале каждого фрагмента обработчика, относящегося к своему источнику прерываний, сле- дует использовать условный оператор, проверяющий состояние соответствующего флага. При этом не стоит забывать о необходимости сбрасывать этот флаг до того, как завершится обработка прерывания. Что касается шаблона основной программы, то он предельно прост. Здесь ини- циализируется значение коэффициента деления прескалера и разрешается его работа совместно с таймером TMRO. Устанавливается начальное значение счет- чика таймера (что гарантирует выполнение 1024 командных циклов, прежде чем первый раз будет сгенерировано прерывание от таймера). Если этого не сделать, то начальное значение счетчика окажется неопределенным, а в результате первый запрос может быть сформирован еще до того, как будет кон- троллер прерываний. Затем следует выполнить инициализацию периферийных устройств. Соответ- ствующий код зависит от того, какие устройства используются. В этом случае функцию логичнее назвать как-нибудь по-другому. - Прим. Подключение к микроконтроллеру периферийных устройств 137 В конце главной программы указан оператор цикла с условием про- должения, которое всегда выполняется == 1). Это приводит к бесконечному лу, который будет закончен только при выключении микроконтроллера или при подаче сигнала сброса. Внутри этого бесконечного цикла выполняется код, реа- лизующий функции биологического уровня. Компилятор Lite всегда размещает функцию main в конце памяти про- грамм. Поэтому машинные команды, соответствующие последнему оператору главной программы, оказываются записанными в последних ячейках памяти. После выполнения этих команд программный счетчик PC снова обнуляется, и программа продолжает выполняться с самого начала. Поэтому даже без явно- го использования оператора цикла можно добиться зацикливания главной про- граммы. Как мы увидим в дальнейшем, реализация приложений на основе представлен- ного шаблона не должна вызывать каких-либо затруднений. Вы будете удивлены тем, с какой легкостью удастся добавлять к проектам новые функции. |