microchip

Большие возможности маленького контроллера


(особенности применения 8-и выводных PIC контроллеров)

Фирма Microchip продолжает разработку и производство передовых продуктов, предоставляющих пользователю большую функциональность и надежность. Новое семейство 8-ми выводных Flash-микроконтроллеров найдет применение во многих отраслях промышленности, медицине и товарах повседневного спроса.

Контроллеры PIC12F629/675 объединили все преимущества архитектуры микроконтроллеров PICmicro и гибкость Flash программной памяти. При низкой цене и малых размерах новые контроллеры обеспечивают функциональность и удобство использования, которые были недоступны ранее. Основные особенности контроллеров серии PIC12Fxxx это диапазон питающих напряжений от 2,0 до 5,5В, тактовая частота до 20МГц, возможность включения калиброванного внутреннего RC-генератора на 4МГц, внутренняя EEPROM память данных, аналоговый компаратор и источник опорного напряжения, до 4 каналов 10 разрядного АЦП и до 6 портов ввода/вывода. Наличие Flash памяти программ и отличные средства разработки, включая внутрисхемный дебаггер-отладчик ICD-2, а также поддержка компиляторами языка Си, позволяет в кратчайшие сроки создавать программы, и делает эти контроллеры идеальными для применения во многих задачах.

Несмотря на малые размеры и ограниченное число портов ввода/вывода, используя лишь схемотехнические и программные трюки, 8-ми выводные контроллеры PIC12Fxxx можно применять в задачах, где традиционно используются их старшие братья.

Управление 6-ю светодиодами от 3-х выводов

Высокий выходной ток до ±20мА портов ввода/вывода микроконтроллеров PIC12Fxxx, позволяет подключать светодиоды без применения дополнительных драйверов. Управление свечением отдельных светодиодов или их комбинаций может быть осуществлено с помощью установки вывода микроконтроллера в "1", "0" или переключение его на вход. Число диодов (D), которое может управляться независимо, определяется числом используемых выводов микроконтроллера (GP) и рассчитывается по следующей формуле:

D = GP*(GP-1)

Рис.1. Схема управления 6-ю светодиодами

Таблица 1. Соответствие состояния портов контроллера

GP0

0

1

Z

Z

0

1

1

0

1

0

1

0

1

GP1

1

0

0

1

Z

Z

0

1

1

0

0

1

1

GP2

Z

Z

1

0

1

0

0

0

0

1

1

1

1

VD1

+

           

+

     

+

 

VD2

 

+

       

+

     

+

   

VD3

   

+

           

+

+

   

VD4

     

+

     

+

+

       

VD5

       

+

       

+

 

+

 

VD6

         

+

+

 

+

       

Определение 3-х состояний одного входа

Вход микроконтроллера может иметь три состояния: подключен к "1", к "0" или не подключен (Z-состояние). Конденсатор заряжается или разряжается в зависимости от состояния выходного порта GP и позволяет определить все три состояния. Вход микроконтроллера находится в третьем состоянии, если при выставлении уровня лог. "1" на порт GP с этого порта считывается "1", и при выставлении лог "0" считывается "0".

Рис.2. Определение трех состояний

Внешний RC-генератор с изменяемой частотой генерации

Частота внешнего RC-генератора определяется параметрами внешней цепи, подключенной к выводу OSC1. Сопротивление этой цепи можно изменять, управляя напряжением на выводе порта GP. Уровень лог. 1 на GP0 подключает резистор R2 параллельно R1, таким образом, общее сопротивление цепи уменьшается, и частота генерации увеличивается. Перевод состояния GP0 на вход увеличивает сопротивление RC-генератора тем самым, уменьшая его частоту. Данный прием позволяет изменять частоту тактирования микроконтроллера, изменять быстродействие системы, а значит – изменять потребление микроконтроллера в зависимости от выполняемой задачи.

Рис.3. Схема управления частотой генерации

Обработка нескольких кнопок с помощью одного входа

