Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro
Скачать 6.79 Mb.
|
Рис. 3.33. схема сторожевого таймера в микроконтроллерах PlCmicro Желательно, чтобы команда выполнялась через промежутки времени, равные половине периода работы сторожевого таймера (с учетом дели- еля). Дело в том, что стабильность встроенного от которого ра- ботает сторожевой таймер, невелика. Погрешность может достигать 20%. Это зна- что на самом деле сторожевой таймер может сработать через период времени IT 14 до 22 мс (если не используется делитель). Тогда если программист обеспе- выполнение команды например, каждые 9 мс, то возможность оши- сброса микроконтроллера будет исключена. Для сброса сторожевого таймера в программе на языке Lite надо исполь- ассемблерную вставку Следует помнить, что работа сторожевого таймера разрешается или запреща- с помощью слова конфигурации, задаваемого при программировании 98 Устройства управления роботами микроконтроллера, и эта установка не может быть изменена в программе. Если программист забудет запретить работу сторожевого таймера и не обеспечит пери- одическое выполнение команды его сброса, то приложение окажется неработо- способным. В микроконтроллере PIC16F627 бит разрешения работы сторожевого таймера по умолчанию установлен в единичное состояние (работа WDT разрешена), по- этому необходимо позаботиться о том, чтобы сбросить его при использовании директивы CONFIG. Если вы желаете использовать сторожевой таймер в своем приложении, я рекомендую разрешать его работу только после того, как програм- ма будет окончательно отлажена. Иначе вам не избежать проблем при отладке. Для формирования запросов на прерывание через заданные промежутки вре- мени используется 8-разрядный таймер TMRO. Он имеется у большинства мик- роконтроллеров PICmicro. Мы будем использовать его в примерах, приведенных в следующей главе. Программист может записать в счетчик таймера TMRO любое число, являюще- еся степенью двойки. Это значение будет увеличиваться на 1 при каждом импуль- се, пришедшем на вход счетчика. Импульсы можно подавать от внешнего источни- ка или от счетчика машинных циклов (длительность последних в четыре раза больше периода работы тактового генератора). Внутри микроконтроллера счетные импульсы синхронизируются с началом очередного периода времени, длительность которого равна двум командным циклам. Поэтому частота срабатывания таймера не может быть больше половины частоты выполнения команд (другими словами, не больше одной восьмой от частоты тактирования). Структурная схема таймера показана на рис. 3.34. Рис. 3.34. Структурная схема таймера TMRO Бит TOCS задает источник счетных импульсов таймера (внешний генератор или командные циклы), а бит ТОСЕ определяет активный фронт, по которому срабатывает счетчик таймера (положительный или отрицательный). Оба бита расположены в регистре OPTION, который будет описан ниже. Счетные импульсы от внешнего источника подаются на вывод TOCKI микро- контроллера. Этот вывод в МК PIC16F627 может также использоваться для обыч- ного ввода-вывода. В режиме работы с таймером вход TOCKI имеет гистерезис (реализованный с помощью триггера Шмитта); это уменьшает вероятность лож- ных срабатываний счетчика. Микроконтроллеры PICmicro 99 Частоту входных импульсов, подаваемых на счетных вход таймера, можно понизить с помощью (prescaler). Это тот же самый делитель, который мы обсуждали, разбирая работу сторожевого таймера. Работой предварительного делителя можно управлять с помощью четырех разрядов регистра OPTION. Бит PSA определяет, для каких целей используется предделитель. Если он установлен в 1, то делитель работает совместно со сторо- жевым таймером, а если сброшен 0 - то с таймером TMRO. Коэффициент деления устанавливается битами PSO, PS1 и PS2 регистра OPTION. Хранящееся в них трехразрядное двоичное число определяет степень двойки, задающую значение коэффициента деления (табл. На рис. 3.35 показано, как подключается к таймеру TMRO или к сто- рожевому таймеру WDT. Таблица Задание коэффициента деления с помощью разрядов PS2 — регистра OPTION Коэффициент деления прескалера 000 001 100 4 8 16 101 32 110 64 111 128 Рис. 3.35. Работа совместно с TMRO и В микроконтроллерах PICmicro младшего и среднего семейства (в том числе и в МК PIC16F627) регистр таймера TMRO располагается по адресу 0x001. Этот регистр доступен как для чтения, так и для записи. Программист должен записать в него нужное значение, а затем установить в 1 бит IE регистра INTCON для разрешения прерываний при переполнении таймера. 100 Устройства управления роботами В микроконтроллерах среднего семейства (следовательно, и в МК PIC16F627) запрос на прерывание вырабатывается, когда в результате прихода очередного счет- ного импульса счетчик таймера переключается из состояния в В ре- зультате устанавливается флаг IF. Если прерывания запрещены (бит GIE сбро- шен), то запрос игнорируется процессором, но флаг IF все равно устанавливается. Перед тем как разрешить прерывания от таймера, программист должен сбро- сить флаг IF, чтобы застраховать себя от неожиданных сюрпризов. Следует помнить, что этот флаг не сбрасывается автоматически, когда процессор подтвер- ждает запрос и переходит на выполнение процедуры обработки прерывания. Для вычисления значения, которое следует загрузить в регистр таймера, что- бы сформировать заданную задержку во времени, программист может использо- вать простую формулу А = 256 - С / 2, где А - загружаемое в регистр таймера начальное значение; С - количество ко- мандных циклов (или число периодов внешних счетных импульсов) за время за- держки. Деление на два учитывает влияние синхронизатора, который задержива- ет каждый счетный импульс до начала очередного периода длительностью в два командных цикла. Значение С в случае, если не используется, надо вычислять по С = x F / 4, где At - длительность необходимой задержки в секундах; F - тактовая частота микроконтроллера в герцах. Деление на 4 учитывает тот факт, что каждый командный цикл длится четыре периода работы тактового генератора. Например, если надо сформировать задержку на 160 мкс при частоте тактиро- вания 4 МГц, то длительность задержки в командных циклах составит С - At х 4 = 160 мкс х 4 МГц 4 = 160 х с х 4 х Гц / 4 - 160. Следовательно, таймер необходимо инициализировать значением А = 256 - 160 / 2 = 256 - 80 = 176. Чтобы сформировать задержку, длительность которой превышает 512 команд- ных циклов, придется использовать предделитель. Чтобы определить необходи- мый коэффициент деления, надо найти такое число, являющееся степенью двой- ки, при делении С на которое в остатке получается число, меньшее Другими словами, надо выполнять деление числа С на 2 до тех пор, пока не получится чис- ло, меньшее 512. Например, для задержки в 5 мс при частоте тактирования 4 МГц необходимое число командных циклов составляет С = = МГц / 4 = 5 х с х 4 х Гц / 4 = 5000. Это число больше 512, поэтому делим его на 2, получаем 2500. Так как резуль- тат опять больше то снова делим его на 2 и получаем 1250. Повторяя деление Микроконтроллеры PlCmicro 101 еще два раза, получаем сначала 625, а затем 312,5. Потребовалась четыре раза раз- делить С = 5000 на 2, чтобы результат стал меньше 512. Два в степени 4 равно 16. Следовательно, необходимый коэффициент деления равен При этом началь- ное значение счетчика таймера составит А = 256 - 312,5 / 2 - 256 - = 99,75. Округляя в ближайшую сторону, получим 100. Итак, для формирования задержки в 5 мс при частоте тактирования 4 МГц надо взять коэффициент деления 16 и инициализировать таймер значением 100. Необходимо иметь в виду, что округление, выполненное нами в приведенных вычислениях, приведет к тому, что задержка окажется несколько меньше. Однако надо еще учитывать время, требуемое для срабатывания самого таймера, форми- рования запроса на прерывание и переключения процессора на процедуру его обработки. Кроме того, нельзя заранее сказать, сколько машинных команд по- требуется компилятору PICC Lite для реализации фрагмента нашего кода. По- этому реальная задержка всегда оказывается длиннее, чем это следует из наших расчетов. Если требуется задержка, длительность которой должна быть выдержана с высокой точностью, то используют модуль СРР (мы обсудим его чуть позже) в режиме широтно-импульсного модулятора, чтобы сформировать импульс задан- ной ширины. Наконец, всегда можно подключить к микроконтроллеру внешний таймер, который вырабатывает импульсы с нужной точностью во времени. В не- которых случаях такое решение оказывается единственно правильным. Для управления многими функциями микроконтроллера используется ре- гистр OPTION. С его помощью задается режим работы выбирается тип тактового генератора и устанавливается источник прерываний. Поэтому мы часто будем обращаться к регистру в наших программах. В фирменной документации Microchip он называется OPTION_REG. Однако чаще всего, в том числе и в программах на PICC Lite, его именуют просто OPTION. Назначение разрядов этого регистра одинаково у всех микроконтроллеров сред- него семейства (табл. 3.12). Таблица Регистр OPTION Номер бита Имя «Подтягивание» выходов порта В к положительному напряжению питания: - выключено; О - включено INTEDG Активный фронт сигнала на входе по которому вырабатывается запрос на прерывание: 1 — положительный фронт низкого уровня на высокий); О — отрицательный фронт высокого на Источник счетных импульсов для таймера / - вход О — командные циклы 102 Устройства управления роботами Регистр OPTION (окончание) Номер бита Имя Назначение 4 TOSE Активный фронт сигнала счетных таймера TMRO на входе 1 — отрицательный фронт; - положительный фронт 3 PSA Назначение 1 - работает с WDT; О - работает с TMRO 2-0 PS2 - PSO Выбор коэффициента деления 000 1:1 001 1:2 1:4 011 1:8 100 1:16 101 1:32 1:64 111 1:128 * При роботе делителя с таймером TMRO из-за влияния синхронизатора реальный деления в два раза больше указанного. - Кроме того, микроконтроллеры среднего семейства имеют специальный режим пониженного энергопотребления (sleep mode - «спящий При этом ток, потребляемый микроконтроллером, становится меньше 10 Обычно этот ре- жим используется, если МК должен ожидать наступления какого-либо события. Наступление этого события приводит к формированию запроса на прерывание. Чтобы ввести микроконтроллер в «спящий режим», надо выполнить команду sleep. Таймеры в «спящем режиме» не работают. Прежде чем использовать режим пониженного энергопотребления в своей раз- работке, надо убедиться, что эффект от этого будет заметным. На фоне значитель- ной емкости батарей питания и большой мощности потребления других устройств выигрыш может оказаться несущественным. Выйти из «спящего режима» можно в результате выполнения следующих со- бытий: понижения и последующего повышения до нормального уровня напряже- ния питания; по сигналу сброса на входе по приходу запроса на прерыва- ние; при срабатывании сторожевого таймера. Если причиной «пробуждения» микроконтроллера послужил запрос на прерывание, то следующая машинная команда выполнится, даже если обработчик прерывания не будет вызван. Чтобы микроконтроллер перешел на обработку прерывания после выхода «спящего режима», надо предварительно установить соответствующий бит раз- решения в регистрах INTCON или PIE. Кроме того, прерывания должны быть разрешены установкой бита GIE регистра INTCON. После «пробуждения» мик- роконтроллер выполняет машинную команду, следующую за командой после чего переходит на процедуру обработки прерывания (вектор 0x004). Если флаг разрешения прерываний GIE сброшен в 0, то после выполнения команды, следующей за командой sleep, микроконтроллер продолжит выполнение про- граммы. Микроконтроллеры PICmicro 103 Из-за описанной особенности процесса «пробуждения», чтобы исключить лишние операции перед выполнением обработчика прерывания, после команды sleep указывается команда пор (no operation - ничего не делать). При использо- вании Lite соответствующий фрагмент программы выглядит следующим образом: sleep пор ИЛИ Кроме того, многие микроконтроллеры имеют встроенную память данных EEPROM. Ее объем в МК PIC16F627 равен 128 байт. Ячейки EEPROM доступ- ны для чтения и записи через специальные регистры. Для обращения к такой па- мяти можно также использовать специальные функции PICC Lite. Некоторые микроконтроллеры, имеющие Flash-память команд (PIC16F62x и PIC16F87x), могут обращаться к этой памяти для чтения или записи. Эту воз- можность используют для хранения данных в энергонезависимой памяти (они не будут уничтожаться после выключения питания), а также если надо, чтобы про- грамма могла изменить свой собственный код. Для обращения к памяти данных EEPROM используются регистры EECON1, EEADR и EEDATA. Регистр EEADR позволяет указать адрес нужной ячей- памяти. При выполнении операции записи в EEPROM в регистре EEDATA указывают записываемые данные, а при выполнении чтения из EEPROM в этот регистр помещаются прочитанные данные. Регистры EECON1 и EECON2 позволяют задать тип доступа к памяти данных. Кроме того, с их помощью можно узнать о том, что операция с EEPROM уже выполнена. Из регистра EECON2 нельзя читать данные. После того как все подго- товлено к записи в EEPROM, в данный регистр надо последовательно записать чис- ла 0x055 и ОхОАА - это служит сигналом к выполнению разрядов регистра EECON1 показано в табл. 3.13. Таблица Назначение разрядов регистра EECON1 Номер бита 7-4 3 1 } 0 Имя - WREN RD Назначение Не 0 Этот бит устанавливается в 1, была ошибка записи Когда этот бит установлен, запись в EEPROM разрешена Устанавливается программистом в выполнения операции записи и автоматически сбрасывается после ее выполнения программистом в начале выполнения операции чтения и автоматически сбрасывается при выполнении следующей машинной команды 104 Устройства управления роботами Для выполнения операции чтения из EEPROM служит следующий фрагмент кода: EEADR = Address; // Задали адрес ячейки EEPROM. RD = 1; // Начали операцию чтения. = EEDATA; // Сохранили в переменной EEPROM_data прочитанное значение. Можно использовать для чтения из EEPROM встроенную функцию PICC Lite; тогда достаточно написать одну строку: = Записать данные в EERPOM несколько сложнее: EEADR = Address; EEDATA GIE = 0; WREN = 1; EECON2 = 0x055; EECON2 OxOAA; WR = 1; GIE = 1; while (WR WREN = 0; // Задали адрес ячейки EEPROM. // Определили записываемые данные. // Запретили прерывания. // Разрешили запись в EEPROM. // Эти две команды не должны быть // разорваны из-за обработки прерывания. // Начали операцию записи. // Разрешили прерывания. // Дождались завершения операции записи. // Убрали сигнал разрешения записи в EEPROM. Две следующие друг за другом операции записи в регистр EECON2 не могут быть прерваны процедурой обработки прерываний, запрос на которые может по- ступить в любой момент. Поэтому приходится запрещать обработку прерываний. Если программист нарушит последовательность подачи и снятия управляющих сигналов, то операция записи в EEPROM не будет выполнена. Вместо того чтобы в цикле проверять состояние бита WR, ожидая сигнал успеш- ного завершения операции записи, можно использовать прерывания. Для этого надо установить бит EEIE. После того как запись в EEPROM будет выполнена, автома- тически установится флаг IF и будет сгенерирован запрос на прерывание. Для выполнения записи в EEPROM также доступна встроенная функция EEPROM_data); Кроме TMRO в микроконтроллере PIC16F627 имеется еще два таймера: 16-раз- рядный TMR1 и 8-разрядный TMR2. Обычно они используются для работы с модулем захвата/сравнения (он будет описан ниже), но также могут применять- ся для формирования задержек во времени, как и TMRO. Структурная схема таймера TMR1 показана на рис. 3.36. Этот 16-разрядный таймер имеет четыре возможных источника синхроимпульсов. Одним из таких источников может быть собственный встроенный генератор импульсов (в этом состоит особенность Тактирование от внутреннего генератора позволяет В документации Microchip работа от внутреннего источника импульсов частотой F/4, ванных с системным тактовым генератором, называется режимом таймера. Работа от внешнего ника импульсов (при установленном бите с включенной синхронизацией шен) называется режимом синхронного счетчика, а при установленном бите SYNCH - режимом асинхронного счетчика. — Прим. Микроконтроллеры PICmicro 105 Рис. 3.36. Структурная схема таймеру продолжать даже если микроконтроллер находится в «спящем режиме». Для работы с таймером TMR1 предназначены два 8-разрядных регистра и TMR1H; оба они доступны как для записи, так и для чтения. Как и в случае с TMRO, при записи в эти регистры каких-либо значений сбрасыва- ется. Когда таймер переполняется, то устанавливается флаг регистра и генерируется запрос на прерывание. Если сброшен бит разрешения реги- стра PIE, или бит разрешения прерываний GIE регистра INTCON, или бит разре- шения прерываний от периферийных устройств регистра INTCON, то запрос игнорируется процессором. Для управления таймером служит регистр Т Назначение его би- тов показано в табл. Таблица Регистр Номер бита 7-6 5-4 3 1 Имя - Назначение Не используется, читается 0 Выбор коэффициента деления - 1:8; 10 - 1:4; 01 - 1:2; 1 - разрешение работы внутреннего генератора тактовых импульсов Если = 0, то используется внешних тактовых с командными циклами процессора 1 - используется керамический или кварцевый резонатор, подключенный к входам и RB7, или внешний источник, подключенный к входу RB6; О - тактирование командными циклами 1 - работа таймера разрешена; О - работа таймера запрещена Только в режиме асинхронного счетчика. - Прим. перев. 106 Устройства управления роботами Внешний источник тактовых импульсов обычно используют для разработки низкоскоростных при- ложений, работающих в реальном времени. Часто выбирают резонатор на 32,768 кГц (он применяется в электронных часах) и два внешних конденсатора емкостью 33 пФ. Можно применять резонатор на 100 или 200 кГц, но емкость конденсаторов в этом случае надо уменьшить до 15 пФ. Схема подключения резо- натора и конденсаторов показана на рис. 3.37. Если в качестве источника тактовых импульсов для TMR1 надо использовать командные циклы процессора, то бит SYNCH должен быть сброшен. Если синхронизация тактовых импульсов не нуж- на, надо установить бит SYNCH; это можно сделать только в то время, пока микроконтроллер находится в «спящем режиме», так как при этом отключен глав- ный тактовый генератор, управляющий выполнением команд, и есть гарантия, что не придет тактовый импульс, пока происходит обращение к таймеру. Начальное значение счетчика таймера и соответствующее время задержки свя- заны соотношением ) х где - длительность задержки в секундах; А - значение, загружаемое в регистр таймера; Р - коэффициент деления - частота тактовых импульсов в герцах (определяемая командными циклами, внутренним генератором таймера TMR1 или внешними импульсами в зависимости от используемого источника тактирования). Отсюда можно выразить значение, которым следует инициализи- ровать счетчик таймера: А- При вычислении коэффициента деления Р надо увеличивать его в два раза начиная с 1 до тех пор, пока число А не станет положительным (аналогично тому, как мы делали это при работе с таймером TMRO). Структурная схема таймера TMR2 приведена на рис. 3.38. Его использование во многом аналогично описанному выше TMRO в режиме тактирования внутренними |