Микроконтроллеры PIC12Fxxx имеют аналоговый компаратор с программируемым источником опорного напряжения, а также два таймера с разрядностью 8 и 16 бит. Следующий пример показывает как, используя только один вход микроконтроллера с компаратором, а также один из таймеров, можно определить нажатие одной из нескольких кнопок.

Время заряда конденсатора C1 (см. рис.4) определяется сопротивлением резисторов, подключенных между цепью напряжения питания и конденсатором. При изменении сопротивления изменяется время заряда. Когда какая либо кнопка нажата, напряжение питания подключается к конденсатору через определенное количество резисторов и общее сопротивление зарядной цепи уменьшается, уменьшая время заряда. Использование таймера совместно с компаратором позволяет измерять время заряда, а значит, и определять какая из кнопок нажата.

Программная последовательность:

1) Конфигурируем GP2 как выход с уровнем лог. "0" для разрядки конденсатора.
2) Конфигурируем GP2 как один из входов компаратора, другой вывод компаратора подключается к внутреннему источнику опорного напряжения.
3) Запускаем таймер и измеряем время до срабатывания компаратора.

Если измеренное время соответствует максимальному для данной схемы – значит ни одна из кнопок не нажата и процедура опроса клавиатуры повторяется. Когда какая либо кнопка нажата, скорость нарастания пилообразного сигнала увеличивается, а время срабатывания компаратора уменьшается.

Рис.4. Обработка нескольких кнопок с помощью одного входа

Обработка нескольких кнопок с помощью одного входа с выходом из режима SLEEP

Микроконтроллеры PIC12Fxxx имеют режим микропотребления SLEEP. В этом режиме работа ядра останавливается, и потребление контроллера может снизится до 0,9мкА. Работу предыдущего примера можно дополнить функцией выхода из режима SLEEP при нажатии какой-либо кнопки. Для реализации этой возможности необходимо использовать дополнительный вывод микроконтроллера (рис. 5).

До входа в режим SLEEP нужно сконфигурировать вывод GP2 как выход с установленным уровнем лог. «1», а GP1 как вход с возможностью прерывания по изменению состояния.

Подтягивающий резистор R1 удерживает GP1 в низком состоянии. При нажатии кнопки вход GP1 переводится в высокое состояние через GP2 и Vdd, что приводит к возникновению прерывания и выходу микроконтроллера из SLEEP. После этого нужно записать в GP2 лог. «0», для разряда конденсатора C1 через резистор R2. Затем GP1 устанавливаем в лог. «1», а GP2 конфигурируем как вход компаратора для измерения времени заряда конденсатора.

Рис.5. Обработка кнопок и выход из Sleep

Программная последовательность:
1) GP1 соединяется с общим выводом кнопок;
2) разрешить прерывание по изменению состояния порта GP1;
3) до включения режима SLEEP установить GP1 как вход, а GP2 как выход с лог. «1»;
4) если кнопка нажата, микроконтроллер выходит из SLEEP, установить в GP2 лог. «0» для разряда конденсатора;
5) установить GP1 в лог. «1», определить какая кнопка нажата путем измерения времени заряда.

Клавиатура 4*4 с использованием одного входа

Микроконтроллер PIC12F675 имеет в своём составе 10-и разрядный АЦП с временем измерения до 20мкс. Наличие встроенного АЦП позволяет реализовать клавиатуру с большим количеством кнопок, используя всего один вход (см. рис. 6). При правильном выборе значений номиналов резисторов, замыкание каждой из кнопок сформирует уникальное напряжение, соответствующее именно этой кнопке. Измеряя напряжение Vout с помощью АЦП, можно определить какая именно кнопка нажата. Для однозначности определения нажатой клавиши лучше использовать точные резисторы. Если ни одна из кнопок не нажата - измеренное напряжение будет около 0В.

Рис.6. Клавиатура 4*4

Питание устройства и обмен данными по одной линии

Один вывод микроконтроллера (МК1) может использоваться для однонаправленной связи и как источник питания для другого (МК2). Линия ввода/вывода микроконтроллера МК1 удерживается в высоком состоянии подтягивающим резистором R1 и подаёт питание на МК2. Микроконтроллер МК2, в свою очередь, может передавать данные по этой же линии с помощью транзистора VT1. Конденсатор С1 фильтрует напряжение питания передатчика, а диод предотвращает разряд конденсатора через линию связи пока она находится в состоянии лог. «0».

Следует заметить, что напряжение питания передатчика меньше чем приемника на величину падения на диоде.

Рис. 7. Питание и обмен данными по одной линии

Формирование высокого напряжения

Напряжение выше чем напряжение питания может быть сформировано с использованием одного вывода микроконтроллера. В режиме внешнего RC генератора на выводе CLKOUT/OSC2 присутствует тактовая частота деленная на 4. Когда напряжение на выводе контроллера OSC2 равно нулю, конденсатор накачки С1 заряжается через диод VD1 (рис.8). При напряжении на этом выводе равным Vdd – заряд с С1 переносится через диод VD2 на выходной конденсатор С2. В результате на выходе схемы получаем удвоенное напряжение питания минус падение на двух диодах.

Этот же результат можно получить с помощью любого переключаемого вывода микроконтроллера или вывода ШИМ.

Рис. 8. Удвоитель напряжения на переключаемых конденсаторах

Схема автоматического удержания питания

Используя схему на переключаемых конденсаторах из предыдущего примера, можно создать устройство, поддерживающее свое питание (рис. 9а).

В исходном состоянии транзистор VT1 закрыт, напряжение питания контроллера Vdd равно нулю. При замыкании кнопки напряжение источника питания Vbat подается на вывод питания микроконтроллера, и на выводе CLKOUT/OSC2, в режиме внешнего RC-генератора, возникает генерация. Напряжение, вырабатываемое удвоителем, открывает транзистор VT1, соединяя шину Vbat и Vdd. Таким образом, схема начинает поддерживать своё питание.

Для выключения питания контроллера нужно выполнить инструкцию SLEEP, которая остановит тактовый генератор, что в свою очередь выключит питание микроконтроллера. Данный прием позволяет программно выключать питание устройства.

Преимущества:
- практически нулевое потребление тока
- низкая стоимость (используется n-канальный полевой транзистор)
- высокая надежность
- не требуется дополнительных выводов микроконтроллера.

Рис. 9а. Схема автоматического отключения питания

Еще одна возможная схема поддержания питания показана на рис. 9б. В данной схеме используется стабилизатор питания с входом отключения. В исходном состоянии кнопка разомкнута и схема находится в выключенном состоянии. При замыкании кнопки напряжение с батареи подает разрешающий сигнал на вход включения стабилизатора, на его выходе появляется напряжение +5В, микроконтроллер стартует и выдает логичекую 1 или частоту (если используется, например, RC-генератор с выводом частоты на вывод порта) на управляющий вход стабилизатора. Теперь кнопка может быть отпущена и микроконтроллер удерживает свое напряжение питания. Когда необходимо отключить питание - микроконтроллер выполняет инструкцию SLEEP, тем самым выключается стабилизатор и схема перестает потреблять ток.

Рис. 9б. Схема автоматического отключения питания

Клавиатура и джамперы

Кнопки и джамперы могут быть подключены к одним и тем же выводам микроконтроллера для независимого определения их состояния с использованием минимального количества выводов микроконтроллера. Подтягивающие резисторы подключены одновременно к кнопкам и выводам джамперов. Пока кнопка не нажата и перемычка не замкнута, с вывода порта GP0/1/2/3 считывается уровень лог. «0». Для определения состояния перемычек нужно установить в «1» вывод порта GP4 и каждая замкнутая перемычка даст «1» на соответствующем выводе порта GP0/1/2/3. В то же время, для определения какая кнопка нажата, нужно установить выход порта GP4 в «0» и считать состояние GP0/1/2/3.

Программная последовательность:
когда GP4 = 0 определяем нажатые клавиши.
когда GP4 = 1 и кнопки не нажаты – считываем состояние перемычек.

Рис.10. Определение состояния кнопок и джамперов

Использование микроконтроллера PIC12F675 в качестве интеллектуального датчика

Благодаря малому количеству выводов и наличию встроенного 10-и разрядного АЦП, микроконтроллер PIC12F675 можно использоваться в качестве интеллектуального датчика физических величин. Так, например, добавив токосъемный резистор Rsen последовательно с нагрузкой, можно создать устройство для измерения и ограничения тока, устройство защитного отключения и сигнализации режимов работы, счетчик наработки ресурса и др. Резистор 10Ком ограничивает ток через аналоговый вход и служит для его защиты.

Рис.11. Интеллектуальный датчик

Аналого-цифровое преобразование с повышенной разрядностью

Микроконтроллеры с встроенным АЦП используются в системах регулирования, сбора и обработки данных, в устройствах сигнализации. Напряжение с датчиков в таких системах может быть измерено с помощью встроенного в микроконтроллер 10-и разрядного АЦП, однако на точность измерения влияют различные внешние факторы, такие как изменяющаяся температура, точность элементов схемы, нелинейность датчика, изменяющееся напряжение батареи и помехи промышленной сети. Для некоторых приложений может понадобиться точность измерения более 10 разрядов. Рассмотрим методы, которыми можно преодолеть описанные сложности с помощью любого микроконтроллера PICmicro.

1. Интегрирующий АЦП

Большинство методов аналого-цифрового преобразования используют заряд конденсатора для сравнения напряжения на нем с измеряемым сигналом.

Напряжение заряда RC-цепи определяется формулой:

Vc(t) = VDD * (1 - e-t/(RC)), тогда

t = -RC ln(1 - VREF/VDD)

Отношение VREF/VDD является постоянным, поэтому сопротивление резистора R2 определяется выражением:

R2 = (t2/t1) * R1

Опорный (эталонный) резистор используется для увеличения точности измерения. На рис.12 показаны зарядные кривые для R1 и R2. Время заряда RC-цепи измеряется с помощью таймера и входа порта или компаратора. Зная параметры опорного резистора R1 можно определить параметр R2 и осуществлять калибровку измерений.

Рис.12. Напряжение на резисторе

Этот метод уменьшает зависимость измерений от температуры, снижает требования к точности применяемых компонентов. Более подробное описание данного метода с примерами программ можно посмотреть в заметках по применению «Application Notes» на сайте www.microchip.com:

AN512 Implementing Ohmmeter / Temperature Sensor

AN611 Resistance and Capacitance Meter Using a PIC16C622

Рис. 13. Интегрирующий АЦП

Рассмотрим принцип действия такого преобразователя. Опорный (Rref) и измерительный (Rsen) резисторы подключены к выходам микроконтроллера. Выход GP0 используется для разряда конденсатора и измерения времени его заряда. Таймер используется для измерения времени заряда конденсатора от момента его разряда до срабатывания встроенного компаратора. Данная схема позволяет проводить измерения отдельно для Rsen и для Rref, что позволяет калибровать измерения и увеличить точность.

Компаратор и источник опорного напряжения, присутствующие в микроконтроллерах серии PIC12F629/675, идеально подходят для данной задачи. Так как для измерительного и эталонного резисторов используется один и тот же конденсатор, то нет жестких требований к его температурной стабильности. Для повышения точности лучше использовать пленочный полипропиленовый конденсатор с минимальной остаточной поляризацией диэлектрика.

Программная последовательность:
1. Переключить GP1 и GP2 на входы, а GP0 как выход с уровнем «0» для разряда конденсатора
2. Настроить GP0 как вход и записать в GP1 лог. «1»
3. Измерить время tsen (когда состояние входа GP0 изменится в «1»)
4. Повторить пункт 1
5. Настроить GP0 как вход и записать в GP2 лог. «1»
6. Измерить время tref (когда состояние входа GP0 изменится в «1»)
7. Rsen = (t2/t1) * Rref

2. Метод уравновешивания зарядов

Методы уравновешивания зарядов используют конденсатор для отслеживания отношения уровня входного сигнала к эталонному напряжению. Идея этого метода заключается в поддержании постоянного уровня напряжения на измерительном конденсаторе за счет его заряда от источника измеряемого сигнала и разряда через опорный резистор. Поддержание постоянного напряжения на конденсаторе осуществляется с помощью компаратора и таймера. Каждое срабатывание таймера (такт) проверяется отношение напряжения на входе компаратора и уровня опорного напряжения. Если напряжение на конденсаторе больше опорного то разряжаем конденсатор через резистор RREF, устанавливая выход GP2 в «0». Если же напряжение на конденсаторе меньше опорного – настраиваем GP2 как вход для заряда конденсатора. Число тактов, когда GP2 установлен в «0» за фиксированный промежуток времени, определяет отношение сопротивлений RSEN и RREF.

Так как измерения производятся на фиксированном интервале времени и выходной код пропорционален среднему значению измеряемой величины за этот интервал, то данный метод может применяться для подавления помехи, например, наводке с частотой питающей сети и её гармоник. Для этого интервал измерения должен быть кратным периоду напряжения сети. В описанном методе так же нет особых требований к свойствам измерительного конденсатора.

Наличие компаратора напряжения и программируемого источника опорного напряжения в микроконтроллерах PIC12F629/675 делает эти контроллеры идеальными для данного метода измерения.

Рис.14. Схема АЦП с уравновешиванием зарядов

Расширение динамического диапазона АЦП

Часто для измерения температуры применяются датчики с отрицательным температурным коэффициентом, которые имеют нелинейную температурную зависимость. При уменьшении температуры результирующее сопротивление датчика становится всё меньше и меньше. Обычно такие датчики имеют ограниченный полезный диапазон, так как со снижением температуры измеряемый сигнал становится соизмеримым с разрешением АЦП. Динамический диапазон измерения может быть расширен, если, в зависимости от уровня входного сигнала изменять сопротивление делителя напряжения, в который включен датчик. Для выбора верхнего температурного диапазона установить выход GP1 в «1» а GP2 как вход. Для измерений в области малых температур – наоборот: GP2 выход с лог. «1» а GP1 как вход. Более низкий диапазон увеличит напряжение датчика при снижении температуры и расширит диапазон измерения.

Рис. 15. Расширение динамического диапазона АЦП

Советы по программированию

Размер памяти микроконтроллера определяет его стоимость: чем больше объем памяти, тем больше площадь кристалла и тем больше стоимость микросхемы. Поэтому для уменьшения стоимости устройства разработчику требуется эффективно использовать память программ.

Оптимизация кода помогает избежать применения дорогих контроллеров с большим объемом памяти. Рассмотрим несколько примеров, позволяющих уменьшить размер программы.

1. Временные задержки

Микроконтроллеры обычно используются для связи с "внешним миром" посредством интерфейсных шин, светодиодов, индикаторов, кнопок и т.д. Так как контроллеры работают на фиксированной частоте, в программе часто встречаются подпрограммы задержки на определенное число тактов.

Для формирования больших временных задержек хорошо подходят команды DECFSZ и INCFSZ. Задавая начальное значение переменной, которая будет изменяться этими командами до значения нуля, можно получить задержку на нужное число тактов. Для формирования задержек на несколько циклов применение этих команд становится нецелесообразным. Для уменьшения размера кода можно использовать следующие приемы.

Для задержки на два цикла обычно ставят две команды NOP, занимающие два слова программной памяти. Ту же самую задержку можно получить, используя всего одну команду "goto $+1" (в ассемблере MPASM символ "$" обозначает адрес текущей команды). При выполнении данной команды, как и при выполнении команды NOP, программный счетчик перейдет на выполнение следующей команды, но команда GOTO выполняется за два машинных цикла.

Для задержки на восемь циклов служит следующий пример программы, состоящей всего из трех команд:

         CALL DELAY8t
               ...
DELAY8t  CALL Rtrn
Rtrn     RETURN

Обмен данными между регистром и аккумулятором можно осуществить без использования дополнительного регистра ОЗУ, используя всего три команды. Этот прием не требует дополнительного регистра и может быть оформлен в виде макроса.

W

REG

Instruction

10101100

01011100

XORWF REG,F

10101100

11110000

XORWF REG,W

01011100

11110000

XORWF REG,F

01011100

10101100

Результат

2. Помехоустойчивость программ

Малые размеры, низкая стоимость и микропотребление контроллеров PIC12F629/675, делают их идеальными для применения в необслуживаемых датчиках, устройствах контроля и сигнализации. Поэтому важной задачей при разработке подобных устройств является обеспечение помехоустойчивости микроконтроллера и его безотказной работы длительное время. На устойчивость микропроцессорного устройства к воздействию электромагнитных помех, помимо условий эксплуатации, конструктивного исполнения устройства и разводки печатной платы, влияет и реализация программного обеспечения. Правильно спроектированное устройство должно восстанавливать свою работоспособность без вмешательства обслуживающего персонала. Остановимся подробней на программных методах увеличения устойчивости микроконтроллерного устройства.

Вследствие воздействия помехи существует вероятность изменения состояния какого либо служебного регистра. Так изменение программного счётчика может привести к выходу программы на адреса не занятые программой. Поэтому всю свободную память программ рекомендуется заполнить командой перехода на обработчик такого события. В ассемблере MPASM для этого случая существует специальная директива FILL.

FILL (GOTO Reset), (MAXROM - $);

где Reset – адрес обработчика сбоя адресации;
MAXROM – максимальный адрес памяти программ для данного контроллера.

Особое внимание следует уделить обработке прерываний. При установке флага запроса на прерывание программный счетчик аппаратно устанавливается на вектор прерываний при условии разрешения данного прерывания. Если данный флаг установился из-за воздействия помехи, а прерывание не предусмотрено и не анализируется программой, то произойдет "зависание" работы микроконтроллера. Программа будет постоянно крутиться в цикле обработки прерываний (в связи с возможностью возникновения подобной ситуации, не следует помещать команду сброса сторожевого таймера WDT в прерывания). Для предотвращения подобной ситуации необходимо при возникновении несанкционированного прерывания произвести переинициализацию служебных регистров или, если это допускается в данном устройстве, сбросить контроллер, используя сторожевой таймер WDT.

org h’04’
        btfsc INTCON,T0IF
        goto INT_1 ; обработка прерывания TMR0
        …
        btfsc PIR1,TMR1IF
        goto INT_N ; обработка прерывания TMR1
        goto INIT_CPU ; несанкционированное прерывание, инициализация

3. Начальная инициализация

Следует помнить, что при включении микроконтроллера, его рестарту от сторожевого таймера, состояние служебных регистров может быть не определено или принимать значение, которое было до сброса. Игнорирование этого факта может привести к тому, что программа будет работать по-разному на разных контроллерах, что программа, отлаженная в симуляторе, не будет работать в "железе" и т.п. "чудесам". Например, из-за некорректного содержания регистра PCLATH, при использовании команд GOTO и CALL произойдет некорректный переход. Поэтому при старте программы рекомендуется провести начальную инициализацию всех служебных регистров.

Микроконтроллеры PIC12F629/675 программно и pin-to-pin совместимы с PIC12C6xx, что облегчает перенос программы на новое семейство, а их меньшая стоимость, гибкость Flash-архитектуры, наличие EEPROM памяти данных и большая функциональность делают этот переход экономически обоснованным. В помощь разработчику фирма Microchip выпускает внутрисхемный отладчик ICD2, который позволяет производить отладку программы «внутри» устройства как в пошаговом режиме, так и в режиме реального времени, обеспечивая доступ ко всем регистрам микроконтроллера.

©2007 Гамма-Санкт-Петербург