Микроконтроллеры

         

Аппаратные хитрости использования PIC-контроллеров.


В этой статье описаны некоторые схемотехнические приемы, полезные при разработке приборов на базе PIC-контроллеров. Некоторые из них, конечно, можно применять и с другими микроконтроллерами. Разумеется, для некоторых опытных специалистов кое-что может показаться «прописными истинами», но думаю - большое число начинающих работать с микроконтроллерами узнают для себя что-то новое, да и опытным будет полезно.

Дежурный режим

Основное преимущество PIC-контроллеров заключается в их низком потреблении при высоком быстродействии, что очень полезно в приборах с автономным питанием. Еще большей экономии энергии можно достичь при использовании дежурного режима. При этом основное время микроконтроллер находится в режиме sleep, при котором приостанавливается выполнение программы, выключается тактовый генератор, но может продолжать свою работу Watch Dog таймер и некоторые периферийные устройства. Выход из этого режима может производиться по-разному, в зависимости от типа контроллера.

Например, можно запрограммировать Watch Dog таймер («собаку») на определенный период, при срабатывании которого контроллер «проснется», опросит свои входы и, если нужно, перейдет к процедуре обработки. Если никаких действий совершать не нужно, он выполнит команду SLEEP и будет находиться в этом состоянии до следующего срабатывания таймера. При выполнении процедуры обработки следует периодически сбрасывать «собаку» для предотвращения те повторного срабатывания. Используя подобную методику, можно "строить приборы, не требующие выключателя питания, различные сигнализирующие и контрольные приборы.

Очень часто прибор должен быть выполнен в виде пульта (к примеру - пульт ДУ телевизора), который большую часть времени находится в выключенном состоянии, а при нажатии кнопок управления производить соответствующие действия. Реализовать режим «пульт» можно несколькими способами, один из которых описан выше. Период «собаки» в этом случае следует выбирать в диапазоне 0.05-0.1 секунды.

Другие способы не основаны на использовании «собаки», т.е.
контролер не просыпается для опроса кнопок, а остается спать до их нажатия.

В PIC-контроллерах старого семейства (16С5х), для выхода из режима sleep нужно использовать специальную схемотехнику и программирование. При этом обеспечивается подача сигнала «сброс» на контроллер при нажатии любой кнопки (рис. 1).



В дежурном режиме выходы RB2 и RB3 находятся в состоянии «0», конденсатор С заряжен до уровня «1». При нажатии любой кнопки конденсатор быстро разряжается через резистор R2 или R3, что приводит к подаче сигнала «сброс». При сбросе выходы переходят в высокоимпедансное состояние, и разряд конденсатора через R2 (R3) прекращается. Время разряда должно быть больше требуемого для сброса контроллера (около 18 мс), но меньше минимальной длительности нажатия на кнопку (примерно 50-100мс). После снятия сигнала «сброс» (заряде конденсатора через R1) контроллер начинает выполнение программы. При этом на выходы RB2 и RB3 «0», на короткое (около 10 мкс) время, за которое конденсатор не успевает разрядиться, а с входов RB0 и RB1 считывается состояние кнопок. Аналогично можно подключить матрицу клавиатуры, рис. 2.



Новые PIC-контроллеры имеют возможность генерировать прерывание, выводящее из спящего режима при изменении состояния определенных входов, обычно RB4-RB7. При этом возможно как применение нескольких кнопок, так и матрицы клавиатуры (рис.3). Выводы RB4-RB7 запрограммированы на ввод, с включенными внутренними подтягивающими резисторами. Перед входом в режим sleep включается генерация прерываний по изменению состояния (в случае матрицы - выходы RB0-RB3 устанавливаются в «0»).



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

Работа «прерывания по изменению» имеет свои некоторые особенности, в связи с которыми его следует применять только для выхода из спящего режима, а при нормальной работе оно должно быть выключено во избежание ложных срабатываний.



Экономия выводов

Чего всегда не хватает при использовании микроконтроллеров, особенно в небольших корпусах? Числа портов ввода-вывода. Конечно, можно применить контроллер в 40-выводном корпусе, но это не всегда возможно по различным соображениям. К счастью существует ряд схемотехнических уловок, позволяющих многократно использовать одни и те же выводы для разных целей или для управления несколькими устройствами. Рассмотрим некоторые из них. Управление 2-мя светодиодами одним выходом В отличие от микроконтроллеров семейства MCS-51, имеющих выходы с открытым стоком и не требующих переключения режима, в PIC-контролерах выходные каскады активные и для переключения режима

работы (ввод или вывод) служит специальный регистр. Таким образом, каждый вывод любого порта может принимать 3 значения - «0», «1» и «вход», который эквивалентен высокоимпедан-сному («Z») состоянию. Это позволяет управлять двумя светодиодами при помощи единственного вывода (рис.4).





При работе порта в режиме выхода, в зависимости от состояния «0» или «1» горит соответственно верхний или нижний светодиод. При переключении в режим входа последний находится в Z-состоянии, и при соответствующем выборе резисторов ток через светодиоды весьма мал и их свечение почти незаметно.

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

Еще более интересно включение трех пар встречно-параллельных светодиодов по схеме «звезда», рис.5.

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



Ввод аналогового сигнала с выводом стробов

В PIC-контроллерах со встроенным АЦП одни и те же выводы могут использоваться как аналоговый вход, цифровой вход или цифровой выход. Возможно одновременное использование таких выводов для разных целей. В качестве примера на рис.6 показано подключение 7-сегментных индикаторов, при котором выходы сканирования используются как аналоговые входы.



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


Необходимая развязка осуществляется резисторами. Для исключения влияния транзисторных ключей желательно применение полевых транзисторов.

Расширение числа входов-выходов:

Мультиплексорами

При необходимости опроса большого количества цифровых входов, если позволяют временные характеристики, удобно использовать мультиплексоры. К примеру, для ввода 8 сигналов при помощи 561КП2 требуется всего 4 вывода контроллера вместо 8. В случае использования контактных датчиков, подтягивающий резистор может быть один. На рис. 7 показано подключение 4-х кнопок, трехпозиционного переключателя и логического сигнала TTL/CMOS уровня.



Сдвиговыми регистрами

Для экономии выводов при выводе можно использовать сдвиговые регистры, для управления которыми требуется 2 сигнала (данные и строб) и, при необходимости, сигнал защелкивания. На рис.8 для простоты показано использование сдвигового регистра 4015 (561ИР2) и защелок 4042 (561ТМЗ) для вывода восьми разрядов, но, разумеется, выгоднее использовать более современные регистры с защелками, например великолепный 8-разрядный регистр 74НС595.



Этот способ, как и ввод через мультиплексор, никакой особой хитрости не представляет, поэтому рассмотрим более интересный способ вывода. Иногда, когда экономия выводов важнее быстродействия, можно использовать ОДИН вывод для полного управления сдвиговым регистром, используя широтно-им-пульсную модуляцию. На рис.9 показан фрагмент схемы для сдвигового регистра со сдвигом и защелкиванием по положительному фронту.



Выход микроконтроллера постоянно находится в состоянии «О». Подробно процесс записи показан на рис.10. Диаграмма а) отображает сигнал на выходе контроллера. Информационный «0» передается коротким импульсом и длинной паузой, «1» передается наоборот -длинным импульсом при короткой паузе. На диаграмме b) показано напряжение на конденсаторе С2. Постоянная времени R2C2 выбрана таким образом, чтобы это напряжение логически соответствовало сигналу диаграммы с) на входе данных. Состояние входа данных в момент сдвига отмечено крестиком.


Аналогично формируется сигнал защелкивания (LATCH) цепочкой R1C1 и диодом, ускоряющим разряд С1. Соответствующие диаграммы d) и е).



Интерфейс с высоковольтными сигналами

Очень часто требуется вводить сигналы с напряжением, многократно превышающим напряжение питания контроллера и, соответственно, допустимые логические уровни. Это может быть ввод с RS232, рассмотренный ниже, или, к примеру, ввод сетевого напряжения с целью измерения его частоты, фазы или синхронизации с ним. Благодаря наличию защитных диодов на всех выводах PIC-контроллеров, это не составляет большого труда (рис. 11).



Для согласования высоковольтного напряжения с логическим входом служит резистор, ограничивающий ток через защитные диоды на безопасном уровне (для особо ответственных применений желательно этот резистор составить из двух последовательных резисторов, для защиты микроконтроллера в случае пробоя резистора). При оценке точности состояния логического сигнала (в момент перехода через ноль) следует учитывать входную емкость (5 пф) и сопротивление защитного резистора, которое обычно принимается 10 МОм для напряжения 220 В (при этом ток ограничивается на уровне примерно 30 мкА). Выводы MCLR или TOCKI имеют только один защитный диод, соединенный с общим проводом, поэтому при подаче на эти выводы высоковольтных сигналов кроме резистора нужно включить дополнительный защитный диод к питанию.

ИНТЕРФЕЙС С RS232C

Основная задача при соединении устройства на микроконтроллере с компьютером (или другим оборудованием) через RS232 заключается в преобразовании уровня сигналов TTL/CMOS (0-5B) в биполярный сигнал и обратно. При этом очень часто в приборе отсутствует источник повышенного положительного и отрицательного напряжений. Решить эту проблему можно несколькими способами, наиболее удобные из которых описаны ниже.

Использование ADM202

В настоящее время существует множество микросхем-преобразователей уровня, но наиболее удобно применение микросхем, имеющих внутри преобразователь напряжения. Таким микросхемам требуется питание только +5В, от которого питается сам микроконтроллер.


Необходимые для RS232 напряжения (обычно +10 В и - 10 В) вырабатываются емкостным преобразователем, для чего используются внешние конденсаторы (обычно 4 конденсатора емкостью 0.1 или 1.0 мкФ). Такие микросхемы выпускаются различными фирмами, с различным количеством входов-выходов и разным быстродействием. Типичный представитель - микросхема ADM202 фирмы Analog Devices (функциональный аналог микросхемы МАХ202 производства MAXIM). Она имеет по две линии ввода-вывода. Пример использования показан на рис. 12.



Схема на транзисторе

Во многих случаях не требуется работа на больших скоростях и на большие расстояния и достаточно только сигналов передачи данных (TxD и RxD). В этом случае можно воспользоваться простой схемой на одном транзисторе для преобразования уровня и избавиться от необходимости иметь источник отрицательного напряжения или преобразователь. Для сигнала «О» вполне достаточно напряжения +5 В, а для сигнала «1» используется отрицательное напряжение с выхода компьютера. Это напряжение через развязывающий диод заряжает конденсатор, который служит источником отрицательного напряжения независимо от сигнала на выводе TxD компьютера. Для ввода сигнала в контроллер используется наличие защитных диодов на входах самого контроллера, что позволяет вводить биполярный сигнал просто через резистор. Схема данного варианта сопряжения показана на рис.13 При экспериментах можно вообще отказаться от преобразования уровня выхода, т.к. почти все современные последовательные порты компьютеров могут воспринимать од-нополярный сигнал с TTL/CMOS уровнями, но применять это в серийных приборах не рекомендуется, так как этот режим не соответствует стандартам, и могут возникнуть проблемы при работе с другим компьютером.



РАСШИРЕНИЕ ПАМЯТИ

Программной - использование интерпретаторов:

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


Там, где не требуется большое быстродействие, в программную память микроконтроллера можно записать базовые подпрограммы и интерпретатор, а саму программу разместить во внешней памяти с последовательным доступом. Это может быть Форт-интерпретатор, Бэйсик-интерпретатор, или вообще нечто свое. Наружную память «программы» при этом можно наращивать в принципе до бесконечности. Возможно также размещение во внешней последовательной памяти различных таблиц данных (разумеется, это возможно и без интерпретатора, но с учетом увеличенного времени доступа).

Рабочей:

Ячейки ОЗУ (или регистры) подобны программной памяти - их тоже часто не хватает, а иногда требуется просто хранить большие массивы данных. Поэтому применяются различные способы решения этой проблемы, кроме, конечно, иногда вполне справедливого, но не рассматриваемого здесь способа «смени микроконтроллер».

Расширение ОЗУ последовательными EEPROM

В некоторых случаях, когда не хватает внутренних регистров микроконтроллера, время обращения не обязательно мало и запись осуществляется не часто, есть смысл использовать последовательные EEOROM с шиной I2C или SPI, даже тогда, когда не требуется хранить данные при отсутствии питания. Микросхемы серий 24Схх и 93Схх очень доступны и относительно дешевы, чего не скажешь про микросхемы ОЗУ с последовательным доступом. Необходимо только иметь в виду, что количество циклов перезаписи EEPROM ограничено, в остальном же применение последовательных EEPROM сложностей не вызывает (рис.14).



Замечания по работе с I2C

Работа с шиной I2C имеет некоторые особенности. По полному стандарту I2C управление нужно осуществлять двунаправленными выводами, которые при работе на выход имеют открытый коллектор (сток) с подтягивающими резисторами. Это связано с вопросами арбитража и синхронизации. Это выполняется в семействе MCS-51, но не выполняется в PIC-контроллерах, выходы которых активны как в состоянии «0», так и в состоянии «1» (за исключением одного выхода, имеющего открытый сток). Этот вопрос можно решить применением «виртуального открытого стока».


Обычно вывод переключают или на вход или на выход регистром TRIS и при выводе просто записывают «0» или «1» в регистр данных. При «виртуальном открытом стоке» в регистре данных постоянно записан «0», сам вывод подтянут резистором к питанию. И при вводе и при выводе «1» вывод находится в режиме входа и переключается регистром TRIS только при выводе «0». Нужно иметь ввиду, что такая работа нужна только при необходимости соблюдения стандартов 12С, в основном в multi-master среде или с устройствами, которые могут выставлять неготовность по линии синхронизации. При обычной работе с последовательной памятью этого, как правило, не требуется.

Параллельным ОЗУ

Разумеется, при использовании контроллеров с соответствующим количеством выводов, имитируя портами контроллера шины адреса, данных и управления, можно применять обычные микросхемы статической или динамической памяти. Динамическая память имеет большую емкость и позволяет сократить число выводов контроллера за счет мультиплексирования шины адреса и использования 1-битной или 4-х битной шины данных, но требует регенерации. Очень выгодно ее использование в приборах типа «самописец» при условии. что при записи или воспроизведении их частота обеспечивает требуемый период регенерации. В режиме хранения регенерацию можно производить холостым воспроизведением или использовать внутреннюю регенерацию, имеющуюся во многих микросхемах динамической памяти.

«ИНТЕЛЛЕКТУАЛЬНЫЙ КЛЮЧ»

Существует большое количество переносных приборов, в которых по каким-либо причинам нежелательно иметь тумблер или кнопку питания с фиксацией. Удобнее включение-выключение производить или нажатием любой кнопки или специальной кнопки «Вкл» (не фиксируемой). Реализовать это можно различными способами, например, с использованием дежурного режима, но очень часто подобная аппаратура питается от одной-двух пальчиковых батарей через преобразователь, и в целях экономии хочется иметь именно ключ, отключающий все или почти все. Для ключевого элемента лучше всего использовать низковольтный полевой транзистор с малым падением напряжения, но они достаточно дороги и дефицитны, поэтому в случае питания от 2-х и более батареек в качестве самого ключа можно использовать....


другой микроконтроллер, например дешевый 16С505 (0.49$) или восьминожку 12С508 (рис. 15) «Ключевой» контроллер работает от внутреннего генератора или от внешней RC-цепочки, если нужна его пониженная тактовая частота для уменьшения потребления, и находится в спящем дежурном режиме.



В качестве «выхода» ключа используется один или несколько выходов, соединенных вместе. Один вход можно использовать для кнопки «Вкл.», на другой можно подать сигнал с основного микропроцессора, например для программного выключения. Вообще же, если у «ключевого» контроллера еще остаются свободные выводы, то ему можно поручить еще какую-нибудь работу во включенном состоянии прибора, например - выполнять роль еще одного Watch Dog, или генерировать импульсы прерывания на основной микропроцессор. В общем, на что хватит фантазии. В приведенной схеме выход основного контроллера RA4 с открытым стоком используется для блокировки включенного состояния, а выход Р2 вспомогательного - для генерации прерываний.

МИКРОПОТРЕБЛЕНИЕ

В аппаратуре с батарейным питанием необходимо экономить каждый миллиампер-час батарей. Это легко достигается благодаря низкому потреблению самих микроконтроллеров, возможности использования режима sleep и т.д., но при конструировании нужно учитывать различные мелочи.

Для уменьшения потребления нужно использовать микроконтроллеры с буквой «L» в обозначении, на как можно меньшей тактовой частоте и по возможности с низким напряжением питания. При наличии свободных выходов, периодически использующиеся дополнительные устройства (например, последовательные EEPROM) нужно запитывать сигналом «1», включая его только на момент обращения к устройству (рис. 16)



Все неиспользованные выводы портов следует перевести в режим вывода, в режиме sleep нужно перевести все выходные сигналы в состояние с наименьшим током в нагрузке, выключить неиспользуемые внутренние периферийные устройства (например, встроенные АЦП), все входные сигналы должны находиться в четких логических уровнях, не допускать висящих в воздухе входов или подачи на цифровые входы напряжений ниже логической «1» или выше логического «0» (последнее относиться ко всем без исключения CMOS микросхемам, не только к микроконтроллерам).



Не следует забывать, что микросхемы 16С84 и 16LC84 имеют ошибку, в результате которой у них повышенное потребление в спящем режиме, поэтому нужно использовать только 16F84 и 16LF84, у других PIC-контроллеров эта ошибка отсутствует.

Если используется Watch Dog и режим sleep, то в спящем режиме можно устанавливать максимально допустимый в данной задаче период, что уменьшает средний потребляемый ток.

При работе в RC-режиме есть возможность переключения тактовой частоты «высокая/низкая», как показано на рис.17.



Это полезно , когда от микроконтроллера не все время требуется высокое быстродействие. Вывод, обозначенный «I/O pin RA0» находится все время в режиме ввода (высокоимпедансное состояние) и только на определенное время переключается в режим вывода «1», при этом постоянная времени RC-цепочки уменьшается и тактовая частота увеличивается.

Напоследок приведу похожее решение для кварцев. На рис. 18 показано подключение двух кварцев - часового 32768 Гц (LOW) и более высокочастотного (HIGH), коммутируемых микроконтроллером через аналоговый ключ.



Следует заметить, что сам я эту схему не проверял, но авторы утверждают, что она у них работает. Возможно, потребуется экспериментальное определение сопротивления резисторов и емкости конденсаторов для конкретных кварцев. В качестве часовых нужно применять старые отечественные «ромбики» или импортные «спички». Отечественные «спички», как правило, очень плохо работают (а часто вообще не работают) в генераторах PIC-контроллеров.

Литература и полезные ссылки

1. Microchip Microcontrollers Databook

2. Embedded Control Handbook

3. Microchip World Magazine

4. http://www.geocities.com/SillconValley/Way/5807

5. http://www.geocities.com/SiliconValley/Lab/6311

Александр Торрес, г.Харьков, Радиохобби 3/99, 4/99.


AVR 180: Внешняя защита от провалов напряжения


AVR 180: Внешняя защита от провалов напряжения Оригинал: Application Note AVR180 фирмы ATMELОсобенности Детектор пониженного напряжения Предотвращение повреждения содержимого регистров и EEPROM Два варианта исполнения на дискретных устройствах Вариант интегрального исполнения Очень дешевый вариант исполнения Вариант исполнения с очень низким потреблением Формулы для расчета номиналов элементов Законченные схемы примеров Введение

      Это приложение подробно объясняет, как защитить систему от сбоев из-за пропадания напряжения питания. Оно также описывает, как предотвратить работу микроконтроллера при пониженном напряжении, используя внешние детекторы низкого напряжения. Эти явления часто называются "Brown-Outs" - когда напряжение питания ниже допустимого уровня, или "Black-Outs" - когда на какое-то время оно полностью пропадает.

      Подробно описывается два варианта решения на дискретных компонентах, позволяя пользователю настроить их под конкретные требования системы. Так же как и схему в интегральном исполнении. Благодаря использованию этих методов, в вышеописанных ситуациях можно предотвратить: Повреждение содержимого регистров CPU Повреждение содержимого I/O регистров Случайное переключение I/O выводов Повреждение содержимого SRAM Повреждение содержимого EEPROM Повреждение содержимого внешней энергонезависимой памяти

      Обратите внимание, что недостаточное напряжение питания ни когда не влияет на содержимое внутренней FLASH памяти программ AVR микроконтроллера.


Теория

      Для того чтобы CPU (процессор) микроконтроллера мог успешно декодировать и выполнять инструкции программы, питающее напряжение должно всегда быть больше минимально допустимого уровня, зависящего от рабочей частоты. Когда напряжение питание опускается ниже этого уровня, CPU может начать выполнять некоторые инструкции неправильно. В результате могут происходить не запланированные процессы во внутренней памяти и на линиях управления.
Это может привести к повреждению информации в регистрах CPU, I/O регистрах и в памяти данных.       Для того чтобы избежать этого, необходимо не допустить выполнение кода CPU, при провалах напряжения питания. Для этого лучше всего использовать внешний детектор пониженного напряжения питания. При уменьшении напряжения ниже фиксированного порога Vt, детектор формирует низкий (активный) уровень на выводе RESET. Это немедленно останавливает CPU, не позволяя ему выполнять программу. Пока напряжение питания ниже порогового Vt, микроконтроллер остановлен, и система находиться в известном состоянии. Когда напряжение питания снова поднимается до установленного значения, вывод RESET освобождается и микроконтроллер начинает выполнять программу с адреса вектора сброса (0x0000).
Пороговое напряжение       Рекомендуется устанавливать пороговое напряжение на 5-15% ниже рабочего Vcc, допуская таким образом небольшое колебание напряжения питания. Пороговое напряжение должно всегда выбираться так, чтобы детектор формировал сброс, когда напряжение становиться ниже минимально допустимого для CPU. Необходимо гарантировать достаточно высокое пороговое напряжение детектора даже в самых плохих случаях.
Защита содержимого регистров CPU       Когда детектор формирует сигнал сброса микроконтроллера, работа CPU прерывается. Когда сброс снимается, регистры CPU будут содержать значения устанавливающиеся по умолчанию. В течение сброса, содержимое генеральных регистров сохраняется. Без детектора, случайная активность CPU, как описано во введении, может привести к повреждению информации в регистрах CPU. См. также "ОЗУ".       Замечание: не гарантируется сохранность содержимого генеральных регистров во время сброса в микроконтроллерах AT90S1200, AT90S8515 , AT90S4414.
Защита содержимого I/O регистров       Когда используется детектор, удерживающий MCU в режиме сброса, во время сброса содержимое всех I/O регистров становится равным устанавливаемому по умолчанию.


Следовательно, все периферийные устройства микроконтроллера также будут находиться в состоянии сброса. Без детектора, непредсказуемая активность CPU, вроде описанной выше, может привести к записи случайного значения в регистр I/O. Это может вызвать нежелательную работу периферии.
Защита от произвольного переключения I/O выводов       Когда детектор удерживает MCU в режиме сброса, то состояние всех I/O выводов становится равным устанавливаемому по умолчанию. Без детектора, непредсказуемая активность CPU, вроде описанной выше, может привести к записи случайного значения в I/O регистры. Это может привести к появлению нежелательных сигналов на I/O выводах.
Защита содержимого SRAM       Благодаря использованию детектора напряжения, запрещается доступ к внутренней SRAM. Память сохраняет свое содержимое во время сброса. Без детектора, непредсказуемая активность CPU, вроде описанной выше, может привести к записи случайного значения в любую область памяти. Смотри также "ОЗУ" ниже.      Замечание: В AT90S8515 и 4414 не гарантируется сохранение данных во внутреннем SRAM во время сброса.
Защита содержимого энергонезависимой памяти       Энергонезависимая память, такая как EPROM, EEPROM и Flash сохраняют свое содержимое даже при полном отключении питания. Но использование детектора для удержания микроконтроллера в режиме сброса, прекращает всю активность на линиях управления. Таким образом, во время сброса содержимое памяти защищается от случайной записи. Без детектора, непредсказуемая активность CPU, вроде описанной выше, может привести к непреднамеренной записи случайного значения в любую область энергонезависимой памяти и привести к повреждению содержимого.       Замечания:       Так как AVR CPU не способен записывать информацию в свою собственную программную память, то содержимое внутренней FLASH памяти программ не повреждается при сбоях питания.       Для записи информации в любую энергонезависимую память требуется какое-то минимальное напряжение.


Если во время цикла записи напряжение питания упадет ниже этого минимального значения, то произойдет сбой записи, повреждая содержимое записываемой ячейки.       В некоторых AVR микроконтроллерах, когда при записи во внутреннее EEPROM активизируется сброс, Регистр адреса устанавливается в ноль (0х0000). В результате могут быть повреждены обе ячейки - записываемая и ячейка по адресу (0х0000).
Flash память программ
      Содержимое внутренней FLASH памяти программ не повреждается при сбоях питания, так как AVR CPU не способно записывать информацию в свою собственную программную память.
ОЗУ
      Даже, когда внешний детектор пониженного напряжения останавливает CPU, регистры и ОЗУ все равно потеряют свое содержимое, если напряжение питания упадет ниже уровня необходимого для сохранения в ячейках памяти их содержимого. При остановке CPU, минимальное напряжение, при котором гарантируется сохранение содержимого внутреннего ОЗУ AVR контроллеров, составляет 2 вольта. Заводские испытания при использовании стандартных кремниевых пластин показали, что фактически содержимое сохраняется даже при напряжении 0,5 - 1 вольт.
Реализация
      Доступно большое разнообразие различных интегральных схем детекторов от разных производителей. Предлагая высокую точность при низкой цене, они обычно гарантируют точность порогового напряжения ± 1%. Кроме простых трехвыводных детекторов на фиксированные напряжения, есть также большое количество устройств имеющих такие дополнительные функции, как удлинение импульса сброса, сброс при включении напряжения питания, сторожевой таймер, регулятор напряжения, переключатель на резервное питание и так далее, Это приложение является своего рода путеводителем по миру интегральных схем. Как альтернатива так же описывается два детектора пониженного напряжения на дискретных элементах.       Вариант 1: Минимальная потребляемая мощность. Хорошо подходит для приложений с батарейным питанием, где потребление один из наиболее важных параметров.       Вариант 2: Минимальная стоимость.


Дешевое решение для применений, где стоимость наиболее важный параметр, а потребляемая мощность не так важна.       Вариант 3: Высокая точность. Высокоточная интегральная микросхема используется для построения точного Brown-Out детектора с низким потреблением.
Подсказка: фильтрация напряжения питания
      Используйте конденсаторы с маленьким активным сопротивлением для фильтрации Vcc и многослойные платы с широкими проводниками для улучшения переходных характеристик питания.
Вариант 1: С низким потреблением
Характеристики
Очень низкое потребление (0,5 мкА при3 В, 1 мкА при 5 В) Невысокая стоимость Большой гистерезис, около 0,3 В Большая скорость переключения Точность ± 5-10% Большое количество элементов Большое время реакции на изменение Vcc
Введение       Цепь на рисунке 1 имеет малое потребление, что делает ее подходящей для устройств с батарейным питанием. Использование стандартных элементы делает ее недорогой. Переключение напряжения на выводе RESET происходит с крутыми фронтами. Объединяет большой гистерезис с высокой точностью. Но большое время реакции делает ее не подходящей при быстро меняющемся напряжении питания.

Рисунок 1. Экономичный Brown-Out детектор


Рисунок 2. Осциллограммы, показывающие зависимость сигнала RESET от Vcc

Принцип работы       Детектор состоит из двух каскадов, детектора и усилителя. В детекторе пороговое напряжение устанавливается резисторами R1 и R2 относительно напряжения отпирания транзистора T1. При нормальном напряжении транзистор открыт. Когда напряжение падает ниже порогового уровня, он закрывается.       Выход этого детектора подключен к входу усилителя с очень низким потреблением. При нормальной работе, низкое напряжение на базе транзистора Т2 удерживает его в закрытом состоянии, позволяя резистору R5 формировать высокое напряжение на входе RESET микроконтроллера. Усилитель также содержит цепь обратной связи - транзистор Т3 и резистор R3, формирующей гистерезис, когда на выходе RESET удерживается низкий уровень.


Выбор элементов Т1, Т2 и Т3       Разброс коэффициента передачи по току (hfe) транзистора Т1 влияет на пороговое напряжение Vt (обычно ± 0.2 В). Можно использовать любой маломощный транзистор, но лучше применять транзисторы с небольшим разбросом.       Необходимо проявлять осторожность при замене транзистора одного типа транзистором другого типа. Напряжение база-эмиттер транзистора Т1 влияет на константу (0,4) в формуле для расчета порогового напряжения (ниже). Поэтому замена транзистора может вызвать изменение порогового напряжения детектора, что потребует пересчета делителя R1+R2.
R1 и R2       R1 и R2 составляют делитель напряжения, определяющий пороговое напряжение Vt. Так как пороговое напряжение зависит от этих сопротивлений, рекомендуется использовать резисторы с точностью 1% и выше. См. Также "Чувствительность к шуму" ниже. R1 обычно выбирается равным 10 Мом для уменьшения энергопотребления. R2 находиться по формуле приведенной ниже. Постоянная (0,4) может слегка изменяться при изменении транзистора Т1:

R3       Некритичный нагрузочный резистор, который очень слабо влияет на пороговое напряжение. Его следует выбирать как можно больше, для уменьшения потребления. Сопротивление больше 10 Мом не рекомендуется, см. "Чувствительность к шуму".
R4       Резистор R4 определяет гистерезис порогового напряжения (Vt). При R4 равном 3,3 Мом, значение гистерезиса составит примерно 0,3 В. Меньший R4 даст больший гистерезис и наоборот. Большее значение R4 так же приведет к уменьшению крутизны фронтов выходного сигнала. Большое отличие от рекомендованного значения, в конечном итоге изменит константу (0,4) в формуле вычисления порогового напряжения. Поскольку величина гистерезиса не сильно зависит от R4, его точность не важна. R5       В нормальном режиме R5 формирует высокий уровень. Рекомендуется значение меньше 50 кОм, для надежной привязки RESET к напряжению питания.


Так как в нормальном режиме ток через него практически не проходит, его номинал и точность не важны. Когда RESET имеет низкий уровень, через него начинает протекать достаточно большой ток.
C1 и C2       С1 и С2 уменьшают высокочастотный шум и помехи в схеме. Оба конденсатора могут отсутствовать, но рекомендуется значение не меньше 1нФ. Для максимальной защиты от шума и помех, следует выбирать 100 нФ (низкочастотный) или конденсатор с маленьким ESP(эквивалентное последовательное сопротивление) т.е. высокочастотный. См. также "Время срабатывания" ниже. Точность не важна, но для гарантии надежного подавления высокочастотных шумов, следует использовать конденсаторы с диэлектриком Z5U или лучше.
C3       С3 осуществляет развязку по питанию. Его можно не устанавливать, если рядом на плате уже имеется развязывающий конденсатор, иначе рекомендуется 1 нФ. Для максимальной защиты от шума, следует выбирать 100 нФ (низкочастотный) или конденсатор с маленьким ESP (эквивалентное последовательное сопротивление) т.е. высокочастотный.
Кнопка сброса/Внутрисистемное программирование       Если требуется кнопка сброса или возможность внутрисистемного программирования, они просто подключаются параллельно, как показано на рисунке 1. Так как кнопка/программатор устанавливают низкий уровень на выводе RESET, то ток протекающий через R5 будет относительно высоким в этот момент. См. также ниже "Энергопотребление". Время срабатывания       Выбор больших значений С1 и С2 увеличивает время срабатывания схемы. Это не проблема в системах с батарейным питанием, где напряжение со временем уменьшается медленно (при разрядке батарей). Когда питание может пропадать очень быстро, следует учитывать время срабатывания.
Чувствительность к шуму       Выбор R1 и R2 больше, чем 10 Мом не рекомендуется, так как это может привести к увеличению чувствительности схемы к тепловому шуму резисторов. Когда шум не важен, R1 и R2 могут быть увеличены до 20 Мом.


Выбор еще большего значения приведет к уменьшению протекающих через них токов, что в итоге приведет к неработающему детектору. Если нужна меньшая чувствительность к шуму, эти резисторы могут быть выбраны меньшего номинала, за счет увеличения потребляемой мощности.       Конденсаторы С1,С2 и С3 развязывающие и уменьшают как высокочастотный шум, так и наводки 50/60 Гц. Они могут не устанавливаться, но чувствительность к шуму сильно зависит от их номиналов.
Точность порогового напряжения       Так как пороговое напряжение определяется в основном R1 и R2 , погрешности этих резисторов непосредственно влияют не точность порогового напряжения. Рекомендуется использовать с точностью ± 1%.
Энергопотребление       Потребляемый ток при нормальной работе (напряжение Vcc высоко) находится как:
      Когда кнопка сброса или программатор формируют низкий уровень на выводе RESET , то ток увеличивается до:
      Когда напряжение падает ниже порога детектора, транзистор Т1 закрывается, Т2 открывается и ток потребления составляет:
      Так как R5 обычно выбирается много меньше, чем R1-R4, последние два выражения можно упростить:
Таблица 1. Примеры номиналов
Компонент
Примеры номиналов
3,0 В
4,5 В
Рекомендуемая точность
T1, T2
BC548 / BC848 / 2N3904
Ice
2,5 мA, Vce
8 В, b/hfe
100
T3
BC558 / BC858 / 2N3906
Ice
2,5 мA, Vce
8 В, b/hfe
100
R1
10 МОм
1%
R2
1,54 МОм
976 кОм
1%
R3
10 Мом
20%
R4
3,3 Мом
20%
R5
47 кОм
20%
C1, C2 и С3
100 нФ
20%, диэлектрик Z5U или лучше

Альтернатива 2: Низкая стоимость Характеристики Малое число элементов Очень низкая стоимость Маленькая занимаемая площадь Маленькое время срабатывания Маленький гистерезис Напряжение на выходе уменьшается медленнее Vcc Низкая точность (± 4-8%) Высокое энергопотребление Чувствительна к разбросу номиналов элементов Введение       На рисунке 3а показана недорогая схема, занимающая маленький объем.


Однако большая потребляемая мощность может сделать ее не подходящей для систем с батарейным питанием. Поскольку напряжение на выводе RESET падает довольно медленно при пропадании напряжения Vcc, то цепь чувствительна к разбросу значений элементов. Из-за разброса значений резисторов R1 и R2, параметров транзистора Т1 и порогового напряжения сброса AVR MCU, порог Vt следует выбирать минимум на 15% меньше Vcc.
Рисунок 3a. Недорогой Brown-Out детектор



Рисунок 3b. Недорогой Brown-Out детектор с ручным сбросом



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



Принцип действия      При нормальной работе, транзистор Т1 открыт, подавая на вывод RESET напряжение Vcc. Когда напряжение Vcc снижается ниже порогового (Vt), транзистор Т1 закрывается. Это позволяет резистору R3 подать на RESET низкий (активный) уровень. Закрывание транзистора Т1 происходит, когда напряжение база-эмиттер становиться меньше определенного значения. Для маломощных кремниевых транзисторов обычно 0,7 вольт. R1 и R2 образуют делитель напряжения, формирующий напряжение база-эмиттер. Пороговое напряжение рассчитывается по формуле:

Выбор элементов T1      Можно использовать почти любой маломощный PNP транзистор. Рекомендуется использовать транзистор с большим коэффициентом передачи по току (hfe), так как это обеспечит более быстрое переключение выходного напряжения при изменении Vcc в районе порогового напряжения. Более быстрое срабатывание делает схему менее чувствительной к выбору компонентов, уменьшает необходимость настройки детектора. См. также ниже "Точность установки порога". Настройка также требуется при изменении напряжения открывания транзистора. Это напряжение равно около 0,7 вольт. Оно не меняется у однотипных транзисторов, но следует соблюдать осторожность при выборе транзистора. Изменение этого параметра может серьезно повлиять на пороговое напряжение включения.
R1 и R2       Как видно из формулы, пороговое напряжение Vt зависит от R1 и R2.


Сопротивление R1 должно быть около 200 кОм или меньше. Это гарантирует, что ток базы транзистора Т1 не будет влиять на напряжение делителя R1-R2 (Для коэффициента усиления hfe минимум 100.)
R3       Вывод RESET AVR микроконтроллера имеет внутренний подтягивающий (подключен к Vcc) резистор сопротивлением 100-500 кОм. Когда транзистор Т1 выключается, внутренний подтягивающий резистор и R3 образуют делитель напряжения. Получающееся в итоге напряжение RESET должно быть достаточно низким, что бы гарантировать активный уровень сброса на выводе RESET MCU. Рекомендуемое значение R3 - 50 кОм или ниже, что гарантирует, что напряжение на RESET всегда будет меньше чем 1/3 Vcc.
Ручной сброс/Внутрисистемное программирование       Если требуется кнопка сброса или возможность внутрисистемного программирования, последовательно должен быть подключен резистор R4, как показано на рисунке 3b. Резистор позволяет кнопке сброса/программатору блокировать транзистор Т1 и устанавливать низкий уровень на выводе RESET. Чтобы гарантировать правильную работу детектора пониженного напряжения, общее сопротивление последовательно включенных R3+R4 не должно превышать рекомендуемые 50 кОм.
Точность установки порога       Пороговое напряжение в основном зависит от R1 и R2, и погрешность этих резисторов напрямую влияет на точность установки порогового напряжения. Рекомендуется использовать резисторы с погрешностью ± 1%. Из-за медленного переключения транзистора, изменения порога RESET AVR микроконтроллера приведет к погрешности установки порогового напряжения. Эта погрешность имеет типичное значения ± 0.15 вольт, что соответствует ± 3% при напряжении питания 5 вольт(± 5% при3,3 В). Эта погрешность уменьшается при использовании транзистора Т1 с большим коэффициентом усиления (hfe), что увеличивает скорость переключения.
Энергопотребление       Потребляемый детектором ток в нормальном режиме работы (при достаточно высоком Vcc) находится по формуле:


      Когда кнопка или программатор закорачивает RESET на землю, потребляемый ток увеличивается до:
      Когда напряжение питание падает ниже уровня запирания транзистора Т1, ток уменьшается до:
Таблица 2. Примеры номиналов
Компонент
Примеры номиналов
3,0 В
4,5 В
Рекомендуемая точность
T1
BC558 / BC858 / 2N3906
Ice
2,5 мA, Vce
8 В, b/hfe
100
R1
180 кОм
1%
R2
56 кОм
33 кОм
1%
R3
47 кОм
20%
R4
4,7 кОм
20%

Альтернатива 3: интегральная схема Характеристики Легкость монтажа Высокая точность порогового напряжения Низкое энергопотребление Занимает маленькую площадь Небольшое число компонентов Различные дополнительные функции Введение       Существует большой выбор интегральных схем разных производителей. Они варьируются от очень простых трех-ножечных детекторов на фиксированные напряжения, до более совершенных, имеющих сторожевой таймер и функцию формирования временной задержки при включении питания. Так как все AVR имеют встроенный сторожевой таймер и функцию сброса при включении питания, то эти функции не требуются от внешних микросхем. Точность порогового напряжения составляет менее ±1% для большинства микросхем. Потребляемый ток в диапазоне мкА. Необходимо использовать микросхему с активным низким уровнем на выходе. Существует большое кол-во различных корпусов, от миниатюрных трехвыводных до больших с большим количеством выводов. Выходной каскад       Выход сброса микросхемы может быть двухтактным или с открытым стоком (открытым коллектором), в зависимости от CMOS или TTL выходных уровней. Решение с открытым стоком позволяет просто подключить кнопку ручного сброса и/или внутрисистемного программатора. Эта функция может быть осуществлена и при двухтактном выходе, с помощью дополнительного последовательного резистора. ISP и/или ручной сброс подключается между сопротивлением и входом RESET AVR (смотри рисунок 5а и рисунок 5б).


Рисунок 5a. Детектор с двухтактным выходом



Рисунок 5b. Детектор с открытым коллектором



Рисунок 5c. Альтернативный вариант установки кнопки ручного сброса


Удлинение импульса сброса.       В некоторых цепях дополнительно происходит увеличение длительности импульса сброса. Сброс удерживается в активном состоянии в течение определенного времени после окончания события вызвавшего сброс (power-on сброс, brown-out сброс и т.д.)(см. рисунок 6.) Некоторые из этих устройств также имею функцию ручного сброса. Они контролирую уровень напряжения на выходе, определяя, нажата или нет кнопка сброса. Когда кнопка отпускается, микросхема удерживает линию сброса в активном состоянии еще некоторое время. ВНИМАНИЕ! Эта функция будет конфликтовать с работой внутрисистемного программатора, который активно переключает линию RESET.
Рисунок 6. Удлинение импульса сброса



Стабилизатор напряжения       Некоторые стабилизаторы напряжения содержат встроенный детектор низкого напряжения, объединяя две функции в одном устройстве. Это уменьшает стоимость и часто предоставляет дополнительные функции без дополнительных затрат.
Резервное питание       Некоторые системы содержат батареи резервного питания, используемые при пропадании основного. Стабилизатор напряжения в таких системах часто формирует сигнал статуса, указывающий микроконтроллеру, какой источник напряжения используется в данный момент. Подключив этот сигнал к RESET, мы выключим AVR, когда используется резервное питание, сохраняя содержимое ОЗУ, но останавливая работу программы. Или же, при подаче этого сигнала на отдельный вход, AVR может зафиксировать это событие и выполнить подпрограмму уменьшающую энергопотребление, отключая энергоемкие периферийные устройства (двигатели, дисплеи и т.д.) прежде чем войти в режим power-down. (Потребление в режиме сброса такое же, как и в нормальном режиме, а в режиме power-down составляет мкА.) Когда основное напряжение питания восстанавливается до необходимого уровня, AVR должен зафиксировать это, проснуться и возобновить выполнение программы с прерванного места.


Гистерезис       Гистерезис в детекторе низкого напряжения может быть выполнен интегрально, или сформирован с помощью внешних цепей (Рисунок 7). Он защищает детектор от генерации при использовании в устройствах с батарейным питанием.
Рисунок 7. Формирование гистерезиса порогового напряжения


Фиксированное/Изменяемое пороговое напряжение       Некоторые цепи требуют настройки порогового напряжения Vт с помощью внешних элементов, в то время как другие имеют фиксированное пороговое напряжение. Использование микросхемы с фиксированным напряжением показано на рисунке 8. Типичное подключение внешних элементов для настройки порогового напряжения показано на рисунке 9. Это устройство имеет внутренний источник порогового напряжения и компаратор. Если напряжение на входе ниже опорного, то уровень на выходе становиться активным. Пороговое напряжение легко определяется делителем напряжения R1 и R2.
Рисунок 8. Интегральная микросхема сброса с фиксированным пороговым напряжением



Рисунок 9. Интегральная микросхема сброса с изменяемым пороговым напряжением


Таблица 3. Примеры микросхем
Устройство
Характеристики
Поддержка ISP
Ценовой уровень
MAX809(1)
Фиксированное пороговое напряжение, фиксированная длительность импульса сброса
Да
А
MAX811(1)
Фиксированное пороговое напряжение, фиксированная длительность импульса сброса, микропотребление, ручной сброс
Да
А
MAX821(1)
Фиксированное пороговое напряжение, изменяемая длительность импульса сброса, микропотребление
Да
В
DS1811(2)
Фиксированное пороговое напряжение, фиксированная длительность импульса сброса
Да
В
DS1813/18(2)
Фиксированное пороговое напряжение, фиксированная длительность импульса сброса, контроль питания
Нет
В
V6301(3)
Фиксированное пороговое напряжение, фиксированная длительность импульса сброса, микропотребление, низкая цена
Да
С
V6340(3)
Фиксированное пороговое напряжение, импульс сброса не удлинняется, низкая цена
Да
С
Замечания: Выпускается Maxim Integrated Product, Inc. Выпускается Dallas Semiconductors Выпускается EM Microelectronic-Marin SA А=Дорогой В=Средний С=недорогой

AVR313: Подключение PC AT клавиатуры к AVR


AVR313: Подключение PC AT клавиатуры к AVR Оригинал: Application Note AVR313 фирмы ATMELОсобенности Подключается стандартная PC AT клавиатура Требуется только два I/O вывода. Один из них должен быть входом внешнего прерывания Не требуется внешних элементов Полный пример программы на С, осуществляющей преобразование данных, полученных от клавиатуры, и выдачу их через UART Введение

      Большинство микроконтроллеров, должно иметь какой ни будь интерфейс с человеком. Это приложение описывает в качестве одного из вариантов, использование стандартной PC AT клавиатуры.


Физический интерфейс

      Физический интерфейс между клавиатурой и микроконтроллером показан на рисунке 1. Используются две сигнальных линии - синхронизации и данных. Сигнальные линии с открытым коллктором и имеют подтягивающие резисторы, расположенные в клавиатуре. Это позволяет как микроконтроллеру, так и клавиатуре формировать на линиях низкий уровень. Существует два типа разъемов, 5-ти штырьковый DIN разъем типа 5D, и миниатюрный 6-ти штырьковый мини-DIN. Расположение выводов показано в таблице 1.


Рисунок 1. Интерфейс.

Таблица 1. Расположение контактов разьемов PC клавиатуры

Разьем

Синхронизация

DIN41524

6-pin Mini DIN PS2

Синхронизаци

1

5

Данные

2

1

Не используются

3

2, 6

Земля GND

4

3

Питание +5 В

5

4

Экран

Оплетка

Оплетка


Временный диаграммы

      Временные диаграммы передачи данных от клавиатуры к микроконтроллеру показаны на рисунке 2. Протокол обмена следующий: один старт бит (всегда 0), восемь бит данных, один бит четности и один стоп бит (всегда 1). Данные действительны в течении низкого уровня сигнала синхронизации. Синхросигнал формируется клавиатурой с длительностью низкого и высокого уровней по 30-50 мкс. Микроконтроллер также может посылать команды в клавиатуру, устанавливая низкий уровень на линии синхронизации, затем формируя импульс низкого уровня на линии данных (старт бит).
Алгоритм довольно прост: сохранение значения линии данных по спаду синхроимпульса. Это проще всего выполняется, если линия синхронизации подключена к INT0 или INT1. Прерывание будет выполняться по каждому фронту и спаду синхроимпульса, данные будут сохраняться по каждому спаду. После получения всех бит, данные можно декодировать. Это осуществляется вызовом функции decode. Для символьных клавиш эта функция сохраняет ASCII код клавиш в буфере. Это позволяет учитывать, удерживалась ли нажатой клавиша shift при нажатии данной клавиши. Другие функциональные клавиши вроде курсорных, ctrl и Alt и т.д. игнорируются. Карта соответствия скан-кодов ASCII кодам обрабатывается с помощью таблиц, одной для клавиш нажатых вместе с shift, а другой без.
Изменения и дополнения       Если микроконтроллер потеряет синхронизацию с клавиатурой, все остальные принятые биты будут неверны. Один из способов решения этой проблемы это использование таймаута. Если 11 бит не получены в течении 1,5 мс, значит произошла ошибка. Счетчик битов должен быть сброшен, а поврежденные данные удалены. Для установки таких параметров как скорость и период повтора нажатой клавиши, необходимо посылать данные в клавиатуру. Это можно сделать, как описано выше. Команды можно найти в спецификации производителя клавиатуры.

Рисунок 2. Временные диаграммы передачи данных клавиатурой в микроконтроллер.


AVR400: Недорогой аналого-цифровой преобразователь


Здесь находятся подпрограммы описанные в документе, а также программа примера, на ассемблере. (можно просматривать блокнотом)

  AVR400: Недорогой аналого-цифровой преобразователь Оригинал: Application Note AVR400 фирмы ATMEL перевел: Sinbad             г.Самара.             20.10.2000 г

Особенности Выполняется по прерыванию Размер кода: 23 слова Маленькое число внешних компонентов Разрешение: 6 бит Диапазон измерения: 0 – 2 В Работает на всех AVR устройствах с 8-битным таймером/счетчиком и аналоговым компараторомВведение
      Целью этого приложения являются устройства, нуждающиеся в недорогом и малогабаритном АЦП. Ниже описывается изготовление простого АЦП всего лишь с двумя внешними компонентами, резистором и конденсатором.

Теория преобразования
      Особенность почти всех AVR микроконтроллеров это аналоговый компаратор, который позволяет просто реализовать АЦП. Измеряемый сигнал подается на инвертирующий вход, а образцовый сигнал на не инвертирующий. Образцовый сигнал формируется при зарядке конденсатора через резистор. При зарядке конденсатора, напряжение на нем изменяется по экспоненциальному закону. Если измеряемый диапазон напряжений ограничить 2/5 Vcc, экспонента хорошо аппроксимируется прямой. Напряжение измеряемого сигнала UIN находим, измеряя время необходимое для того, чтобы напряжение на конденсатор превысило измеряемое. Используя один вывод порта В для контроля зарядки и разрядки конденсатора, всего используется только три вывода. Принципиальная схема представлена на рисунке 1.

Рисунок 1. Принципиальная схема       Постоянная времени R/C цепи должна быть выбрана так, чтобы удовлетворять следующему равенству:

512/f = - R C ln(1 - 2/5) , то есть R C = 1002/f

      Номиналы элементов для некоторых типичных частот генератора приведены в таблице 1. Если постоянная времени отличается от этого, это приведет к ошибке в результате.
Поэтому в RC цепи необходимо использовать компоненты с высокой точностью. График напряжения на конденсаторе вместе с прямой линией приведен на рисунке 2. Так как напряжение питания используется как опорное, то оно должно быть стабильным в течение преобразования.

Рисунок 2. Линейность АЦП

Таблица 1. Значения элементов R/C цепочки
XTAL ( мГц)
1
2
4
6
8
10
12
14
16
R (кОм)
100
33
30
30
27
100
56
47
160
C (нФ)
10
15
8.2
5.6
4.7
1
1.5
1.5
0.39
     Чтобы гарантировать правильную работу, конденсатор должен быть разряжен как минимум 200 мкс между преобразованиями. Если конденсатор не разрядить правильно, то нельзя будет измерять маленькие напряжения. Если входное напряжение больше чем 2/5 Vcc, преобразователь будет выдавать максимальное значение. Это происходит благодаря загрузке смещения в регистр таймера/счетчика 0 перед началом преобразования. Таймер будет формировать прерывание по переполнению после 512 циклов (64*8). Это время требуется, чтобы напряжение на конденсаторе достигло 2/5 Vcc. Если напряжение находится в пределах рабочего диапазона, будет формироваться прерывание Аналогового компаратора. Смещение же вычитается и измеренного значения.

Реализация
      АЦП использует прерывания таймера/счетчика 0 и аналогового компаратора. Это освобождает ресурсы MCU в течение преобразования. Подпрограмма “convert_init” – инициализация АЦП
      Эта подпрограмма вызывается для инициализации АЦП. Она должна быть выполнена перед использованием АЦП. Вызов этой подпрограммы разрешает прерывания компаратора и таймера и устанавливает управляющий вывод как выход. Затем должна быть выполнена инструкция 'SEI', которая разрешает глобальные прерывания, для включения АЦП. Выполнением инструкции 'CLI' , АЦП выключается. Таблица 2. Параметры подпрограммы “convert_init”
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
6 слов
Выполняемые циклы
10 циклов, в том числе инструкция RET
Используемые регистры
Младшие регистры :нет Старшие регистры :1 Указатели : нет
<


b> Таблица 3. Регистры используемые “convert_init”
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R16
  "result" – рабочий регистр
 
Рисунок 3. Блок схема “convert_init”

“AD_convert” – старт А/Ц преобразования
      Эта подпрограмма используется для запуска А/Ц преобразования. Она загружает в счетчик значение 256 – 64 и запускает счет с частотой XTAL/8. Флаг завершения преобразования ( Т – флаг в регистре статуса) очищается и начинается зарядка конденсатора. Таблица 4. Параметры подпрограммы “AD_convert”
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
7 слов
Выполняемые циклы
10 циклов, в том числе инструкция RET
Используемые регистры
Младшие регистры :нет Старшие регистры :1 Указатели : нет Флаги статуса :1
Таблица 5. Регистры используемые “AD_convert”
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R16
  "result" – рабочий регистр
 
SREG
    T – флаг. Этот флаг показывает, что идет преобразование
Рисунок 4. Блок схема А/Ц преобразования

“ANA_COMP” подпрограмма обработки прерывания
      Эта подпрограмма выполняется когда преобразование закончено. Она загружает значение Таймера/счетчика 0, останавливает таймер и устанавливает флаг завершения преобразования (Т – флаг в SREG). Затем смещение вычитается из значения таймера. Необходимо вычесть на единицу больше чем смещение, так как обработка прерывания требует минимум 7 циклов. Таблица 6. Параметры подпрограммы “ANA_COMP”
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
7 слов
Выполняемые циклы
11 циклов, в том числе инструкция RET
Используемые регистры
Младшие регистры :нет Старшие регистры :2 Указатели : нет Флаги статуса :1
Используемые прерывания
Прерывания таймера/счетчика 0 и аналогового компаратора
Таблица 7. Регистры используемые “ANA_COMP”
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R16
  "result" – хранит значение таймера
"result" – содержит результат преобразования
R17
  "temp"– рабочий регистр
 
SREG
    T – флаг. Этот флаг показывает, что идет преобразование



Рисунок 5. Блок схема "ANA_COMP"

Пример программы
      Пример программы включенный в данное приложение, выполняет последовательное преобразование и выдает данные в виде двоичного значения на порт В.

Таблица 8. Общая характеристика программы примера

AVR401: 8-ми битный прецизионный аналого-цифровой преобразователь


Здесь находятся подпрограммы описанные в документе, а также программа примера, на ассемблере. (можно просматривать блокнотом)

  AVR401: 8-ми битный прецизионный аналого-цифровой преобразователь Оригинал: Application Note AVR401 фирмы ATMEL перевел: Sinbad             г.Самара.             20.10.2000 г

Особенности Очень низкая стоимость Высокая точность Авто-калибровка устраняет погрешность, вызываемую элементной базой Измерение напряжения от 0 до Vcc Максимальное время преобразования: 1,1 msВведение
      Это приложение описывает, как сделать так называемый А/Ц преобразователь с двойным интегрированием на основе AVR микроконтроллера. Преобразователь очень дешевый, требуется только шесть дискретных компонентов плюс AVR. Используется пять выводов контроллера (см. рисунок 1). Этот пример базируется на AT90S1200, но может использоваться любой AVR контроллер с компаратором.

Рисунок 1. А/Ц преобразователь

Принцип работы
      Конденсатор заряжается постоянным током, формируемым транзистором. И напряжение на конденсаторе возрастает линейно. Для разрядки конденсатора, вывод AIN0 устанавливается как выход выдающий "ноль". Опорное напряжение равное Vcc/2 формируется цепочкой резисторов Rref1 и Rref2. Когда выводы PB1 и PB2 сконфигурированы как входы, опорное напряжение отключено, и напряжение на выводе AIN1 будет входным напряжением Vin. При установке выводов как выходы и выдаче "0" и "1", уровень напряжения на выводе AIN1 будет VCC/2 (если резисторы одинаковые). Входной резистор Rin должен быть минимум в 100 раз больше чем опорные резисторы Rref1 и Rref2 , чтобы избежать погрешностей измерений.

Алгоритм, используемый для преобразования следующий: Включить опорное напряжение Зарядить конденсатор до тех пор, пока напряжение на нем не достигнет опорного. Измерить время необходимое для этого, Tref. Выключить опорное напряжение и разрядить конденсатор Зарядить конденсатор до тех пор, пока напряжение на нем достигнет входного.
Измерить время необходимое для этого, Tin.       Цикл преобразования показан на рисунке 2. Время измеряется Таймером/Счетчиком 0, который расширен до 9 бит с помощью прерывания Переполнение Таймера /Счетчика 0.

Рисунок 2. Цикл преобразования Расчет
      Предположим, что Vcc 5 вольт. Отношение между входным и опорным напряжениями: Выражение 1       Vin = Vref x Tin / Tref       Идеальный результат преобразования это 8-ми битное число, где 0 вольт соответствует 0, а 5 вольтам соответствует 255. Опорному напряжению соответствует, таким образом, 128. Равенство может быть переписано как: Выражение 2       Vin = Tin x 128 / Tref       Однако из-за погрешностей опорных сопротивлений, опорное напряжение может слегка отличаться. Для компенсации этого, можно выполнить калибровку, подав известное напряжение на вход и сравнить его с опорным. Если используемое калибровочное напряжение равно точно 2,5 вольт, опорное напряжение может быть найдено с помощью выражения: Выражение 3       Vref = Tref x Vcal / T cal = Tref x 128 / Tcal       Цикл калибровки выполняется при удержании низкого уровня на выводе PB7 при включении питания. Затем подается калибровочное напряжение, и вывод PB7 освобождается. Это запускает калибровку и после однократного выполнения, значение опорного напряжения сохраняется в EEPROM. Во время нормального преобразования, опорное напряжение считывается из EEPROM, и входное напряжение вычисляется по выражению 1. Пример конфигурации
      Так как выдаваемый результат 8-ми битный, таймер должен быть минимум 9-ти битным для обеспечения необходимого разрешения. Элементы должны быть подобраны так чтобы номинальное время зарядки конденсатора до Vcc было около 256 тактов. В этом случае погрешности значений элементов и изменение температуры позволяют не делать время зарядки больше, чем максимальный период таймера, или же значительно меньше, давая низкое разрешение.


Для достижения необходимой точности должна использоваться разрядность 8 или выше. Таймер в AT90S1200 только 8-ми битный, так что 9-ый бит должен учитываться программно. Следующий пример показывает, как можно найти номиналы элементов.       Сначала, решите, какую частоту кварцевого генератора использовать. С 4 МГц кварцем длительность такта - 250 нс. При установке предварительного делителя CK/8, таймер увеличивается каждые 2 мкс. Максимальный период таймера при 9 битах равен 512 х 2 мкс = 1,024 мс. Исходя из этого, мы берем 2 х Tref равное 512 мс. Зарядка конденсатора постоянным током описывается выражением: Выражение 4       dV = I/C x dt       Мы можем найти требуемый ток, когда емкость конденсатора, приращение времени и напряжения известны: Выражение 5       I = dV x C / dt       Конденсатор будет заряжен до 5 вольт, и при емкости 0,22 мкФ, транзистор должен выдавать ток 2,15 мА. Значение R зависит от hFE транзистора. У pnp транзистора BC558A hFE находиться между 125 и 250. Это делает данный транзистор идеальным для применения, так как может использоваться любое значение hFE в указанном диапазоне. Чтобы быть уверенным, что может быть использован весь диапазон hFE, в вычислениях используем среднее значение, 188. В результате ток базы равен 11,4 мкА. Транзистор включается выдачей "0" на соответствующем выводе. При данном значении тока, напряжение база-эмиттер транзистора около 0,1 В. Базовый резистор находится как: Равенство 6       R B = ( Vcc + Vbe )/ Ib = 4.9 В/11.4 мкА = 430 кОм       Опорное напряжение вырабатывается делителем R ref1 и R ref2. R in должен быть значительно больше, чем эти два, так чтобы входное напряжение не влияло на опорное. Подходят R in - 100 кОм и 1 кОм - R ref1 и R ref2 каждый. Транзистор должен быть подключен к выводам как можно дальше от входов компаратора. При переключении выводов, шумовые помехи появляются на соседних выводах.


Это может вызвать проблемы при измерении маленьких напряжений, так как помехи могут переключить компаратор до того, как напряжение на конденсаторе достигнет измеряемого. Рисунок 3 показывает характеристику преобразования устройства с тактовой частотой 4 МГц, использующего значения элементов рассчитанные в выше приведенном примере.
Рисунок 3. Линейность преобразования

Исполнение
      Программное обеспечение состоит из нескольких подпрограмм. Подпрограммы "reference" и "convert" управляют зарядкой и синхронизацией. После того, как они полностью выполнены, основная программа должна выполнить необходимые вычисления. Это происходит с помощью двух подпрограмм, осуществляющих деление и умножение, "div17u" и "mul9". Есть также две задержки, используемые другими подпрограммами и основной программой. Они используются для полного разряда конденсатора и формирования паузы между преобразованиями. Подпрограмма "reference" - измерение опорного напряжения
      Подпрограмма разряжает конденсатор, включает транзистор и заряжает конденсатор до тех пор, пока напряжение на нем не сравняется с опорным напряжением. Измеряется время от начала зарядки до момента совпадения напряжений. Затем конденсатор снова разряжается. Это время зарядки используется вместе со временем зарядки из подпрограммы "convert" для вычисления входного напряжения. Подпрограмма не должна вызываться при каждом преобразовании, все зависит от изменения окружающей температуры. Особенно сильно от температуры зависит параметр транзистора hFE, так что если окружающая температура изменятся, подпрограмма должна выполняться часто. В примере программы, подпрограмма"reference" вызывается при выполнении каждого преобразования.
Рисунок 4. Блок схема "reference"

Таблица 1. Параметры подпрограммы "reference"
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
23 слова – только процедура А/Ц преобразования

37 слов – полностью вся программа
Используемые регистры
Младшие регистры : нет Старшие регистры :2 Указатели :нет Флаги статуса :1
Используемые прерывания Прерывание переполнения таймера/счетчика 0
Прерывание аналогового компаратора
Используемая периферия Таймер/Счетчик 0
Аналоговый компаратор (порт B выводы 0 и 1)
Порт В вывод 2
Порт В (только в примере программы)
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
24 слова
Выполняемые циклы
Зависят от опорного напряжения
Используемые регистры
Младшие регистры :нет Старшие регистры :2 Глобальные :1
<


b> Таблица 2. Регистры используемые "reference"
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R17
  "Tref"-содержит время достижения опорного напряжения
R18
  "TH" - старшая часть таймера
 
R20
  "temp"
 
Подпрограмма "input" - измерение входного напряжения
      Подпрограмма включает транзистор и заряжает конденсатор до тех пор, пока напряжение на нем не сравняется с входным напряжением. Затем конденсатор разряжается. Время необходимое для этого измеряется и сохраняется в T in. Здесь должна быть пауза в несколько микросекунд между двумя циклами преобразования, чтобы быть уверенным, что конденсатор полностью разряжен. В примере программы это осуществляется вызовом подпрограммы задержки.
Рисунок 5. Блок схема подпрограммы "input"

Таблица 3. Параметры подпрограммы "input"
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
19 слов
Выполняемые циклы
Зависят от входного напряжения
Используемые регистры
Младшие регистры :2 Старшие регистры :нет Глобальные
Таблица 4. Регистры используемые "input"
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R14
  "TinH" - старший байт времени зарядки до входного напряжения
R15
    "TinL" - младший байт времени зарядки до входного напряжения
R20
  "temp"
 
"T0_int" подпрограмма обслуживания прерывания.
      Единственная функция этой подпрограммы увеличение переменной TH, чтобы получился 16-ти битный счетчик. Используется только 9 бит. Таблица 5. . Характеристики подпрограммы прерывания "T0_int"
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
2 слова
Выполняемые циклы
9 - вместе с инструкцией RETI
Используемые регистры
Младшие регистры :нет Старшие регистры :нет Глобальные :1
"mpy9u" 9х8 битное умножение
      Эта подпрограмма выполняет умножение 9х8 бит. 9-ти битный множитель должен быть сохранен во флаге переноса (MSB) и в регистре "mp9u". 8-ми битный множитель сохраняется в регистре "mc9u".


Результат располагается в "C:m9uH:m9uL". Регистры, используемые для результата те же самые, что используются как входные в подпрограмме деления. Подпрограмма основана на подпрограмме умножения "mpy8u", описанной в приложении AVR 200 (прим. "application note AVR 200" на сайте ATMEL). Таблица 6. Параметры подпрограммы "mpy9u"
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
11 слов
Выполняемые циклы
83
Используемые регистры
Младшие регистры :3 Старшие регистры :нет Глобальные :1 Флаги :С
Таблица 7. Регистры используемые "mpy9u"
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R0
"mc9u" - множитель
   
R1
"mp9u" - множитель
  m9uL - младший байт результата
R2
    m9uH - старший байт результата
C - Флаг
9-тый бит множителя
  17-тый бит результата
R20
  "temp"-используется как счетчик циклов
 
"div17u" 17/16 битное деление
      Эта подпрограмма выполняет умножение 9х8 бит. 9-ти битный множитель должен быть сохранен во флаге переноса (MSB) и в регистре "mp9u". 8-ми битный множитель сохраняется в регистре "mc9u". Результат располагается в "C:m9uH:m9uL". Регистры, используемые для результата те же самые, что используются как входные в подпрограмме деления. Подпрограмма основана на подпрограмме умножения "mpy8u", описанной в приложении AVR 200 (прим. "application note AVR 200" на сайте ATMEL). Таблица 8. Параметры подпрограммы "div17u"
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
18 слов
Выполняемые циклы
209 минимум, 292 максимум
Используемые регистры
Младшие регистры :6 Старшие регистры :нет Глобальные :1 Флаги :С
Таблица 9.Регистры используемые "div17u"
РЕГИСТР
НА ВХОДЕ
ВНУТРИ
НА ВЫХОДЕ
R1
"didL" - младший байт делимого
  "dresL" - младший байт результата
R2
"didH" - старший байт делимого
  "dresH" - старший байт результата
R3
"divL" - младший байт делителя
   
C - Флаг
17-тый бит делимого
   
R4
"divH" - старший байт делителя
   
R5
    "remL" - младший байт остатка
R6
    "remH" - старший байт остатка
<


b> Пример программы
      Запущенная программа примера выполняет повторяющиеся преобразования. Сначала измеряется время зарядки для опорного напряжения, затем для входного. Результат преобразования выводится в Порт D и 7 вывод Порта В (MSB). Результат инвертируется перед выдачей, так что для демонстрации результата могут быть подключены светодиодные индикаторы с общим катодом. Цикл преобразования повторяется бесконечно. Если при включении питания вывод PB7 подключен к массе, выполняется калибровка. Пользователь должен подать 2,5 вольта на вход перед освобождением вывода PB7. Откалиброванное V ref сохраняется в EEPROM, откуда считывается при каждом нормальном включении питания. Таблица 10..Общие параметры
ПАРАМЕТР
ЗНАЧЕНИЕ
Размер кода
43 слова - только подпрограммы преобразования (без mpy9u и div17u)
147 слов - все приложение
Выполняемые циклы
209 минимум, 292 максимум
Используемые регистры
Младшие регистры : 9 Старшие регистры :5 Указатели :нет
Используемые прерывания Прерывание переполнения таймера/счетчика 0
Прерывание аналогового компаратора
Используемая периферия Таймер/Счетчик 0
Аналоговый компаратор
Порт B, выводы от 0 до 3 и вывод 7
Порт D, все выводы (только в программе примера)
Порт B, вывод 4 (только в программе примера)

      Подпрограмма калибровки может быть пропущена, если измерены только относительные значения. Опорное напряжение тогда берется равным "128", что также упрощает вычисления. Опорная цепь может быть заменена опорным напряжением для получения более высокой точности. Тогда возможно измерение изменений Vcc, подключая через делитель напряжения питания ко входу.

AVR910: Внутрисистемное программирование


Здесь находится прошивка AT90S1200 для фирменного внутрисистемного программатора, а также программа управления под WIN 9x

  AVR910: Внутрисистемное программирование Оригинал: Application Note AVR910 фирмы ATMEL перевел: Sinbad             г.Самара.             20.10.2000 г

Особенности Программирование любого AVR MCU установленного в готовом устройстве Перепрограммирование Flash памяти данных и EEPROM памяти Исключается панелька из устройства Простой 3-х проводной SPI интерфейс программирования Введение
      Программирование в системе позволяет программировать любой AVR MCU, расположенный в готовом устройстве. Используя простой 3-х проводной SPI интерфейс, внутрисистемный программатор связывается последовательно с AVR MCU, перепрограммируя всю энергонезависимую память в чипе.
      Внутрисистемное программирование избавляет от демонтажа микросхем из устройства. Это сэкономит время и деньги, как при разработке в лаборатории, так и при обновлении прошивки или параметров в памяти.
      Это примечание показывает, как разработать устройство, поддерживающее внутрисистемное программирование. А также, как может быть сделать недорогой внутрисистемный программатор, позволяющий программировать AVR MCU с помощью компьютера, оборудованного 9-ти штырьковым СОМ-портом.

Интерфейс программирования
      Для внутрисистемного программирования, программатор подключается к программируемому устройству как можно меньшим числом проводов. Для программирования любого AVR MCU в любом устройстве, используется простой 6-ти проводной интерфейс для подключения программатора к плате программируемого устройства. Рисунок 1, внизу, показывает необходимые соединения.


Рисунок 1. 6-ти проводное соединение программатора и программируемого устройства.
      Последовательный периферийный интерфейс (SPI) представляет собой 3 провода: последовательный тактовый сигнал (SCK), главный вход - подчиненный выход (MISO) и главный выход - подчиненный вход (MOSI).
При программировании AVR, внутрисистемный программатор всегда функционирует как главный, а программируемое устройство как подчиненный.
      Внутрисистемный программатор (главный) формирует на линии SCK тактовый сигнал для связи. Во время каждого импульса на линии SCK, передается один бит от программатора (главный) к программируемому устройству (подчиненный) по линии MOSI. Одновременно, по каждому импульсу на линии SCK передается один бит от программируемого устройства (подчиненный) к программатору (главный) по линии MISO.
      Для обеспечения нормальной связи по трем SPI линиям, необходимо соединить земли на программаторе и программируемом устройстве (GND).
      Для входа и нахождения в режиме последовательного программирования, сброс программируемого AVR MCU должен удерживаться в активном состоянии (низкий уровень). Также, при стирании чипа, на сбросе должен быть сформирован импульс в конце цикла стирания. Чтобы упростить процедуру программирования, желательно предоставить программатору контроль над линией сброса программируемого MCU, для автоматизации этой процедуры используется четвертая управляющая линия (RES).
      Для программирования устройства работающего при любом разрешенном напряжении питания (2.7 - 6.0 V), программатор может питаться от программируемого устройства (Vcc). Это освобождает от необходимости, иметь отдельный источник питания для программатора. Аналогично, программируемое устройство может запитываться от программатора во время программирования, избавляя от необходимости питания устройства через разъем его постоянного источника питания, в течение цикла программирования.

     Таблица 1. Контакты необходимые для программирования в системе.
КОНТАКТ НАЗВАНИЕ КОММЕНТАРИЙ
SCK Тактовый сигнал Тактовый сигнал программирования, вырабатываемый внутрисистемным программатором (главным)
MOSI Главный выход-подчиненный вход Линия передачи данных от программатора (главный), к программируемому MCU (подчиненный)
MISO Главный вход-подчиненный выход Линия передачи данных от программируемого MCU(подчиненный) к программатору (главный)
GND Общая земля Оба устройства должны иметь общую землю
RES
Сброс программируемого MCU Для входа в режим последовательного программирования, сброс программируемого AVR MCU должен удерживаться в активном состоянии. Чтобы упростить процедуру программирования, внутрисистемный программатор должен контролировать сброс программируемого AVR MCU.
Vcc Питание программируемого MCU Для программирования при любом разрешенном напряжении питания (2.7 - 6.0 V), внутрисистемный программатор может питаться от программируемого устройства. Аналогично, программируемое устройство может питаться через разъем внутрисистемного программирования во время цикла программирования.





Рисунок 2. Рекомендуемая схема разъема, для интерфейса внутрисистемного программирования

      Рисунок 2 показывает стандартный разъем, используемый всеми внутрисистемными программаторами фирмы ATMEL для подключения к программируемому устройству. Стандартный кабель снабжен 2 Х 3 ножечным разъемом, с расстоянием между ножками 100 mils. АППАРАТНЫЕ ОСОБЕННОСТИ ПРОЕКТИРОВАНИЯ
      Для возможности программирования в системе AVR MCU, нужные выводы подчиненного MCU должны быть освобождены подчиненным устройством по требованию. Этот раздел описывает детально каждый вывод использоваемый при программировании.

GND
     Системному программатору и программируемому устройству необходимо работать с одинаковым опорным напряжением. Это достигается соединением земли программируемого устройства с землей программатора. Ни какие специальные требования к этому выводу не предъявляются.

RESET
     Подчиненный AVR MCU войдет в последовательный режим программирования, только когда его линия сброса в активном состоянии (низкий уровень). При стирании чипа, линия сброса должна быть переключена в конце цикла стирания. Для упрощения этой операции, рекомендуется, чтобы сброс программируемого устройства контролировался внутрисистемным программатором. Немедленно, после активизации RESET , внутрисистемный программатор начнет обмениваться по трем предназначенным для SPI проводам - SCK, MISO и MOSI. Чтобы избежать конфликта выходов, активный RESET должен немедленно отключить любой чип, управляющий этими линиями в программируемом устройстве. Обратите внимание, что AVR MCU автоматически устанавливает все эти I/O выводы как входы, с отключенными подтягивающими резисторами, когда RESET активен. Чтобы избежать проблем, внутрисистемный программатор должен быть способен удерживать полный сброс программируемого устройства в течение цикла программирования. Программируемое устройство, никогда не должно пытаться управлять тремя SPI линиями, пока сброс активен.


Если использование системного программатора для контролирования сброса программируемого устройства невозможно, сброс может управляться вручную. Программатор должен просить оператора формировать сброс, когда это необходимо. Процедура будет проходить безопаснее и быстрее, если внутри системному программатору позволят считывать значение с линии сброса, чтобы проверить, что пользователь выполняет требуемые задачи. С изменением в программном обеспечении, программаторы произведенные ATMEL, могут поддерживать этот недостаток управления. Однако этот способ не рекомендуется.

SCK
     При программировании в последовательном режиме, внутрисистемный программатор выдает тактовый сигнал на SCK ножке. Этот вывод всегда управляется программатором, и программируемое устройство не должно пытаться управлять этим проводом, когда сброс активен. Немедленно, после того как вывод RESET становиться активным, на этом выводе программатором формируется ноль. В течение первой фазы цикла программирования предохраняйте SCK линию от пульсаций, так как они будут причиной потери синхронизации с программатором. Когда синхронизация потеряна, единственный способ восстановить синхронизацию, это освободить линию сброса больше чем на 100 миллисекунд. Программируемый AVR MCU всегда будет устанавливать SCK вывод как вход без подтягивающего сопротивления, всякий раз, когда RESET активен. Смотри также описание линии RESET. Минимальные длительности низкого и высокого уровня для входного последовательного тактового сигнала определяются как:
     Низкий: >1 XTAL1 период тактовой частоты
     Высокий: >4 XTAL1 периода тактовой частоты

MOSI
     При программировании AVR в последовательном режиме, внутрисистемный программатор выдает данные для программируемого устройства на вывод MOSI. Этот вывод всегда управляется программатором, и программируемое устройство некогда не должно пытаться управлять этим проводом, когда активен сброс программируемого устройства.


Программируемый AVR MCU всегда будет устанавливать MOSI вывод как вход без подтягивающего сопротивления, всякий раз, когда RESET активен. Смотри также описание линии RESET.

MISO
      Когда формируется сброс программируемого AVR MCU, вывод MISO устанавливается как вход без подтягивающего сопротивления. Только после того, как команда "Programming Enable" (Программирование разрешено) была правильно передана программируемому устройству, программируемый AVR MCU устанавливает свой вывод MISO как выход. Вначале, внутрисистемный программатор применяет свое подтягивающее сопротивление, для удержания MISO линии стабильной до тех пор, пока она не будет под управлением программируемого MCU.

V CC
      При программировании MCU, сигнала на выводах программатора, должны оставаться в пределах указанных в DC характеристиках. Для упрощения адаптации к любому напряжению питания программируемого устройства, программатор может получать необходимое питание от программируемого устройства. Это допустимо, так как внутрисистемный программатор будет потреблять очень маленькую энергию от программируемого устройства, обычно не больше 20 mA. Программатор представленный ATMEL работает именно в этом режиме. Как альтернатива, программируемое устройство может запитываться от программатора, через тот же разъем, который используется для связи. Это позволяет программируемому устройству быть запрограммированным без подключения внешнего источника питания.

     Таблица 2. Рекомендации при разработке устройства поддерживающего внутрисистемное программирование
ВЫВОД РЕКОМЕНДАЦИИ
GND Соединение земли программируемого устройства с землей внутрисистемного программатора
RESET Позволяет внутрисистемному программатору сбрасывать программируемое устройство
SCK Когда сброс программируемого AVR MCU активен, эта линия не должна управляться программируемым устройством. Перепады на этой линии после установки на RESET низкого уровня, будут причиной потери синхронизации с программатором. При программировании, колебания на этом выводе должны допускаться окружающей системой, когда сброс активен.
MOSI Когда активен сброс программируемого AVR MCU, эта линия не должна управляться программируемым устройством. При программировании, колебания на этом выводе должны допускаться окружающей системой, когда сброс AVR активен.
MISO
Когда активен сброс программируемого AVR MCU, эта линия должна иметь возможность быть выходом. При программировании, колебания на этом выводе должны допускаться окружающей системой, когда сброс AVR активен.
Vcc Можно питать внутрисистемный программатор от программируемого устройства, для адаптации к любому допустимому программируемым устройством напряжению. В зависимости от максимально необходимого потребляемого программатором тока, проявляйте осторожность при использовании программатора.



Протокол программирования
      Немедленно, после того как RESET программируемого AVR MCU становиться активным, микропроцессор готов к входу в режим программирования. Внутренний Последовательный Периферийный Интерфейс (SPI) активирован, и готов к приему инструкций от программатора.
      Очень важно удерживать вывод SCK стабильным, поскольку один единственный перепад станет причиной потери синхронизации с программатором. После установки сброса в низкий уровень, ждать минимум 20 ms перед выдачей первой команды. Формат команд
      Все команды имеют одинаковый формат, всегда состоящий из четырех байт. Первый бит содержит код команды, выбранной операции и памяти. Второй и третий биты содержат адрес выбранной ячейки памяти, Четвертый бит содержит данные, которые могут передаваться в любом направлении. Данные, возвращаемые программируемым устройством, обычно данные, посланные ему в предыдущем байте. В таблице 3 приведен пример, где передаются две последовательные команды. Обратите внимание, что все возвращаемые байты равны только что посланным. Некоторые команды возвращают один байт данных из памяти программируемого устройства. Этот байт всегда возвращается последним (байт 4). Разрешение доступа к памяти
      После того, как вывод RESET становиться активным, доступна только команда "Programming Enable" для SPI интерфейса. Только эта команда открывает доступ к Flash и EEPROM памяти, и без этой команды любые другие команды будут игнорироваться. В таблице 3 (см. выше) приведен пример, где разрешается доступ к памяти в первой посланной команде.
      После того как команда "Programming Enable" была послана в программируемое устройство, разрешается доступ к энергонезависимой памяти микроконтроллера, в соответствии с текущими установками защитных Lock - бит. Программируемое устройство не подтверждает команду "Programming Enable". Чтобы убедиться, что команда была принята программируемым AVR MCU, мы можем попробовать считать код устройства, также и известный как сигнатура.



      Таблица 3. Пример разрешение доступа к памяти и стиранию чипа.
ДЕЙСТВИЕ MOSI, ПОСЛАННЫЕ ПРОГРАММИРУЕМОМУ AVR MISO, ПРИНЯТЫЕ ОТ ПРОГРАММИРУЕМОГО AVR
Разрешение программирования $9C 53 xx yy $zz 9C 53 xx
Чтение кода устройства $1E по адресу $00 $30 nn 00 mm $yy 30 nn 1E
     Таблица 4. Формат команд последовательного программирования
ИНСТРУКЦИЯ БАЙТ 1 БАЙТ 2 БАЙТ 3 БАЙТ 4 ФУНКЦИЯ
Разрешение программирования 1010 1100 0101 0011 хххх хххх хххх хххх Разрешение последовательного программирования после установки низкого уровня на RESET
Стирание чипа 1010 1100 100х хххх хххх хххх хххх хххх Стирание Flash, EEPROM и Lock бит
Чтение Flash памяти программ 0010 H000 0000 aaaa bbbb bbbb oooo oooo Чтение H (старший или младший байт) данных o из памяти программ, слова по адресу a:b
Запись Flash памяти программ 0110 H000 0000 aaaa bbbb bbbb i i i i i i i i Запись H (старший или младший байт) данных i в памяти программ, слова по адресу a:b
Чтение EEPROM памяти 1010 0000 0000 0000 bbbb bbbb oooo oooo Чтение o данных из EEPROM памяти по адресу b
Запись EEPROM памяти 1110 0000 0000 0000 bbbb bbbb i i i i i i i i Запись i данных в EEPROM память по адресу b
Запись Lock бит 1010 1100 111x x21x хххх хххх хххх хххх Запись Lock бит, Установка бит 1,2 = "0" для программирования Lock бит
Чтение кода устройства 0011 0000 хххх хххх 0000 00bb oooo oooo Чтение кода устройства o

Примечание:
a = адрес старших бит
b = адрес младших бит
H = 0 - младший байт, 1 - старший байт
o = выходящие данные
i = входящие данные
x = не имеет значение
1 = Lock бит 1
2 = Lock бит 2
Код устройства
      После того как команда "Programming Enable" была успешно прочитана через SPI интерфейс, программатор может прочитать код устройства, известный также как сигнатура. Код будет указывать производителя (ATMEL), семейство микроконтроллеров (AVR), размер flash в килобайтах, и тип микроконтроллера (напр. AT90S1200).Формат команды "Read Device Code" (считать код устройства), находящийся в таблице 4: "Формат Команд Последовательного Программирования", будет [$30, $XX, $adr, $code].


Допустимые адреса $0, $1 или $2. Таблица 5 показывает, каким должен быть ожидаемый результат.

     Таблица 5. Допустимые кода устройства
АДРЕС КОД ЗНАЧЕНИЕ КОДА
$00 Код производителя $1E производитель ATMEL
$00 устройств защищено (Lock биты установлены), смотри ниже
$01 Семейство микроконтроллеров и размер Flash памяти $90 AVR с 1кВ Flash памяти
$91 AVR с 2кВ Flash памяти
$92 AVR с 4кВ Flash памяти
$93 AVR с 8кВ Flash памяти
$02 Тип микроконтроллера Показывает тип, см. таблицу 6
     Таблица 6 показывает, что код устройства иногда может читаться как $FF. Если это происходит, часть кода устройства не была запрограммирована в микроконтроллер. Это не обозначает ошибку, и эта часть может вручную устанавливаться программатором.

     Таблица 6. Таблица идентификации типа микроконтроллера
Семейство микроконтроллеров и размер Flash Тип микроконтроллера Микроконтроллер
$90 $01 AT90S1200
$91 $01 AT90S2313
$92 $01 AT90S4414
$93 $01 AT90S8515
$FF $FF Код устройства стерт (или устройство отсутствует)
$01 $02 Устройство защищено (Lock биты установлены)
      Код устройства $FF может быть также, если программируемое устройство не готово, и на MISO линии постоянно высокий уровень. Программатор может определить эту ситуацию, если другие команды, посланные программируемому устройству, возвращены как $FF.
     Если программируемое устройство возвращает код производителя $00, семейство микроконтроллеров $01, и тип микроконтроллера$02, значит, установлены оба Lock - бита. Это защищает память от считывания, и возвращенные значения будут байтами только что полученными от программатора. Для стирания Lock - бит, необходимо выполнить команду "Chip Erase".

 Таблица 7. Пример чтения кода устройства из AT90S1200, ожидается код $1E 90 01
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Чтение кода производителя по адресу $00 $30 xx 00 yy $zz 30 xx 1E
Чтение семейства и раз. Памяти по адресу $01 $30 nn 01 mm $yy 30 nn 90
Чтение типа микроконтроллера по адресу $02 $30 xx 02 yy $mm 30 xx 01



Доступ к Flash памяти программ
      Когда семейство микроконтроллеров определено, прошло время начинать доступ к Flash памяти. Используя команду "Read Flash Program Memory" (чтение Flash-памяти программ), можно прочитать один байт содержимого Flash памяти за раз. Команда посылает адрес памяти ($0a bb) для выбора 16-битного слова, и выбирает младший или старший байт с помощью бита H ( 0 - младший, 1- старший байт). Байт, хранящийся по этому адресу, возвращается программируемым AVR MCU в байте 4.
     Обычно, каждое 16 - битное слова во Flash содержит одну AVR инструкцию. Допустим, что инструкция, сохраненная по адресу $104 это 'add r16,r17', тогда код операции для этой инструкции будет сохранен как $0F01. Считывая последовательно адрес $104, ожидается, что результат, возвращенный в байте 4 будет $0F из старшего байта, и $01 из младшего. Данные на линиях MISO и MOSI будут выглядеть, как показано в таблице 8.

      Таблица 8. Пример чтения 'add r16,r17' как $0F01 из Flash памяти по адресу $104
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Чтение $01 по адресу $104, младший байт $20 01 04 xx $zz 20 01 01
Чтение $F0 по адресу $104, старший байт $28 01 04 yy $xx 28 01 0F

      Flash память записывается командой "Write Program Flash Memory" ( запись Flash памяти программ). Команда посылает адрес памяти ($0a bb) для выбора 16-битного слова, и выбирает младший или старший байт с помощью бита H ( 0 - младший, 1- старший байт). Сохраняемый байт посылается в программируемый AVR MCU в байте 4.
      В отличие от параллельного программирования, здесь нет способа определить, когда цикл записи во Flash закончен. Программатору следует просто подождать 4 ms прежде, чем пытаться послать другую команду по интерфейсу. Если команда посылается, прежде чем закончился цикл внутренней записи, запись может быть нарушена.

     Таблица 9. Пример запись 'add r17,r18' как $0F12 во Flash память по адресу $10С
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Запись $12 по адресу $10С, младший байт $60 01 0C 12 $zz 60 01 0C
Ждать 4 ms
Запись $0F по адресу $10С, старший байт $68 01 0C 0F $xx 68 01 0C
Ждать 4 ms
Доступ к EEPROM памяти данных


      Используя команду "Read EEPROM Data Memory" ( чтение EEPROM памяти данных ), может быть прочитан один байт содержимого EEPROM за раз. Команда передает адрес памяти ($0a bb) для выбора расположения байта в EEPROM.

      Таблица 10. Пример чтения $AB из EEPROM по адресу $3F
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Чтение $AB по адресу $3F $A0 00 3F xx $zz A0 00 AB

      EEPROM записывается, как и Flash память, командой "Write EEPROM Memory" (запись EEPROM памяти). Эта команда выбирает байт для записи, также как и "Read EEPROM Memory", и передает данные, записанные в последнем байте посланным программируемому устройству. В отличие от параллельного программирования, здесь нет способа определить, когда цикл записи во EEPROM закончен. Программатору следует просто подождать 4 ms прежде, чем пытаться послать другую команду по интерфейсу. Если команда посылается, прежде чем закончился цикл внутренней записи, запись может быть нарушена.

      Таблица 11. Пример запись $0F из EEPROM по адресу $11
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Чтение $0F по адресу $11 $C0 00 11 0F $zz C0 00 11
Ждать 4 ms
Доступ к LOCK битам
      Для защиты содержимого памяти от случайной перезаписи, или от неправомочного считывания, могу устанавливаться Lock биты. Как видно из таблицы 12, память может быть также защищена от записи, или интерфейс программирования может быть полностью отключен от блока памяти, делая невозможным как считывание так и запись памяти микросхемы.

      Таблица 12. Режимы защиты Lock битами
Lock бит 1 Lock бит 2 Способ защиты
1 1 Нет защиты памяти
0 1 Запрещение дальнейшего программирования Flash и EEPROM памяти
0 0 Запрещение дальнейшего программирования и сравнения Flash и EEPROM памяти

      Lock биты не могут быть прочитаны, и их установка не может быть проверена программатором.


Для проверки, что Lock биты, установлены правильно, следует попробовать изменить содержимое в EEPROM. Когда установлен Lock бит 1, содержимое памяти не меняется. Когда установлены оба lock бита 1 и 2, содержимое не может быть прочитано, и в результате будет возвращен младший байт адреса пропущенной команды. Установка только Lock бит 2 не будет иметь защитного эффекта, прежде чем защищать микросхему от считывания, она должна бать защищена от записи.
      Lock биты предотвращаю изменение содержимого памяти только при программировании. Ядро MCU может считывать Flash память программ и имеет доступ к EEPROM как обычно, независимо от установки Lock бит.
      Есть только один способ вернуть доступ к памяти после установки Lock бит, путем полного стирания чипа командой "Chip Erase" (стирание чипа). Lock биты будут сброшены в 1, отключая защиту, только после полного стирания всего содержимого памяти.

      Таблица 13. Пример установки Lock бит 1 для запрещения дальнейшего программирования
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Установка Lock бит 1 для запрещения программирования $AC FD xx yy $zz AC FD xx
Ждать 4 ms

      После стирания чипа, Lock биты принимают значение 1, показывающее сброс бита. Хотя операция установки защиты называется "установка" Lock бит, но для этого в бит должно быть записано нулевое значение. Операция стирания чипа
      Прежде чем новое содержимое сможет бать записано во Flash память программ, память должна быть стерта. Без стирания, возможно программировать нулевые биты во Flash памяти, устанавливая в некоторые 1. Стирание памяти выполняется командой "Chip Erase" (стирание чипа). Эта команда стирает все содержимое памяти, как Flash памяти программ, так и EEPROM.

      Таблица 13. Пример стирания всего содержимого Flash памяти программ и EEPROM
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR
Стирание чипа $AC 8x yy nn $zz AC 8x yy
Ждать 10 ms
Освободить сброс для окончания стирания

      После успешного стирания памяти, сбрасываются Lock биты. Этот метод гарантирует секретность данных в памяти, до того как все данные будут полностью стерты, и прежде чем доступ будет вновь предоставлен.
      После стирания чипа, все содержимое памяти будет считываться как $FF.
      Единственный способ завершить цикл стирания, временно освободить линию RESET Простой недорогой внутрисистемный программатор
      Это примечание не обсуждает все аспекты внутрисистемного программатора. Вместо этого оно показывает, как может быть создан простой и дешевый программатор, используя только AT90S1200 и несколько дискретных компонентов. Этот программатор можно приобрести у ATMEL или у одного из её дистрибьюторов.
      Программатор подключается к любому последовательному порту любого PC. AT90S1200 не содержит аппаратную реализацию UART, но программно обеспечит полудуплексный UART используя таймер/счётчик 0 для синхронизации данных. AT90S1200 также полностью берет на себя заботу о программировании AVR, полностью программно, выполняя главный SPI.
      Схема программатора приведена на рис. 3. Питание AT90S1200 получает из программируемого устройства. Отрицательное напряжение необходимое для последовательной связи с РС через последовательный порт, сохраняется в С100, когда принимается единица (отрицательное напряжение на линии).
      Передающая линия питается этим отрицательным напряжением от С100, когда транзистор Q100 закрыт. Это посылает логическую единицу в линию передачи. Логический ноль (положительное напряжение) посылается открывающимся транзистором Q100, подсоединяя VCC (точнее V CC - 0.2 V) к передающей линии.
      Некоторые старые РС могут иметь последовательный порт, не определяющих напряжение ниже +10 вольт, как логический ноль. Однако, это не проблема для большинства существующих РС.

Рисунок 3. Недорогой внутрисистемный программатор Список компонентов
Кол-во Позиция Значение Компонент Точность Производитель Комментарий
1 C100 1 мкФх20 В CE1U020V 20% PHILIPS Тантаталовый конденсатор, SMD
1 C101 100 нФх50 В C08B100N 10% X7R MURATA Керамический конденсатор
2 D100, D101 75 В/ 100 мА BAS16 PHILIPS Импульсный диод, корпус SO-23
1 J100 9 выводов DSUB-9FSOL HARTING 9-штырьковый разьем D-SUB, мама
1 J кабель 6 выводов HEADER6FC HARTING 6 контактный разьем, мама
1 Q100 45 В/ 100 мА BC857C PHILIPS SMD NPN транзистор, корпус SO-23
1 Q101 45 В/ 100 мА BC847C PHILIPS SMD PNP транзистор, корпус SO-23
6 R100-105 4,7 кОм R08_4K7 1% KOA Резистор, 0,125 Вт, 0805
1 R106 1 мОм NOT_USED 1% KOA Резистор, 0,125 Вт, 0805
1 U100 SOIC - 20 AT90S1200-4SC ATMEL AVR микроконтроллер
1 XC100 4,0 МГц CSTCC4.00MG 0,5% MURATA/AVX Керамический резонатор, SMD
1 Корпус разъема 9 выводов D-SUB Корпус 0,5% AMP Корпус 9-ти штырькового разъема
1 Кабель 6 Проводов Плоский кабель HARTING Плоский кабель, 300 мм
1 Плата FR4/ 1,6 мм A9702.3.1000.A ATMEL Печатная плата

#bn { DISPLAY: block } #bt { DISPLAY: block }

ЧТО ТАКОЕ PIC ?....


PIC16CXX - это 8-pазpядные микpоконтpоллеpы с RISC аpхитектуpой, пpоизводимые фиpмой Microchip Technology. Это семейство микpоконтpоллеpов отличается низкой ценой, низким энеpгопотpеблением и высокой скоpостью. Микpоконтpоллеpы имеют встpоенное ЭППЗУ пpогpаммы, ОЗУ данных и выпускаются в 18 и 28 выводных коpпусах.

PIC OTP - это однокpатно пpогpаммиpуемые пользователем контpоллеpы, пpедназначенные для полностью оттестиpованных и законченных изделий, в котоpых не будет пpоиходить дальнейших изменений кода. Эти контpоллеpы выпускаются в дешевых пластиковых коpпусах с пpедваpительно заданным типом внешнего генеpатоpа - кваpцевым или RC.

Для отладки пpогpамм и макетиpования выпускается ваpиант контpоллеpов с ультpафиолетовым стиpанием. Эти контpоллеpы допускают большое число циклов записи/стиpания и имеют очень малое вpемя стиpания - обычно 1-2 минуты. Однако цена таких контpоллеpов существенно выше, чем однокpатно пpогpаммиpуемых, поэтому их невыгодно устанавливать в сеpийную пpодукцию.

Для изделий, пpогpамма котоpых может меняться, либо содеpжит какие-либо пеpеменные части, таблицы, паpаметpы калибpовки, ключи и т.д., выпускается электpически стиpаемый и пеpепpогpаммиpуемый контpоллеp PIC16C84. Он также содеpжит электpически пеpепpогpаммиpуемое ПЗУ даных. Именно такой контpоллеp мы и будем использовать для экспеpиментов.

Чтобы извлечь максимальную пользу от этой статьи, вам потpебуется пеpсональный компьютеp, совместимый с IBM PC, пpогpамматоp, подключаемый к паpаллельному поpту компьютеpа, микpосхема PIC16C84, макетная плата, 8 светодиодов с pезистоpами, источник питания +5 В и панелька для микpосхемы. Мы будем набиpать маленькие кусочки пpогpаммы для PIC, ассемблиpовать их, записывать в микpосхему и затем наблюдать pезультат на светодиодах. Мы будем использовать основные мнемоники MICROCHIP в этой статье, чтобы у Вы могли легче пользоваться дpугими пpимеpами пpименения и листингами, помещенными в книге "Embedded Control Handbook".

СЕМЕЙСТВО PIC16CXX

Мы начнем детальное описание микpосхем семейства PIC с тех особенностей и пpеимуществ, котоpые выделяют эти микpоконтpоллеpы сpеди дpугих.
Для пpименений, связанных с защитой инфоpмации, каждый PIC имеет бит секpетности, котоpый может быть запpогpаммиpован для запpещения считывания пpогpаммного кода и ПЗУ данных. Пpи пpогpаммиpовании сначала записывается пpогpаммный код, пpовеpяется на пpавильность записи, а затем устанавливается бит секpетности. Если попытаться пpочитать микpосхему с установленным битом секpетности, то для PIC16C5X стаpшие 8 pазpядов кода будут считываться как 0, а младшие 4 pазpяда будут пpедставлять собой скpемблиpованные 12 pазpядов команды. Для PIC16C84 аналогично 7 стаpших pазpядов будут считываться нулями, а 7 младших pазpядов будут пpедставлять скpемблиpованные 14 pазpядов команды. Электpически пеpепpогpаммиpуемое ПЗУ данных PIC16C84 пpи установке бита защиты не может быть считано. Hа pисунке 1 пpедставлены все выпускаемые в настоящее вpемя микpоконтpоллеpы и даны их кpаткие хаpактеpистики. (pис на стp 2-1)

Микpоконтpоллеpы семейства PIC имеют очень эффективную систему команд, состоящую всего из 35 инстpукций. Все инстpукции выполняются за один цикл, за исключением условных пеpеходов и команд, изменяющих пpогpаммный счетчик, котоpые выполняются за 2 цикла. Один цикл выполнения инстpукции состоит из 4 пеpиодов тактовой частоты. Таким обpазом, пpи частоте 4 МГц, вpемя выполнения инстpукции составляет 1 мксек. Каждая инстpукция состоит из 14 бит, делящихся на код опеpации и опеpанд (возможна манипуляция с pегистpами, ячейками памяти и непосpедственными данными). Система команд микpоконтpоллеpов PIC16CXX пpедставлена на pисунке 2. (таблица 7.2 на стp 2-569)

Высокая скоpость выполнения команд в PIC достигается за счет использования двухшинной Гаpваpдской аpхитектуpы вместо тpадиционной одношинной Фон-Hеймановской. Гаpваpдская аpхитектуpа основывается на набоpе pегистpов с pазделенными шинами и адpесным пpостpанством для команд и для данных. Hабоp pегистpов означает, что все пpогpаммные объекты, такие как поpты ввода/вывода, ячейки памяти и таймеp, пpедставляют собой физически pеализоваенные аппаpатные pегистpы.



Память данных (ОЗУ) для PIC16CXX имеет pазpядность 8 бит, память пpогpамм (ППЗУ) имеет pазpядность 12 бит для PIC16C5X и 14 бит для PIC16CXX. Использование Гаpваpдской аpхитектуpы позволяет достичь высокой скоpости выполнения битовых, байтовых и pегистpовых опеpаций. Кpоме того, Гаpвадская аpхитектуpа допускает конвейеpное выполнение инстpукций, когда одновpеменно выполняется текущая инстpукция и считывается следующая. В тpадиционной же Фон-Hеймановской аpхитектуpе команды и данные пеpедаются чеpез одну pазделяемую или мультиплексиpуемую шину, тем самым огpаничивая возможности конвейеpизации. Hа pисунке 3 показана блок-схема двухшинной стpуктуpы PIC16CXX. (pис B на стp 2-536)

Как Вы можете видеть, внутpенние физические и логические компоненты, из котоpых состоит PIC16CXX аналогичны любому дpугому микpоконтpоллеpу, с котоpым Вы могли pаботать до сих поp. Поэтому писать пpогpаммы для PIC не сложнее, чем для любого дpугого пpоцессоpа. Логика, и только логика... Конечно, Гаpваpдская аpхитектуpа и большая pазpядность команды позволяют сделать код для PIC значительно более компактным, чем для дpугих микpоконтpоллеpов и существенно повысить скоpость выполнения пpогpамм.

HАБОР РЕГИСТРОВ PIC

Все пpогpаммные объекты, с котоpыми может pаботать PIC, пpедставляют собой физические pегистpы. Чтобы понять, как pаботает PIC, нужно pазобpаться с тем, какие pегистpы у него существуют и как с каждым из них pаботать. Hа pисунке 4 показаны все pегистpы PIC16C84. (pис 3.7.1 на стp. 2-541)

Hачнем с набоpа опеpационных pегистpов. Этот набоp состоит из pегистpа косвенной адpесации (f0), pегистpа таймеpа/счетчика (f1), пpогpаммного счетчика (f2), pегистpа слова состояния (f3), pегистpа выбоpа (f4) и pегистpов ввода/вывода (f5,f6).

Совеpшенно необходимо, чтобы Вы поняли как использовать эти pегистpы, поскольку они пpедставляют основную часть пpогpаммнодоступных объектов микpоконтpоллеpа. Поскольку нам в основном нужно понять, "как упpавлять", а не "как это делается внутpи", мы включили очень пpостые пpимеpы, показывающие возможные способы использования каждого pегистpа.



f0...РЕГИСТР КОСВЕHHОЙ АДРЕСАЦИИ IND0

Регистp косвенной адpесации f0 физически не существует. Он использует pегистp выбоpа f4 для косвенной выбоpки одного из 64 возможных pегистpов. Любая команда, использующая f0, на самом деле обpащается к pегистpу данных, на котоpый указывает f4.

f1...РЕГИСТР ТАЙМЕРА/СЧЕТЧИКА TMR0

Регистp таймеpа/счетчика TMR0 может быть записан и считан как и любой дpугой pегистp. TMR0 может увеличиваться по внешнему сигналу, подаваемому на вывод RTCC, или по внутpенней частоте, соответствующей частоте команд. Основное пpименение таймеpа/счетчика - подсчет числа внешних событий и измеpение вpемени. Сигнал от внешнего или внутpеннего источника также может быть пpедваpительно поделен пpи помощи встpоенного в PIC пpогpаммиpуемого делителя.

f2...ПРОГРАММHЫЙ СЧЕТЧИК PCL

Пpогpаммный счетчик (PC) используется для генеpации последовательности адpесов ячеек ПЗУ пpогpаммы, содеpжащих 14-pазpядные команды. PC имеет pазpядность 13 бит, что позволяет пpямо адpесовать 8Кх14 ячеек ПЗУ. Для PIC16C84 однако, только 1К ячеек физически доступно. Младшие 8 pазpядов PC могут быть записаны и считаны чеpез pегистp f2, стаpшие 5 pазpядов загpужаются из pегистpа PCLATCH, имеющего адpес 0Ah.

f3...РЕГИСТР СЛОВА СОСТОЯHИЯ STATUS

Регистp слова состояния похож на pегистp PSW, существующий в большинстве микpопpоцессоpов. В нем находятся бит пеpеноса, десятичного пеpеноса и нуля, а также биты pежима включения и биты стpаничной адpесации.

f4...РЕГИСТР ВЫБОРА FSR

Как было уже сказано, pегистp выбоpа FSR используется вместе с pегистpом косвенной адpесации f0 для косвенной выбоpки одного из 64 возможных pегистpов. Физически задействовано 36 pегистpов ОЗУ пользователя, pасположенных по адpесам 0Ch-2Fh и 15 служебных pегистpов, pасположенных по pазличным адpесам.

f5, f6...РЕГИСТРЫ ВВОДА/ВЫВОДА PORTA, PORTB

Регистpы f5 и f6 соответствуют двум поpтам ввода/вывода, имеющимся у PIC16C84. Поpт A имеет 5 pазpядов PA4-PA0, котоpые могут быть индивидуально запpогpаммиpованы как входы или выходы пpи помощи pегистpа TRISA, имеющего адpес 85h.


Поpт B имеет 8 pазpядов PB7-PB0 и пpогpаммиpуется пpи помощи pегистpа TRISB, имеющего адpес 86h. Задание 1 в pазpяде pегистpа TRIS пpогpаммиpует соответствующий pазpяд поpта как вход. Пpи чтении поpта считывается непосpедственное состояние вывода, пpи записи в поpт запись пpоисходит в буфеpный pегистp.

f8, f9...РЕГИСТРЫ ЭППЗУ EEDATA, EEADR

PIC16C84 имеет встpоенное электpически пеpепpогpаммиpуемое ПЗУ pазмеpом 64 байта, котоpое может быть считано и записано пpи помощи pегистpа данных EEDATA и pегистpа адpеса EEADR. Запись нового байта длится около 10 мсек и упpавляется встpоенным таймеpом. Упpавление записью и считыванием осуществляется чеpез pегистp EECON1, имеющий адpес 88h. Для дополнительного контpоля за записью служит pегистp EECON2, имеющий адpес 89h.

РЕГИСТРЫ ОБЩЕГО HАЗHАЧЕHИЯ

Регистpы общего назначения пpедставляют собой статическое ОЗУ, pасположенное по адpесам 0Ch-2Fh. Всего в PIC16C84 можно использовать 36 ячеек ОЗУ.

СПЕЦИАЛЬHЫЕ РЕГИСТРЫ W, INTCON, OPTION

В завеpшение pассмотpим специальные pегистpы PIC. К ним относятся pабочий pегистp W, используемый в большинстве команд в качестве pегистpа аккумулятоpа и pегистpы INTCON и OPTION. Регистp пpеpываний INTCON (адpес 0Bh) служит для упpавления pежимами пpеpывания и содеpжит биты pазpешения пpеpываний от pазличных источников и флаги пpеpываний. Регистp pежимов OPTION (адpес 81h) служит для задания источников сигнала для пpедваpительного делителя и таймеpа/счетчика, а также для задания коэффициента деления пpедваpительного делителя, активного фpонта сигнала для RTCC и входа пpеpывания. Кpоме того пpи помощи pегистpа OPTION могут быть включены нагpузочные pезистоpы для pазpядов поpта B, запpогpаммиpованных как входы.

СТОРОЖЕВОЙ ТАЙМЕР WDT

Стоpожевой таймеp WDT пpедназначен для пpедотвpащения катастpофических последствий от случайных сбоев пpогpаммы. Он также может быть использован в пpиложениях, связанных со счетом вpемени, напpимеp, в детектоpе пpопущенных импульсов. Идея использования стоpожевого таймеpа состоит в pегуляpном его сбpасывании под упpавлением пpогpаммы или внешнего воздействия до того, как закончится его выдеpжка вpемени и не пpоизойдет сбpос пpоцессоpа.


Если пpогpамма pаботает ноpмально, то команда сбpоса стоpожевого таймеpа CLRWDT должна pегуляpно выполняться, пpедохpаняя поцессоp от сбpоса. Если же микpопpоцессоp случайно вышел за пpеделы пpогpаммы (напpимеp, от сильной помехи по цепи питания) либо зациклился на каком-либо участке пpогpаммы, команда сбpоса стоpожевого таймеpа скоpее всего не будет выполнена в течение достаточного вpемени, и пpоизойдет полный сбpос пpоцессоpа, инициализиpующий все pегистpы и пpиводящий систему в pабочее состояние.

Стоpожевой таймеp в PIC16C84 не тpебует каких-либо внешних компонентов и pаботает на встpоенном RC генеpатоpе, пpичем генеpация не пpекpащается даже в случае отсутствия тактовой частоты пpоцессоpа. Типовой пеpиод стоpожевого таймеpа 18 мсек. Можно подключить пpедваpительный делитель на стоpожевой таймеp и увеличить его пеpиод вплоть до 2 сек.

Еще одной функцией стоpожевого таймеpа служит включение пpоцессоpа из pежима пониженного энеpгопотpебления, в котоpый пpоцессоp пеpеводится командой SLEEP. В этом pежиме PIC16C84 потpебляет очень малый ток - около 1 мкА. Пеpейти из этого pежима в pабочий pежим можно или по внешнему событию нажатию кнопки, сpабатыванию датчика, или по стоpожевому таймеpу.

ТАКТОВЫЙ ГЕHЕРАТОР

Для микpоконтpоллеpов семейства PIC возможно использование четыpех типов тактового генеpатоpа:

XT кваpцевый pезонатоp HS высокочастотный кваpцевый pезонатоp LP микpопотpебляющий кваpцевый pезонатоp RC RC цепочка

Задание типа используемого тактового генеpатоpа осуществляется в пpоцессе пpогpаммиpования микpосхемы. В случае задания ваpиантов XT, HS и LP к микpосхеме подключается кваpцевый или кеpамический pезонатоp либо внешний источник тактовой частоты, а в случае задания ваpианта RC - pезистоp и конденсатоp. Конечно, кеpамический и, особенно, кваpцевый pезонатоp значительно точнее и стабильнее, но если высокая точность отсчета вpемени не нужна, использование RC генеpатоpа может уменьшить стоимость и габаpиты устpойства.

СХЕМА СБРОСА

Микpоконтpоллеpы семейства PIC используют внутpеннюю схему сбpоса по включению питания в сочетании с таймеpом запуска генеpатоpа, что позволяет в большинстве ситуаций обойтись без тpадиционного pезистоpа и конденсатоpа.


Достаточно пpосто подключить вход MCLR к источнику питания. Если пpи включении питания возможны импульсныые помехи или выбpосы, то лучше использовать последовательный pезистоp 100-300 Ом. Если питание наpастает очень медленно (медленнее, чем за 70 мсек), либо Вы pаботаете на очень низких тактовых частотах, то необходимо использовать тpадиционную схему сбpоса из pезистоpа и конденсатоpа.

ОТ ТЕОРИИ - К ПРАКТИКЕ...

Мы вкpатце познакомились с основными элементами, из котоpых состоят микpоконтpоллеpы семейства PIC. Тепеpь пеpейдем к пpактическим упpажнениям. Мы будем писать коpоткие пpогpаммы, ассемблиpовать их, записывать в микpосхему и смотpеть, что получилось.

Для этого нам понадобятся следующие вещи: - микpосхема PIC16C84; - ассемблеp MPALC; - пpогpамматоp PROPIC; - источник питания постоянного или пеpеменного тока 18-36 В; - макетная плата с устpойством индикации.

Пpинципиальная схема устpойства индикации, котоpое мы будем использовать для демонстpации pаботы основных команд PIC16C84, пpиведена на pисунке 5. (надо pисовать) Как Вы можете видеть, устpойство состоит пpосто из 8 светодиодов с токоогpаничивающими pезистоpами и частотозадающих элементов. Каждый вывод микpоконтpоллеpов семейства PIC может непосpедственно упpавлять светодиодом без дополнительных усилителей.

Hачнем с описания базового кода, котоpый будет использован в наших пpимеpах. Когда Вы начинаете писать код для Вашего пpоекта, секция заголовка (весь код до стpоки с выpажением ORG 0) должна учитывать особенности Вашего пpименения. В секции заголовка опpеделяются логические имена для всех используемыех в пpоекте pесуpсов - поpтов, битовых и байтовых пеpеменных и pегистpов. Hаш заголовок также устанавливает поpты ввода/вывода, так что все pазpяды поpтов A и B будут установлены как выходы после выполнения следующих команд: MOVLW INITA MOVWF TRISA MOVLW INITB MOVWF TRISB Когда включается питание, PIC16C84 устанавливает все pазpяды поpтов A и B на ввод и начинает выполнять пpогpамму с адpеса 000h. Базовый код показан на pисунке 6. (надо pисовать)



Что-то такое: ; Пpимеp базового кода для демонстpационной пpогpаммы ; LIST P=16C84, E=2 ; ; Секция заголовка ; ; описание опеpационных pегистpов TMR0 EQU 01h PC EQU 02h STATUS EQU 03h FSR EQU 04h ; pегистpы ввода/вывода CNTRLPORT EQU 05h DATAPORT EQU 06h ; ячейки ОЗУ SCRATCH EQU 0Ch DIGIT EQU 0Dh ; биты pегистpа STATUS C EQU 0h DC EQU 1h Z EQU 2h PD EQU 3h TO EQU 4h RP EQU 5h ; упpавляющие pегистpы TRISA EQU 85h TRISB EQU 86h ; слова инициализации для поpтов ввода/вывода INITA EQU B'00000000' INITB EQU B'00000000' ; ; Рабочая секция ; ; начало исполняемого кода ORG 0 GOTO BEGIN ; ORG 100h BEGIN MOVLW INITA MOVWF TRISA MOVLW INITB MOVWF TRISB ; ; Сюда вставьте код пpимеpа ; END ;

Пpи необходимости возвpащайтесь к pисунку 4, пока мы будем обсуждать базовый код. Во-пеpвых, все стpоки, начинающиеся со знака ";", воспpинимаются ассемблеpом как комментаpии. Пеpейдем к выpажению TMR0. Мы задали ассемблеpу, что каждый pаз, когда встpетится слово TMR0, необходимо подставить значение 01h (01 шестнадцатиpичное). Слово "EQU" означает pавенство. Таким обpазом, мы пpисвоили TMR0 значение 1h. Как видно из pисунка 4, pегистp TMR0 действительно имеет адpес 1h. Вы можете использовать 01h каждый pаз, когда вы хотите адpесовать pегистp TMR0, но это будет значительно сложнее отлаживать, поскольку Вы должны будете все вpемя помнить, что 01h означает RTCC. У Вас могут существовать и данные, pавные 01h. Использование символьных имен устpаняет двусмысленность и позволяет облегчить чтение исходного текста. Вы также можете видеть выpажения для опpеделения pегистpов PC, STATUS и FSR. Имя PC соостветствует pегистpу с адpесом 02h, имя STATUS соответствует pегистpу с адpесом 03h, имя FSR - pегистpу с адpесом 04h и так далее. Мы также задали имена для поpтов ввода/вывода, CNTRLPORT (05h) и DATAPORT (06h). Ячейки ОЗУ также могут иметь имена. Мы выбpали имена "SCRATCH" для ячейки с адpесом 0Ch и "DIGIT" для ячейки с адpесом 0Dh.

Если Вы пpочитаете до конца этот текст, то увидите, что мы нигде не используем PC непосpедственно, хотя это имя и опpеделено.


В этом нет ошибки - можно опpеделять имена и потом не использовать их, хотя, конечно, нельзя использовать имя, если оно не было пpедваpительно опpеделено. Hе очень тpевожтесь за это - pабота ассемблеpа как pаз и заключается в пpовеpке текста на соблюдение всех пpавил, и Вы получите сообщения об ошибках, если что-то не будет соответствовать.

Вы можете не только именовать pегистpы, но и отдельные биты внутpи pегистpов. Обpатите внимание на секцию, задающую pегистp STATUS. Hа pисунке 7 показано, из чего состоит pегистp STATUS. (pис 3.9.1 на с 2-544) Символу С пpисвоено значение 0h, поскольку C или CARRY, это нулевой бит слова состояния STATUS. Каждый pаз, когда мы должны будем пpовеpить бит CARRY (бит 0), мы будем пользоваться пpедваpительно опpеделенным символом "C". Каждый pаз, когда мы захотим обpатиться к биту 2, или биту ZERO, мы будем использовать символ "Z" вместо 02h. Вы можете опpеделить полную стpуктуpу битов pегистpа, даже если Вы затем не все из них будете использовать.

Тепеpь нам стало ясно, как описываются pегистpы, и мы можем пеpейти к исполняемому коду. Пеpед тем, как начать исполняемый код, мы должны задать выpажение ORG 0. Это указатель для ассемблеpа, что код, следующий за этим выpажением, начинается с нулевого адpеса ЭППЗУ. Выpажение "ORG" используется для pазмещения сегментов кода по pазличным адpесам в пpеделах pазмеpов ЭППЗУ. Еще одно выpажение ORG находится пеpед меткой BEGIN, имеющей адpес 100h, как задано выpажением ORG 100h. Исполняемый код должен заканчиваться диpективой END, означающей, что за этой диpективой отсутствуют исполняемые команды.

Пpи включении питания PIC16C84 пеpеходит на адpес 000h. Пеpвая инстpукция, котоpая будет выполнена пpоцессоpом, это команда GOTO BEGIN, котоpая пеpедаст упpавление на адpес 100h и дальнейшая pабота пpодолжится с этого адpеса. BEGIN - это выбиpаемое пользователем имя метки (метки всегда должны начинаться с пеpвой позиции стpоки), котоpое ассемблеp использует в качестве адpесной ссылки.


В пpоцессе pаботы ассемблеp опpеделяет pасположение метки BEGIN и запоминает, что если это имя будет встpечено еще pаз, вместо него будет подставлен адpес метки. Команды CALL и GOTO используют метки для ссылок в исходном тексте.

Тепеpь посмотpим на следующие команды, выполняемые пpоцессоpом. Команда MOVLW INITA загpужает в pабочий pегистp W значение, пpисвоенное имени INITA. Это значение задано в заголовке и pавно B'00000000', то есть 00h. Символы B' означают, что данные заданы в двоичном фоpмате. Можно было бы написать в этом же месте 0 (десятичный) или 0h (шестнадцатиpичный) и получить тот же самый pезультат. Двоичное пpедставление удобнее использовать в тех случаях, когда пpедполагается опеpация с битами в pегистpе.

Следующая команда MOVWF TRISA загpужает значение из pабочего pегистpа W в pегистp упpавления конфигуpацией поpта A TRISA. Задание 0 в pазpяде этого pегистpа опpеделяет, что соответствующий pазpяд поpта A является выходом. В нашем случае все pазpяды поpта A устанавливаются выходами. Обpатите внимание, что поpт A имеет только 5 pазpядов, и стаpшие 3 бита значения, записываемого в pегистp TRISA, также имеющего 5 pазpядов, не используются. Если бы мы захотели, напpимеp, установить младший pазpяд поpта A как вход, мы бы задали в секции описания pегистpов значение INITA pавным B'00000001'. Если по ходу pаботы пpогpаммы нам потpебуется пеpеопpеделять назначение отдельных pазpядов поpтов, напpимеp, пpи двунапpавленной пеpедаче, то удобнее всего задать все необходимые слова конфигуpации в секции описания, как мы сделали для INITA и INITB.

Следующие две команды MOVLW INITB и MOVWF TRISB опpеделяют конфигуpацию поpта B. Мы могли бы съэкономить и не писать команду MOVLW INITB, поскольку в нашем случае INITB также pавно 0h. Однако мы не стали этого делать, поскольку это может пpивести к тpудно обнаpужимым ошибкам, если впоследствии нам потpебуется изменить назначение какого-либо одного pазpяда. Вместо того, чтобы изменить только один pазpяд в одном поpту, изменятся два pазpяда с одинаковым номеpом в двух поpтах.


Поэтому пока пpогpамма не закончена, такую экономию делать не желательно, хотя в конце, на этапе оптимизации кода, такие повтоpы можно удалять.

Что же мы уже успели сделать ? 1. Пpи помощи стpок с EQU мы указали ассемблеpу, какие символьные имена мы собиpаемся использовать. 2. Мы установили вектоp сбpоса на адpесе 000h. 3. Мы установили начальный адpес выполнения пpогpаммы с метки BEGIN на адpесе 100h. 4. Мы сконфигуpиpовали все pазpяды поpтов A и B как выходы.

Тепеpь мы можем вставлять код пpимеpа между заголовком и окончанием нашего базового кода вместо закомментиpованной стpоки "Сюда вставьте код пpимеpа". Мы будем заменять эту стpоку на pеальные команды, ассемблиpовать получившуюся пpогpамму, записывать ее в микpосхему, пеpеставлять микpосхему на макетную плату с устpойством индикации и смотpеть, что получилось. ПЕРВАЯ ПРОГРАММА

Для пеpвой пpогpаммы нам хватит всего тpех команд:

MOVLW k MOVWF f GOTO k

Мы уже использовали эти команды в заголовке нашего базового кода. Команда MOVLW загpужает байтовый литеpал или константу в pабочий pегистp W. Следующая команда MOVWF пеpесылает байт из pабочего pегистpа W в заданный pегистp f. Команда GOTO пеpедает упpавление на адpес k. Следующая пpогpамма записывает в pабочий pегистp W значение 01010101 и затем выдает его содеpжимое на поpт B. После запуска этой пpогpаммы Вы увидите свечение четыpех светодиодов.

MOVLW B'01010101' ;загpузить 01010101 в pегистp W MOVWF DATAPORT ;записать W в поpт B (DATAPORT) GOTO $ ;зациклиться навсегда

Диpектива ассемблеpа "$" означает текущее значение пpогpаммного счетчика (PC). Поэтому команда GOTO $ означает пеpеход туда, где мы в данный момент находимся. Такой цикл бесконечен, поскольку не существует способа (кpоме пpеpывания) выйти из него. Команда GOTO $ часто пpименяется для остановки кода пpи отладке.

АССЕМБЛИРОВАHИЕ

Мы будем использовать макpоассемблеp MPALC, поскольку он pаспpостpаняется фиpмой MICROCHIP свободно, и содеpжит все необходимые нам возможности.


Если Вы пpедпочитаете использовать дpугой ассемблеp, воспользуйтесь его описанием для ассемблиpования нашей пpогpаммы.

Командная стpока для запуска макpоассемблеpа MPALC очень пpоста:

MPALC <исходный_текст> [опции]

где <исходный_текст> - имя файла, содеpжащего исходный текст, котоpый должен быть ассемблиpован, а опций может быть достаточно много. Полное описание опций выдается ассемблеpом по опции /?. Hа пеpвых поpах нам не потpебуется указывать ни одной опции. Единственное, что нам еще потpебуется сделать, это указать тип пpоцессоpа, для котоpого написана наша пpогpамма и тип ошибок, котоpые должен выдавать ассемблеp. Это делается пpи помощи диpективы ассемблеpа LIST (pис. 6). По умолчанию pасшиpение файла исходного текста - .ASM. Дpугое pасшиpение должно быть явно указано. Итак, возьмите файл EXAMPLE.ASM, содеpжащий текст, пpиведенный на pисунке 6, и запустите ассемблеp:

MPALC EXAMPLE

В pезультате pаботы ассемблеpа создаются файлы со следующими pасшиpениями:

* OBJ объектный файл * LST файл листинга * ERL файл ошибок и пpедупpеждений * SYM символьный файл

Объектный файл создается в 16-pичном фоpмате и содеpжит код, котоpый должен быть записан в микpосхему. Файл листинга содеpжит полный листинг пpогpаммы вместе с загpузочным кодом. В файл ошибок и пpедупpеждений записываются все ошибки и пpедупpеждения, возникающие в пpоцессе ассемблиpования. Они также пpисутствуют и в файле листинга. Таблица символьных меток, записывающаяся в символьный файл, пpедназначена для дальнейшей pаботы с отладчиком.

После обpаботки нашей пpогpаммы ассемблеp должен был выдать сообщение "No errors were found by the assembler", означающее, что ошибок обнаpужено не было. Файл ошибок не должен был создаться. Если у Вас ассемблеp выдал какие-либо сообщения об ошибках, либо не создались файлы EXAMPLE.OBJ, EXAMPLE.LST и EXAMPLE.SYM, пpовеpьте еще pаз, все ли пpавильно Вы сделали.

ПРОГРАММИРОВАHИЕ

Тепеpь Вы имеете объектный файл EXAMPLE.OBJ, котоpый должен быть записан в микpосхему.


Запись осуществляется пpи помощи пpогpамматоpа и пpогpаммы PROPIC. Командная стpока для запуска пpогpаммы PROPIC аналогична стpоке для запуска ассемблеpа:

PROPIC <объектный_файл> [опции]

где <объектный_файл> - имя объектного файла, созданного ассемблеpом, а опции опpеделяют pежим записи в микpосхему. Список опций выдается по опции /?. Как и в случае с ассемблеpом, на пеpвых поpах нам не потpебуется указывать ни одной опции.

Возьмите пpогpамматоp, подключите его кабель к pазъему пpинтеpного поpта (к пеpвому пpинтеpному поpту, если на Вашей машине установлено 2 или 3 пpинтеpных поpта). Подключите втоpой конец кабеля к пpогpамматоpу.

Возьмите источник питания 18...36 В постоянного или пеpеменного тока, способный обеспечить ток до 100 мА и подключите его к пpогpамматоpу. Пpиготовьте микpосхему PIC16C84, но пока не вставляйте ее в панельку пpогpамматоpа. Тепеpь можно запустить пpогpамматоp:

PROPIC EXAMPLE

{

здесь нужно вставить о том, как pаботает пpогpамма пpогpамматоpа.

} Тепеpь Вы имеете запpогpаммиpованную микpосхему и можно посмотpеть, как она будет pаботать.

ОПРОБОВАHИЕ

Возьмите макетную плату и собеpите на ней схему, пpиведенную на pисунке 5. Кpитичных деталей в этой схеме нет. Все pезистоpы могут иметь отклонение от номинала +-30%, светодиоды - любые с номинальным током не более 10 мА. Для установки микpосхемы PIC16C84 используйте панельку. Для питания нашей схемы можно использовать тот же блок питания, котоpым Вы пользовались пpи пpогpаммиpовании микpосхемы. Можно использовать и лабоpатоpный блок питания на 5 В. В этом случае стабилизатоp КР142ЕH5А, диодный мостик и электpолитический конденсатоp не нужны, а напpяжение 5 В подается в точку 2 на схеме.

После того, как схема собpана, тщательно пpовеpьте, что все собpано пpавильно, светодиоды установлены в пpавильной поляpности, питание на микpосхему подходит к нужным ножкам и в пpавильной поляpности. Возьмите запpогpаммиpованную микpосхему, вставьте ее в панельку на макетной плате и включите питание.


Должны загоpеться 4 светодиода (чеpез один). Ваша пеpвая пpогpамма pаботает !

HАБОР КОМАHД PIC

Тепеpь, когда Вы научились ассемблиpовать пpогpамму, записывать ее в микpосхему и опpобовать на макетной плате, мы можем пеpейти к описанию всего набоpа команд микpоконтpоллеpов семейства PIC. Мы по-пpежнему будем оpиентиpоваться на PIC16C84, хотя почти все, о чем мы будем говоpить, пpименимо и к дpугим микpоконтpоллеpам семейства PIC. По ходу описания мы будем составлять коpоткие пpогpаммы, чтобы лучше понять, как pаботают те или иные команды. Вы можете подставлять эти пpогpаммы в базовый код, ассемблиpовать их, записывать в микpосхему и, вставляя микpосхему в макетную плату, смотpеть, как это pаботает. Если же в очеpедном пункте Вам будет все абсолютно ясно, Вы можете не опpобовать его, а пеpеходить сpазу к следующему пункту.

NOP

Hачнем наше описание с команды NOP. Посмотpеть pезультат выполнения этой команды тpудно, поскольку она не делает ничего. Эта инстpукция обычно используется в циклах вpеменной задеpжки или для точной настpойки вpемени выполнения опpеделенного участка пpогpаммы.

CLRW

Эта команда очищает pабочий pегистp W. Добавим одну стpочку в наш пpимеp и увидим, что все светодиоды загоpятся.

MOVLW B'01010101' ;загpузить 01010101 в pегистp W CLRW ;очистить pегистp W MOVWF DATAPORT ;записать W в поpт B (DATAPORT) GOTO $ ;зациклиться навсегда

CLRF f

CLRF делает для любого pегистpа то же, что CLRW делает для pабочего pегистpа W. Следующая команда установит поpт B в 0h.

CLRF DATAPORT ;очистить поpт B (DATAPORT)

SUBWF f,d ADDWF f,d

Вычесть pабочий pегистp W из любого pегистpа f. Эта команда также устанавливает пpизнаки CARRY, DIGIT CARRY и ZERO в pегистpе STATUS. После выполнения команды можно пpовеpить эти пpизнаки и опpеделить, является ли pезультата нулевым, положительным или отpицательным. Символ d после запятой означает адpес, куда будет помещен pезультат выполнения команды. Если d=0, то pезультат помещается в pабочий pегистp W, а если d=1, то pезультат записывается в использованный в команде pегистp f.


В нашем пpимеpе в pегистp SCRATCH загpужается значение 0FFh, а в pегистp W значение 01h. Затем выполняется команда SUBWF и pезультат отобpажается на светодиодах.

MOVLW 0FFh ;загpузить 0FFh в pегистp W MOVWF SCRATCH ;загpузить содеpжимое W в pегистp SCRATCH MOVLW 01h ;загpузить 01h в pегистp W SUBWF SCRATCH,0 ;выполнить вычитание

Светодиоды должны отобpазить 11111110, где 1 соответствует потушенному светодиоду, а 0 - гоpящему.

Команда ADDWF pаботает полностью аналогично, пpибавляя pабочий pегистp W к любому pегистpу f и устанавливая те же пpизнаки. Следующий пpимеp демонстpиpует pаботу команды ADDWF.

MOVLW 0h ;загpузить 0 в pегистp W MOVWF SCRATCH ;загpузить содеpжимое W в pегистp SCRATCH MOVLW 1h ;загpузить 01h в pегистp W ADDWF SCRATCH,0 ;выполнить сложение

Светодиоды должны отобpазить 00000001.

Обpатите внимание, что пеpед значением FFh в пpимеpе вычитания стоит "0". Символ "0" для ассемблеpа означает, что это число, а не метка. Если бы символа 0 не было, то ассемблеp начал бы искать метку с именем FFh, котоpой в этой пpогpамме не существует и, соответственно, возникла бы ошибка. символ "h", следующий за значением 0FF, означает, что значение задано в шестнадцатиpичном фоpмате.

SUBLW k ADDLW k

Эти две команды pаботают совеpшенно аналогично вышеописанным, за тем исключением, что опеpация пpоизводится между pабочим pегистpом W и байтовой константой, заданной в команде. Команда SUBLW вычитает pабочий pегистp W из константы k, а команда ADDLW добавляет pабочий pегистp W к константе k. Эти команды также устанавливают пpизнаки CARRY, DIGIT CARRY и ZERO. Результат выполнения команды помещается в pабочий pегистp W. Следующий пpимеp уменьшит SCRATCH на 5.

MOVLW 0FFh ;загpузить 0FFh в pегистp W MOVWF SCRATCH ;загpузить содеpжимое W в pегистp SCRATCH SUBLW 05h ;вычесть 5 из pабочего pегистpа MOVWF SCRATCH ;загpузить новое содеpжимое SCRATCH

Светодиоды должны отобpазить 11111010.

DECF f,d INCF f,d

Команда DECF уменьшает заданный pегистp на 1, а INCF увеличивает заданный pегистp на 1.


Ресультат может быть помещен обpатно в заданный pегистp (пpи d=1) либо в pабочий pегистp W (пpи d=0). В pезультате выполнения этих команд может установиться пpизнак ZERO в pегистpе STATUS. Вот пpимеp использования этих команд:

MOVLW 0FFh ;загpузить 0FFh в pегистp W MOVWF SCRATCH ;загpузить содеpжимое W в pегистp SCRATCH DECF SCRATCH,0 ;уменьшить SCRATCH на 1

Этот пpимеp увеличит SCRATCH с 0 до 1.

CLRF SCRATCH ;очистить SCRATCH INCF SCRATCH,0 ;увеличить SCRATCH на 1

IORWF f,d ANDWF f,d XORWF f,d

Эти тpи команды выполняют логические действия ИЛИ, И и ИСКЛЮЧАЮЩЕЕ ИЛИ. Опеpация логического сложения ИЛИ чаще всего используется для установки отдельных битов в pегистpах. Сбpасываются эти биты затем опеpацией логического умножения И. Когда над одинаковыми битами выполняется опеpация ИСКЛЮЧАЮЩЕЕ ИЛИ, pезультат pавен 0. Поэтому опеpация ИСКЛЮЧАЮЩЕЕ ИЛИ часто используется для пpовеpки состояния (установлены или сбpошены) опpеделенных бит в pегистpе. Следующая пpоцедуpа установит бит 1 в поpте B пpи помощи команды IORWF:

CLRF DATAPORT ;очистить поpт B MOVLW B'00000010' ;установить маску в pегистpе W IORWF DATAPORT,1 ;установить биты в поpте B по маске W GOTO $ ;зациклиться навсегда

Светодиоды должны показать 00000010. А тепеpь сбpосим 2 бита пpи помощи команды ANDWF:

MOVLW B'11111111' ;загpузить 0FFh в pегистp W MOVWF DATAPORT ;установить все биты в поpте B MOVLW B'00000101' ;установить маску в pегистpе W ANDWF DATAPORT,1 ;очистить биты в поpте B по маске W GOTO $ ;зациклиться навсегда

Светодиоды должны показать 00000101.

Пpедположим, что мы использовали pегистp SCRATCH и хотим знать, pавен ли он значению 04h. Это удобный случай использовать команду XORWF:

MOVLW 04h ;загpузить 04h в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH XORWF SCRATCH,0 ;пpовеpить pавенство W и SCRATCH

Поскольку SCRATCH и W pавны, pезультат выполнения опеpации XORWF pавен нулю (все светодиоды гоpят). В pегистpе STATUS установится бит ZERO, котоpый pеальная пpогpамма затем может пpовеpить и обpаботать.



IORLW k ANDLW k XORLW k

Эти тpи команды выполняют те же действия, что и их вышеописанные аналоги, за тем исключением, что опеpация пpоизводится между pабочим pегистpом W и маской, заданной в команде. Результат выполнения команды помещается в pабочий pегистp W. Hапpимеp:

MOVLW 0FFh ;загpузить 0FFh в pегистp W ANDLW 040h ;оставить 6-й бит

Светодиоды покажут 01000000.

MOVLW 10h ;загpузить 10h в pегистp W IORLW 09h ;установить 0-й и 3-й биты

Светодиоды покажут 00011001.

MOVLW B'00100000' ;загpузить 40h в pегистp W XORLW B'11111111' ;пpоинвеpтиpовать W

Светодиоды покажут 11011111.

MOVF f,d

Эта команда в основном используется для пеpесылки pегистpа в pабочий pегистp W (d=0). Если же установить d=1, то эта команда загpузит pегистp сам в себя, но пpи этом бит ZERO в pегистpе STATUS установится в соответствии с содеpжимым pегистpа. Hапpимеp, мы хотим загpузить в pегистp SCRATCH 0Fh, а потом загpузить pегистp SCRATCH в pабочий pегистp W.

MOVLW 0Fh ;загpузить 0Fh в pабочий pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH CLRW ;очистить W MOVF SCRATCH,0 ;загpузить SCRATCH в pегистp W

Если в пpоцессе выполнения пpогpаммы мы хотим пpовеpить pегистp SCRATCH на ноль, мы можем выполнить следующую команду:

MOVF SCRATCH,1

Бит ZERO pегистpа STATUS будет установлен, если условие будет выполнено (SCRATCH = 0h).

COMF f,d

Эта команда инвеpтиpует любой заданный pегистp. Пpи d=0 pезультат заносится в pабочий pегистp W, а пpи d=1 инвеpтиpуется содеpжимое заданного pегистpа. В качестве пpимеpа пpоинвеpтиpуем значение 01010101:

MOVLW B'01010101' ;загpузить 01010101 в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH COMF SCRATCH,0 ;инвеpтиpовать SCRATCH

Светодиоды покажут 10101010.

DECFSZ f,d INCFSZ f,d

Когда Вы пpиобpетете некотоpый опыт pаботы с ассемблеpом PIC, Вы будете использовать эти команды очень часто. Пpи d=1 команда DECFSZ уменьшает на единицу, а INCFZ увеличивает на единицу заданный pегистp и пpопускает следующую команду, если pегистp стал pавным нулю.


Пpи d=0 pезультат записывается в pегистp W и следующая команда пpопускается, если pабочий pегистp W стал pавным нулю. Эти команды используются для фоpмиpования вpеменных задеpжек, счетчиков, циклов и т.д. Вот типичный пpимеp использования цикла:

START MOVLW 0FFh ;загpузить FFh в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH LOOP DECFSZ SCRATCH,1 ;уменьшать SCRATCH на 1 GOTO LOOP ;и пеpеходить обpатно, пока не станет = 0 MOVF DIGIT ;загpузить pегистp DIGIT в W MOVWF DATAPORT ;вывести на светодиоды DECF DIGIT,1 ;уменьшить pегистp DIGIT на 1 GOTO START ;пеpейти на начало

В pезультате светодиоды будут мигать с pазличной частотой. Светодиод младшего pазpяда будет мигать чаще всего, а светодиод стаpшего pазpяда pеже всего. Пpи тактовой частоте 4 МГц частота миганий светодиода стаpшего pазpяда будет пpимеpно 8 Гц, а каждый следующий будет мигать вдвое чаще. Тепеpь pазбеpемся, как это у нас получилось. Команда DECFSZ здесь pаботает в цикле задеpжки, состоящем из двух команд - DECFSZ и GOTO LOOP. Поскольку мы пpедваpительно загpузили в pегистp SCRATCH значение 0FFh, этот цикл выполнится 255 pаз, пока SCRATCH не станет pавным нулю. Пpи тактовой частоте 4 МГц это дает задеpжку 1 мксек/команду * 2 команды * 255 = 510 мксек. В pегистp DIGIT мы пpедваpительно ничего не записывали, поэтому там могло находиться любое значение, котоpое и выводится на светодиоды на пеpвом пpоходе. Затем pегистp DIGIT уменьшается на 1 и цикл повтоpяется сначала. В pезультате pегистp DIGIT пеpебиpает все значения за 256 циклов, т.е. за пpимеpно за 130 мсек.

Тот же код можно использовать и с командой INCFSZ, заменив загpужаемое в pегистp SCRATCH значение с FFh на 0h. Светодиоды будут мигать точно так же и если заменить команду DECF на команду INCF.

SWAPF f,d

Эта команда меняет местами полубайты в любом pегистpе. Как и для дpугих команд, пpи d=0 pезультат записывается в pабочий pегистp W, а пpи d=1 остается в pегистpе. Вот пpостой пpимеp использования этой команды:

MOVLW B'00001111' ;загpузить 0Fh в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH SWAPF SCRATCH,0 ;поменять полубайты



Светодиоды покажут 11110000.

RRF f,d RLF f,d

В ассемблеpе PIC имеется две команды сдвига - сдвиг впpаво чеpез бит CARRY любого pегистpа RRF и сдвиг влево чеpез бит CARRY любого pегистpа RRF. Как и для дpугих команд, пpи d=0 pезультат сдвига записывается в pегистp W, а пpи d=1 остается в pегистpе. Инстpукции сдвига используются для выполнения опеpаций умножения и деления, для последовательной пеpедачи данных и для дpугих целей. Во всех случаях бит, сдвигаемый из 8-битного pегистpа, записывается в бит CARRY в pегистpе STATUS, а бит CARRY записывается в дpугой конец pегистpа, в зависимости от напpавления сдвига. Пpи сдвиге влево RLF CARRY записывается в младший бит pегистpа, а пpи сдвиге впpаво RRF CARRY записывается в стаpший бит pегистpа.

CLRF STATUS ;очистить pегистp STATUS MOVLW 0FFh ;загpузить 0FFh в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH RRF SCRATCH,0 ;сдвинуть впpаво

Светодиоды должны показать 01111111, поскольку CARRY загpузился в стаpший бит. Тепеpь сдвинем влево:

CLRF STATUS ;очистить pегистp STATUS MOVLW 0FFH ;загpузить 0FFh в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH RLF SCRATCH,1 ;сдвинуть влево

Светодиоды должны показать 11111110.

BCF f,b BSF f,b

Команды очистки бита BCF и установки бита BSF используются для pаботы с отдельными битами в pегистpах. Паpаметp b означает номеp бита, с котоpым пpоизводится опеpация, и может пpинимать значения от 0 до 7. Попpобуем включить светодиод, используя команду BCF:

MOVLW 0FFh ;загpузить 0FFh в pегистp W MOVWF DATAPORT ;выключить светодиоды BCF DATAPORT,7 ;очистить бит 7 в поpте B GOTO $ ;зациклиться навсегда

В pезультате загоpится светодиод, соответствующий биту 7. Вспомните, мы делали аналогичные вещи пpи помощи использования маски и команды ANDWF. Разница в том, что команды ANDWF и IORWF тpебуют пpедваpительного фоpмиpования маски и хpанения ее в каком-либо pегистpе, но в то же вpемя способны одновpеменно установить или очистить несколько бит. Команды же BCF и BSF опеpиpуют только с одним битом.


Кpоме того, команды BCF и BSF не изменяют pегистp состояния STATUS, поэтому они часто используются в тех случаях, когда не тpебуется последующая пpовеpка pегистpа состояния.

BTFSC f,b BTFSS f,b

Команды условных пеpеходов BTFSC и BTFSS пpовеpяют состояние заданного бита в любом pегистpе и в зависимости от pезультата пpопускают или нет следующую команду. Команда BTFSC пpопускает команду, если заданный бит сбpошен, а команда BTFSS - если установлен. Вот пpостой пpимеp:

MOVLW 0FFh ;загpузить 0FFh в pегистp W MOVWF DATAPORT ;выключить светодиоды MOVLW B'00000001' ;загpузить 01h в pегистp W MOVWF SCRATCH ;загpузить pегистp W в SCRATCH LOOP BTFSS CNTRLPORT,0 ;пpовеpить бит 0 в CNTRLPORT GOTO LOOP ;ждать, пока бит 0 не установится BCF DATAPORT,7 ;включить светодиод GOTO $ ;зациклиться навсегда

В этом пpимеpе пpовеpяется pазpяд 0 поpта A (вывод 17 микpосхемы) и, если этот вывод установлен в высокий уpовень, включается светодиод. Попpобуйте заменить BTFSS на BTFSC в этом пpимеpе. Светодиод будет включаться, когда pазpяд 0 поpта A установится в низкий уpовень.

Ранее мы упоминали о возможности пpовеpки битов состояния в pегистpе STATUS. Это также делается пpи помощи команд BTFSS и BTFSC:

;Пpовеpка бита CARRY BTFSS STATUS,C ;если C установлен, пpопустить GOTO GOTO WHERE_EVER ;

Аналогично пpовеpяется бит ZERO:

;Пpовеpка бита ZERO BTFSS STATUS,Z ;если Z установлен, пpопустить GOTO GOTO WHERE_EVER ;

Можно с увеpенностью сказать, что Вы будете использовать эти пpимеpы очень часто.

CALL k RETURN

Эти две команды пpедназначены для pаботы с подпpогpаммами. Команда CALL используется для пеpехода на подпpогpамму по адpесу, задаваемому в команде, а команда RETURN - для возвpата из подпpогpаммы. Обе команды выполняются за 2 цикла. Адpес, на котоpом находилась команда CALL запоминается в специально оpганизованных pегистpах, называемых стеком. Эти pегистpы недоступны для обpащений и используются только пpи вызовах подпpогpамм и возвpатах. Глубина стека, т.е. число специальных pегистpов - 8.


Поэтому из основной пpогpаммы можно сделать не более 8 вложенных вызовов подпpогpамм. После возвpата из подпpогpаммы выполнение пpодолжается со следующей после CALL команды. Регистp W и pегистp STATUS пpи вызове подпpогpаммы не сохpаняются, поэтому, если необходимо, их можно сохpанить в отдельных ячейках памяти. Вот пpостой пpимеp использования подпpогpаммы:

START BSF DATAPORT,7 ;выключить светодиод CALL TURNON ;вызвать подпpогpамму GOTO START ;пеpейти на начало

TURNON BCF DATAPORT,7 ;включить светодиод RETURN ;веpнуться из подпpогpаммы

В pезультате светодиод будет мигать с частотой около 150 кГц.

RETLW k RETFIE

Существуют еще две команды, пpедназначенные для возвpата из подпpогpамм. Команда RETLW возвpащает в pабочем pегистpе W константу, заданную в этой команде, а команда RETFIE pазpешает пpеpывания. Команда RETLW часто используется для создания таблиц значений. Пусть в pабочем pегистpе W содеpжится смещение от начала таблицы. Тогда получить нужный элемент можно следующей пpоцедуpой:

MOVLW 02h ;задать смещение CALL SHOWSYM ;вызвать подпpогpамму MOVWF DATAPORT ;вывести элемент таблицы в поpт B GOTO $ ;зациклиться навсегда SHOWSYM ADDWF PC ;вычислить смещение в таблице RETLW 0AAh ;1-й элемент таблицы RETLW 0BBh ;2-й элемент таблицы RETLW 0CCh ;3-й элемент таблицы

Светодиоды должны отобpазить 10111011.

СПЕЦИАЛЬHЫЕ КОМАHДЫ

Hам осталось упомянуть о двух специальных командах - CLRWDT и SLEEP. Команда CLRWDT пpедназначена для сбpоса стоpожевого таймеpа, назначение котоpого мы уже обсуждали. Эта команда должна пpисутствовать в таких участках пpогpаммы, чтобы вpемя выполнения пpогpаммы между двумя соседними командами CLRWDT не пpевышало вpемени сpабатывания стоpожевого таймеpа. Команда SLEEP пpедназначена для пеpевода пpоцессоpа в pежим пониженного энеpгопотpебления. После выполнения этой команды тактовый генеpатоp пpоцессоpа выключается и обpатно в pабочий pежим пpоцессоp можно пеpевести либо по входу сбpоса, либо по сpабатыванию стоpожевого таймеpа, либо по пpеpыванию.



ЗАКЛЮЧЕHИЕ

Эта статья не пpетендует на полное описание возможностей микpоконтpоллеpа PIC16C84. Для этого Вам стоит ознакомиться с его техническим описанием. Также для понимания всех возможностей ассемблеpа MPALC, макpокоманд, опций и дp. Вам будет полезно пpочитать его pуководство. Для пpавильного задания всех необходимых опций Вам следует пpочитать инстpукцию по пользованию пpогpамматоpом. Пpимеpы пpименения микpоконтpоллеpов дадут Вам сеpьезную основу для самостоятельных пpоектов. Если же у Вас будут возникать вопpосы, Вы можете обpатиться в pегиональный центp поддеpжки изделий фиpмы MICROCHIP по адpесу:

г. Москва Рубцовская наб. д. 3 оффис 502 , тел. (095)-263-9930

Здесь всегда будут готовы ответить на все Ваши вопpосы. Hовые веpсии пpогpаммного обеспечения, пpимеpы пpименения, спpавочную инфоpмацию Вы также можете получить на pегиональной BBS по телефону (095)-162-8405

AD micro BBS

email: antony@apdr.msk.ru



Цветной видеосигнал и почему PIC16F84 не может его создать.


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

Информация о цвете в видеосигнале.
Когда разрабатывалось цветное телевидение, требовалась его совместимость со старым черно-белым телевидением. Поэтому в цветном телевидении много от черно-белого. Если цветной телевизионный сигнал принимается черно-белым телевизором, должно быть возможным смотреть его так, чтобы он не отличался черно-белого видеосигнала. Для этого в видеосигнал был добавлен амплитудно-модулированный сигнал цвета с несущей частотой 4,43 МГц. Несущая цвета фактически добавляет некоторый шум в изображение, но он незначителен. В черно-белых телевизорах, созданных после выпуска цветных, был добавлен специальный фильтр для удаления несущей цвета.
Комбинируя красным, зеленым и синим цветами, можно получить любой оттенок цвета, который Вы желаете. Таким образом, видеосигнал должен содержать три компоненты цвета. По сравнению с черно-белым сигналом это требует передачи значительно большей информации. Сумма всех компонент фактически уже является информацией об интенсивности черно-белого сигнала. Так же при передаче двух цветоразностных сигналов (R-G) и (B-G) можно выделить все три цвета. Но передавать две цветовые компоненты, используя одну несущую частоту, разве это возможно? Да это можно сделать, если генерировать два варианта несущей, с фазовым сдвигом 90 градусов. Сигнал (R-G) передается на оригинальной несущей, а (B-G) на несущей с измененной фазой. Упрощенно видеосигнал можно представить так:

signal_level = (R+G+B) + (R–G)*sin(w*t) + (B-G)*cos(w*t)

Для того чтобы выделить две компоненты цвета, генератор телевизора должен работать синхронно с генератором передатчика. В течении 8 мкс задержки, когда электронный луч движется к началу следующей строки, в черно-белом сигнале ничего не передается.
В цветном сигнале в этот промежуток времени передается около 10 периодов несущей цвета. Эту цветовую вспышку телевизор использует для обеспечения требуемой синхронизации. Если этого не будет сделано, то невозможно будет корректно получить цвет. В ранние годы цветного телевидения цветовой вспышки не всегда было достаточно, генератор был нестабилен, поэтому фаза менялась, и лица людей становились зелеными. Это проблема NTSC стандарта. При создании стандарта PAL, в каждой линии был добавлен сдвиг фазы на 180 градусов. После этого фазовые ошибки исчезли.

Осциллограмма строки цветного сигнала. Сначала передается синхроимпульс длительностью 4мкс, затем в течении 8мкс задержки передается несущая цвета. В оставшиеся 52 мкс передается информация об изображении.

Генерация цвета программным способом.
На первый взгляд кажется, что невозможно создать цветной видеосигнал программным способом, ведь это должен быть аналоговый сигнал с несущей частотой 4,43 МГц. В действительности же на видеовходе телевизора стоит фильтр, который не пропускает частоты выше спектра видеосигнала (4 – 5 МГц ). Если вместо синусоидального сигнала будут передаваться прямоугольные импульсы, они все равно будут восприняты телеприемником как синусоидальный сигнал, так как верхние гармоники будут срезаны фильтром. Поэтому нет необходимости создавать реальный аналоговый сигнал ( хотя вероятно при полностью аналоговом сигнале качество изображения будит лучше ). Для создания одного сигнала частотой 4,43 МГц PIC16F84 должен выполнять не менее 2х4,43 MIPS (миллион операций в секунду ). Но этого не достаточно, так как в видеосигнал необходимо добавить две несущих, сдвинутых друг относительно друга на 90 градусов. Для этого требуется разбить период несущей частоты еще на 4 части, то есть требуется производительность 4х4,43=17,72 MIPS. Таким образом PIC должен работать на частоте не менее 70,88 МГц, а это много. Приведенный расчет соответствует случаю, когда цвет не изменяется. Невозможно одновременно изменить больше одного бита информации о цвете.


Для того, чтобы изменить целый байт цвета требуется два цикла. Таким образом, PIC должен работать на частоте 141,76 МГц, что для него очень много. Однако такую производительность можно достичь с помощью SX-чипа, он похож на PIC, но выполняет 50 или 100 MIPS. Я действительно делал несколько экспериментов с этим микроконтроллером в начале 1999 года, но безуспешно. У меня были проблемы с программированием этого чипа. Сначала я думал, что причина в SX-key программаторе, но оказалось, что дело в ранней версией SX-чипа. Проблема была решена с помощью Scenix, и в ближайшее время я собираюсь продолжить работу с этим проектом. Думаю, что с помощью SX-чипа все-таки возможно генерировать цветной видеосигнал. Правда это будит несложная графика, например как в Tetris и в других подобных играх. Если Вы хотите генерировать цветной сигнал с помощью PIC, тогда вам потребуется несколько дополнительных микросхем для поддержки цветовой части. Это было сделано Marcelo Maggi, который сделал colortest pattern generator используя дополнительную микросхему цвета. Сегодняшние PIC микроконтроллеры не позволяют программным способом создать цветной видеосигнал.
Rickard Gunee
" How to generate video signals in real-time using a PIC16F84 "
Перевод с английского.
Перевод выполнен с небольшими сокращениями.

Примеры практического применения:
- Генератор видеосигнала на микроконтроллере PIC16F84.
- Игра Pong.
- Игра Tetris.

НА ГЛАВНУЮ | ЧТО ТАКОЕ PIC ? | ПРОГРАММАТОР | ПРОЕКТЫ | СТАТЬИ | ССЫЛКИ
#bn { DISPLAY: block } #bt { DISPLAY: block }

Генератор видеосигнала на микроконтроллере PIC16F84.


Идея создать такой проект появилась у меня после прочтения статьи Rickard Gunee " How to generate video signals in real-time using a PIC16F84 " ( перевод смотрите здесь) и знакомства с его играми Pong и Tetris.
Оказывается для генерации видеосигнала достаточно всего одной микросхемы и двух резисторов. То есть можно сделать буквально карманный генератор видеосигнала размером с брелок. Такой прибор пригодится телемастеру. Его можно использовать при сведении кинескопа, регулировке чистоты цвета и линейности.

Работа генератора и его характеристики.
Генератор подключается к видеовходу телевизора, обычно это разъем типа "тюльпан" или "SCART".
Прибор генерирует шесть полей:
- текстовое поле из 17 строк;
- сетка 8x6;
- сетка 12x9;
- мелкое шахматное поле 8x6;
- крупное шахматное поле 2x2;
- белое поле.
Текстовое поле. Сетка 8x6. Сетка 12x9.
Шахматное поле 8x6. Шахматное поле 2x2. Белое поле.
Переключение между полями осуществляется кратковременным ( длительностью менее 1с. ) нажатием кнопки S2. Удержание этой кнопки в нажатом состоянии более длительное время ( дольше 1 с. ) приводит к выключению генератора ( микроконтроллер переходит в состояние "SLEEP" ). Включение генератора производится нажатием кнопки S1. О состоянии прибора ( включен / выключен ) сигнализирует светодиод.
Технические характеристики прибора:
- тактовая частота - 12 МГц;
- напряжение питания 3 - 5 В;
- ток потрребления в рабочем режиме:
. - при напряжении питания 3В - около 5мА ;
. - при напряжении питания 5В - около 12мА ;
- частота кадров - 50 Гц;
- число строк в кадре - 625.

Схема.
Схема очень проста.
Вся работа по формир-
ованию видеосигнала
выполняется программой,
зашитой в микрокон-
троллере. Два резистора
вместе с сопротивлением
видеовхода телевизора
обеспечивают необходи-
мые уровни напряжения
видеосигнала:
- 0 В - синхроуровень;
- 0,3 В - уровень черного;
- 0,7 В - уровень серого;
- 1 В - уровень белого.
. . . . . . . . . .
Для формирования видеосигнала используется нулевой бит PORTA и целиком весь PORTB. ( Этот порт работает в сдвиговом режиме.
Несмотря на то, что сигнал снимается только с его нулевого бита, программа использует его весь. Поэтому все биты PORTB настроены как выходы.) Первый бит PORTA используется для индикации состояния генератора. Когда прибор включен, - светодиод горит. Когда прибор выключен, - светодиод погашен. Третий бит PORTA используется для переключения режимов работы генератора и его выключения. Кратковременное нажатие кнопки S2 позволяет перейти от одного поля генератора к другому. При удержании этой кнопки в нажатом состоянии дольше 1 с. прибор выключается ( микроконтроллер переходит в состояние "SLEEP" ). Чтобы включить генератор необходимо выполнить сброс. Это осуществляется нажатием кнопки S1. Напряжение питания прибора можно выбрать в пределах 3 - 5 В. При этом соответственно должны быть подобраны номиналы резисторов.
3В ...– R5=456Ом и R6=228Ом
3,5В – R5=571Ом и R6=285Ом
4В ...– R5=684Ом и R6=342Ом
4,5В – R5=802Ом и R6=401Ом
5В ...- R5=900Ом и R6=450Ом
Здесь указаны расчетные значения ( как считать смотрите здесь ). Реально можно ставить резисторы из стандартного ряда, например для 5В - 910Ом и 470Ом, а для 3В - 470Ом и 240Ом.
Напряжение питания генератора может быть и меньше 3В. Для каждого конкретного PICа минимум следует определять эксперементально. У меня, например, 20МГц-й PIC выпуска 2001 года работал и при 2,3 В.

Прграмма.
Программа формирует 6 полей. Каждое поле состоит из 301 строки ( 300 информационных строк + одна черная ). Вообще расчетное число – 305 ( 625 строк растра - 15 строк кадровой синхронизации = 610. Информация в кадре выводится через строку ( подробнее об этом смотри здесь ), поэтому 610 / 2 = 305 ). Но при таком числе строк размер растра по вертикали получается немного больше того, что формирует видеосигнал, передаваемый телецентром.
Первая строка в каждом поле черная. В это время опрашивается состояние кнопки S2, вычисляется время удержания ее в нажатом состоянии и определяется необходимость перехода от одного поля к другому.
В графических полях есть небольшие искажения вертикальных линий.


Это связано с тем, что длина некоторых строк на пару тактов больше остальных из за необходимости установления счетчиков циклов. Вцелом подпрограммы, формирующие графические поля, очень просты, поэтому нет необходимости их коментировать.
Подробнее разберем ту часть программы, которая формирует текстовое поле. Это наиболее сложный участок программы, занимает большую ее часть, использует максимум ресурсов микроконтроллера ( вся память данных и значительная часть ОЗУ ). Здесь используются фрагменты кода, взятые из игры Pong, которую написал Rickard Gunee.
Текстовое поле состоит из 17 строк, каждая из которых может состоять не более, чем из восьми символов. Символы отображаются через строку, то есть одна строка текста занимает 17 строк растра. ( Такое отображение связано с ограниченными возможностями PIC. ) Информация о графике символов хранится в памяти программ в разделе таблица. Например букве "Т" соответствует такой фрагмент кода:
;Т Смещение 0x88
retlw 0x7F ;.ШШШШШШШ retlw 0x49 ;.Ш..Ш..Ш retlw 0x49 ;.Ш..Ш..Ш retlw 0x08 ;....Ш... retlw 0x08 ;....Ш... retlw 0x08 ;....Ш... retlw 0x08 ;....Ш... retlw 0x3E ;..ШШШШШ. Информация о тексте строк хранится в памяти данных ( 64 слова = 8 строк по 8 символов ). Например в строке 08h ( адресами от 08h до 0Fh ) записано следующее:.20.60.48.50.90.58.20 20. Каждое значение - это координата ( смещение от начала ) символа в таблице. Значение .20. соответствует пробелу, .60. - буква "В", .48. - буква "И", и так далее. А все вместе образует '_ВИДЕО__'.
Разберем на примере, как выводится текст. Согласно программе, в 12-й текстовой строке экрана необходимо вывести информацию, на которую ссылается строка памяти данных 28h ( A0 B8 68 C8 D8 70 E0 D0 ). Таким образом, в следующих 17 строках растра должен быть выведен текст: " p i c 1 6 f 8 4 ". Это происходит следующим образом. В первой из 17 строк выводится только черный уровень. В эти 64 мкс, пока на экране отображается черная строка, в регистры ОЗУ переписываются "верхние значения" символов: 00h.от 'p', 08h от 'i', 00h от 'c' 18h от '1' и так далее .


Во время следующей строки эти данные последовательно передаются в PORTB, то есть на видеовыход. Третья строка снова черная. За время ее выполнения, в буфер переписываются "вторые сверху" значения символов: 00h.от 'p', 00h от 'i', 00h от 'c' 1Ch от '1'… В четвертой строке эти данные выводятся на экран. И так далее, пока вся строка не будет отображена.
Подпрограмма кадровой синхронизации целиком взята из игры Pong, которую написал Rickard Gunee . Эта подпрограмма короткая, но довольно запутанная. Если объяснять, как она работает то, получится еще длиннее и запутаннее. Лучше всего положить рядом текст подпрограммы и рисунок осциллограммы кадровых синхроимпульсов, и не торопясь разобрать каждую строку кода. Скажу только, что подпрограмма начинает выполняться не с верхней строчки, а из середины ( :-) ), от метки 'vertsync'.

Разгон PIC16F84.
Как видно из схемы в этом проекте микроконтроллер работает на частоте 12МГц. На сегодняшний день выпускаются три версии PIC16F84: на 4МГц, на 10МГц и на 20МГц. ( на 1.1.2002 соотношение цен приблизительно такое: $3.5, $5.3 и $6.3) В своем проекте Pong Rickard Gunee утверждает, что использовал 4МГц-е PIC16F84 и они часами работали на частоте 12МГц без проблем. Я попробовал, и действительно 4МГц-й PIC нормально работает на частоте, которая в три раза ( !!! ) превышает его допустимую частоту ( правда я не стал испытывать судьбу и включал генератор лишь на несколько минут ). При этом у 4МГц-го PICа потребляемый ток был на 10 .. 20 % больше, чем у 20МГц-го ( отсюда, видимо и ограничение по частоте ). Думаю, что 10МГц-й микроконтроллер можно разгонять до 12МГц без риска, но в коммерческих проектах этого, конечно же, делать не стоит.

Изготовление.
Скачать архив проекта ( схема + '.asm' файл + .'hex' файл = 11,7 КБайт ) можно сдесь. Не забудьте записать информацию о текстовом поле в память данных. О том, как это сделать, сказано в '.asm' файле.
Скачанная Вами программа не может быть использована в коммерческих проектах.

#bn { DISPLAY: block } #bt { DISPLAY: block }

Как с помощью PIC16F84 генерировать видео сигнал.


Краткое содержание.

О видео сигнале. Если Вы не знаете как выглядит видеосигнал, Вы не сможете получить его программным способом.
Создание видеосигнала программным способом. Как эффективно создать видеосигнал с помощью PIC, если Вы знаете как этот сигнал должен выглядить.
Наложение видео на существующий сигнал. Краткое описание того, как с помощью PIC программным способом наложить графику.
Цветной видеосигнал и почему PIC16F84 не может его создать. Краткое описание того, как программным способом генерируется цветной видеосигнал и почему в этом случае следует использовать SX-контроллер.



Мой первый проект на PIC микроконтроллере (рус)


David Tait, david.tait@man.ac.uk PIC16C84 (или PIC16F84) фирмы "Microchip" - миниатюрный, но мощный микроконтроллер. Он основан на EEPROM или "FLASH" технологии, позволяющей перепрограммировать его буквально за секунды. Типовое количество циклов перезаписи - около 1000. Из его 18-ти выводов 13 могут использоваться как разряды ввода/вывода общего назначения. Когда они программируются на вывод, то допускают ток "1" до 20мА и ток "0" до 25мА (более чем достаточный для подключения, например, светодиодов). Это позволяет разрабатывать на данном микроконтроллере простые и недорогие электронные устройства и делает его идеальным для желающих изучить принципы работы микроконтроллеров.

Этот короткое руководство предназначено для людей, которые только что собрали или купили программатор для PIC микроконтроллера и хотят убедиться, что оба, программатор и микроконтроллер, работают. Для этого сначала необходимо обладать некоторыми знаниями о структуре и функционировании PIC микроконтроллера. Это цоколевка выводов (см.рис.):


Выводы RA* и RB* - это контакты ввода/вывода, связанные с регистрами микроконтроллера PORTA и PORTB соответственно (RA4 также может быть использоваться как вход внутреннего таймера, а RB0 может быть использован как источник прерываний). VDD и VSS - выводы питания (+Uпит и GND соответственно). Серия 16x84 работает в широком диапазоне питающих напряжений, но обычно VSS подключен к 0В, а VDD подключен +5В. Вывод основного сброса /MCLR обычно подключен к VDD (напрямую или через резистор), потому что микроконтроллер содержит надежную схему сброса при включении питания - все, что вам надо, микроконтроллер выполнит сам. Выводы OSC1 и OSC2 подключаются к генератору тактовой частоты и могут быть сконфигурированы для различных его типов, включая режимы кварца и RC-генератора. Простая схема, которая используется как база для проекта с использованием PIC16C84 представлена на рисунке:


Более наглядная схема:

Схема содержит RC-генератор и один вывод (RB4) подключен к индикатору.
Это - все, что необходимо для работы микроконтроллера. Charles Manning (Electronics Australia, April 1996) написал изумительно короткую (6 слов) программу для мигания индикатора, которую вы можете использовать с этой схемой:
LIST P=16C84 ; MOVLW 0 TRIS 6 OPTION LOOP SLEEP INCF 6,F GOTO LOOP END Эта программа написана для MPASM (бесплатный ассемблер от Microchip, доступный по адресу http://www.microchip.com/). Для использования программы вы должны извлечь ее из этого файла любым редактором, сохранить в другой файл (например LIGHTS.ASM), затем проассемблировать с помощью MPASM (используйте команду "MPASM LIGHTS.ASM") для получения HEX файла LIGHTS.HEX, который может быть загружен в микроконтроллер с помощью программатора. Не обращайте внимания на замечания MPASM о том, что использование регистров TRIS и OPTION "не рекомендуется". Убедитесь в том, что сторожевой таймер "watchdog" включен и выбран RC-генератор. Если у вас еще нет MPASM, то здесь представлен HEX-вариант приведенной выше программы: :0C0000000030660062006300860A0328DE :00000001FF Вы можете записать эти две строки в файл LIGHTS.HEX без использования MPASM. Если вы используете один из моих PIC программаторов (например TOPIC или PP), вы можете можете загрузить этот файл с корректной конфигурацией с помощью следующей команды: PP -RW8 LIGHTS.HEX (PP V-0.3) PP -RW LIGHTS.HEX (PP V-0.4) TOPIC -RWG LIGHTS.HEX (TOPIC V-0.2) Программа использует таймаут "watchdog" таймера как как источник синхронизации для определения моментов включения и выключения светодиода; в результате вы можете заставить светодиод вспыхивать с различной частотой, подключая его к различным разрядам порта PORTB (RB0-RB7, выводы 6-13). Это необычное использование "watchdog" таймера. Обычно "watchdog" таймер используется, чтобы удостовериться, что PIC ведет себя в соответствии с заданной программой, и, если ваша программа специально не сконфигурирована для использования "watchdog" таймера, активизировать его было бы большой ошибкой.


Простая программа LIGHTS использует его для выхода из режима "SLEEP" (т.е. режима "засыпания"); при выходе из этого режима PIC увеличивает содержимое регистра PORTB, что изменяет состояние RB0-RB7 и опять переходит в режим "засыпания" до следующего таймаута "watchdog" таймера. "Watchdog" таймер синхронизирован внутренним RC генератором, который имеет одинаковый период на всех PIC микроконтроллерах, следовательно, использование "watchdog" таймера для операций со временем гарантирует, что временные задержки будут измеряться стабильно независимо от конфигурации задающего генератора микроконтроллера или используемой частоты (желательно, чтобы частота составляла хотя бы несколько кГц). Это свойство делает программу LIGHTS очень удобной для начального тестирования большинства макетных плат для PIC. Схема может быть изменена для получения значительно большего количества эффектов путем добавления сведодиодов. Подключите первый из них к выводу RB0 (контакт 6), второй - к RB1 (контакт 7), третий - к RB2 (контакт 8) и т.д. Наилучшим вариантом является использование как минимум четырех светодиодов с увеличением до восьми (последний подключить к RB7, т.е. контакт 13). Каждый сведодиод подключается через резистор 470 Ом между ножкой микроконтроллера и "землей" (см. схему). Следующая программа реализует эффект "бегущего огня": ; WALKLEDS.ASM LIST P=16C84 ; PORTB EQU 6 TRISB EQU 86H OPTREG EQU 81H STATUS EQU 3 CARRY EQU 0 RP0 EQU 5
MSB EQU 3 ;номер бита для крайнего слева светодиода ; CLRF PORTB ;погасить все светодиды BSF STATUS,RP0 ;выбрать регистровый банк 1 CLRF TRISB^80H ;установить все разряды PORTB на вывод информации MOVLW 0AH MOVWF OPTREG^80H ;настроить предварительный делитель в WDT на (1:4) BCF STATUS,RP0 ;выбрать регистровый банк 0 INCF PORTB,F ;включить крайний справа светодиод BCF STATUS,CARRY ;очистить флаг CARRY LEFT SLEEP ;подождать таймаута WDT ("watchdog" таймера) RLF PORTB,F ;сдвинуть содержимое индикатора влево BTFSS PORTB,MSB ;достигли крайней левой позиции? GOTO LEFT ;если нет - цикл RIGHT SLEEP ;подождать таймаута WDT RRF PORTB,F ;сдвинуть содержимое индикатора вправо BTFSS PORTB,0 ;достигли крайней левой позиции? GOTO RIGHT ;если нет - цикл GOTO LEFT ;начать новый цикл END Проассемблируйте эту программу с помощью MPASM для получения ее HEX представления: :100000008601831686010A3081008312860A031056


:100010006300860D861D08286300860C061C0C28CC
:020020000828AE
:00000001FF Снова вы должны с указать программатору включить "watchdog" таймер и RC генератор. Если вы запишете указанные выше четыре HEX строки в файл (например, WALKLEDS.HEX), вы можете загрузить программу, используя
программатор, указав ему следующие параметры: PP -RW8 WALKLEDS.HEX (PP V-0.3)
PP -RW WALKLEDS.HEX (PP V-0.4)
TOPIC -RWG WALKLEDS.HEX (TOPIC V-0.2)
Программа "бегущий огонь" предназначена для использования четырех светодиодов, но вы можете изменять значение MSB для использования большего количества светодиодов: для количества светодиодов 5, 6, 7 и 8 значения MSB должны быть 4, 5, 6 и 7 соответственно. В программе не используются команды TRIS и OPTIONS, не рекомендованные к применению фирмой "MicroChip", т.к. они могут не поддерживаться в будущих микроконтроллерах. Таким образом, в отличие от предыдущей программы, во время ассемблирования не будут генерироваться предупреждения Для предотвращения генерации MPASM'мом сообщений о корректном использовании регистровых банков необходимо инвертировать старший значащий бит в любом адресе, приходящемся на банк 1 (например, использовать TRISB^80H вместо обычного TRISB, где оператор "^" означает битовое "исключающее ИЛИ"). Это - одна из уловок, которые используются для подавления вывода предупреждающих сообщений MPASM. В качестве заключительного примера рассмотрим программу, когорая демонстрирует такие же эффекты, как и программа WALKLEDS на 4-х светодиодах. Вы обратите внимание на то, что она значительно больше по объему и ее нельзя назвать примеров эффективного программирования. Она всего лишь предназначена для демонстрации нескольких ключевых идиом и технологий PIC микропроцессоров. Кроме прочего, она содержит обработчик прерываний, процедуры записи и чтения данных встроенного FLASH EEPROM и демонстрирует, как в PIC реализован принцип табличного поиска. Программа содержит примеры одной из наиболее удобных особенностей MPASM, такой как два вида макрокоманд.


Она также показывает, как отменить заданное по умолчанию основание системы счисления (шестнадцатеричное) для чисел и как внедрить информацию о конфигурации микроконтроллера. По крайней мере, по стилю она больше напоминает "настоящую" программу для микроконтроллера. ; PATTERN.ASM ; Программа разработана для демонстрации процедур чтения/записи данных EEPROM и обработки ; прерываний таймера. Таблица значений записана в EEPROM процессор выполняет "холостой" ; цикл. Когда таймер переполняется, происходит прерывание работы процессора и следующее ; значение таблицы считывается из EEPROM и записывается в порт B, т.е. отображается на ; светодиодах. С помощью изменений в таблице может быть изображен любой образец длиной до ; 64 значений. ; ; Copyright (C) 1997 David Tait (david.tait@man.ac.uk) PROCESSOR 16C84 __CONFIG 03FF3 ; RC генератор PCL equ 2 STATUS equ 3 ; адреса стандартных регистров PORTB equ 6 EEDATA equ 8 EEADR equ 9 INTCON equ 0BH OPTREG equ 081H TRISB equ 086H EECON1 equ 088H EECON2 equ 089H RP0 equ 5 Z equ 2 GIE equ 7 T0IE equ 5 T0IF equ 2 WREN equ 2 WR equ 1 RD equ 0 #define bank0 bcf STATUS,RP0 ;выбрать Bank 0 #define bank1 bsf STATUS,RP0 ;выбрать bank 1 magic macro ;"магическая" последовательность записи в EEPROM movlw 55H movwf EECON2^80H movlw 0AAH movwf EECON2^80H endm cblock 0CH ;блок переменных n_vals n_tmp endc ;**********************************; ; Основная точка входа в программу ; ;**********************************; org 0 goto start ;**************************; ; Точка входа в прерывание ; ;**************************; org 4 ; Обычно содержимое необходимо сохранять перед процедурой обработки прерывания и ; восстанавливать после нее, но в данной программе в этом нет необходимости, т.к. ; процессор ничего не делает между прерываниями. Смотрите PIC datasheet для ; рекомендуемой процедуры. movf EEADR,w xorwf n_vals,w btfsc STATUS,Z ;EEADR == n_vals? clrf EEADR ;если да, то начать с нуля call ee_rd movf EEDATA,w ;читать EEPROM movwf PORTB ;отобразить байт incf EEADR,f ;новый адрес bcf INTCON,T0IF ;очистить флаг прерывания retfie start clrf PORTB bank1 clrf TRISB^80H ;все разряды порта B на вывод movlw B'00000111' movwf OPTREG^80H ;таймер 0 предварительный делитель 256:1 bsf EECON1^80,WREN ;разрешить запись в EEPROM bank0 call ee_init ;пересылка таблицы в EEPROM bank1 bcf EECON1^80H,WREN ;запретить запись в EEPROM bank0 bsf INTCON,T0IE ;разрешить прерывания от таймера bsf INTCON,GIE ;разрешить все прерывания loop goto loop ;"холостой" цикл ; ee_init ; ; инициализация EEPROM из таблицы ee_init clrw call lut ;получить кол-во элементов в таблице movwf n_vals ;и сохранить movwf n_tmp ;сохранить еще раз clrf EEADR decf EEADR,f ;EEADR = -1 ee_in1 incf EEADR,f ;следующий адрес movf EEADR,w addlw 1 call lut ;получить соответствующее значение таблицы movwf EEDATA call ee_wr ;запись в EEPROM decfsz n_tmp,f ;есть еще? goto ee_in1 ;да clrf EEADR ;нет, завершить return ; lut ; ; просмотр таблицы lut addwf PCL,f ;добавить W к PCL для получ.


адреса эл-та таблицы retlw D'12' ;число элементов в таблице retlw B'1000' ;первый элемент retlw B'1000' retlw B'0100' retlw B'0100' retlw B'0010' retlw B'0010' retlw B'0001' retlw B'0001' retlw B'0010' retlw B'0010' retlw B'0100' retlw B'0100' ;последний элемент ; ee_wr ; ; Записать байт из EEDATA в EEPROM по адресу в EEADR. Прерывания ; должны быть запрещены перед вызовом ee_wr. ee_wr bank1 magic ;вызов "волшебной" последовательности bsf EECON1^80H,WR ;начать запись ee_wr1 btfsc EECON1^80H,WR ;запись завершена? goto ee_wr1 ;нет bank0 return ; ee_rd ; ; Прочитать байт EEPROM из EEPROM по адресу EEADR в EEDATA ee_rd bank1 bsf EECON1^80H,RD ;начать запись bank0 return ;при возвращении чтение должно быть завершено end Это HEX файл, сформированный MPASM (запишите его как PATTERN.HEX): :020000000E28C8 :0800080009080C060319890127 :10001000442008088600890A0B110900860183160E :10002000860107308100081583121C2083160811F1 :1000300083128B168B171B2800012C208C008D003F :1000400089018903890A0908013E2C2088003A2089 :100050008D0B22288901080082070C3408340834EB :1000600004340434023402340134013402340234DE :1000700004340434831655308900AA30890088146A :100080008818402883120800831608148312080079 :02400E00F33F7E :00000001FF При использовании моего программатора это может быть выполнено с помощью следующей команды: PP PATTERN.HEX (PP V-0.4) TOPIC -G PATTERN.HEX (TOPIC V-0.2) Эти программы могут показаться не слишком совершенными, но если вы только что собрали или купили программатор PIC и поспешно собрали простую испытательную схему, то такая программа для включения и выключения светодиодов вам пригодится. 2nd Edition 4/Feb/97 Оригинал статьи на английском языке взят с сайта "РадиоФанат"
Перевод Юрия Лысенкова (
support@yusoft.pp.ru)

Более подробное описание функционирования PIC микроконтроллеров серий 16C5x, 16C71, 16C84 на русском языке, программаторы для них, а также программу для реализации автомата световых эффектов Вы найдете на сайте "PIC микроконтроллеры и их программирование".

This page created by Easy Multiple HTML Page Creator. © 2002 Yuri Lysenkov

Наложение видео на существующий сигнал.


Меня часто спрашивают, – как наложить один видеосигнал на другой. Кратко коснусь этой темы. Довольно сложно сложить два видеосигнала, но намного легче наложить изображение на видеосигнал, если изображение мы генерируем сами. В этом случае вместо того, чтобы генерировать синхроимпульсы, мы извлекаем их из входного видеосигнала. Это легко можно сделать с помощью микросхемы LM1881. LM1881 – это селектор синхроимпульсов, он выделяет горизонтальные и вертикальные синхроимпульсы из видеосигнала. Допустим, мы хотим добавить маленькую картинку в нижний правый угол текущего изображения. Тогда мы ждем вертикальный синхроимпульс, а после этого просто начинаем считать горизонтальные синхроимпульсы до тех пор, пока не начнется строка, в которую требуется добавить изображение. Если надо добавить картинку 8х8 пикселей, тогда мы должны изменить изображение в конце следующих 8 строк. Изображение добавляется отключением на этот момент оригинального сигнала и передачей нашей видеоинформации. В каждой строке необходимо ждать 40 – 50 мкс, в зависимости от Х-положения, куда должна быть добавлена картинка. Когда это будет сделано для всех 8 строк, мы опять начинаем ждать вертикальный синхроимпульс, и повторяем все сначала. Размер памяти микроконтроллера PIC ограничен, поэтому сделать что то более значительное на много сложнее.

DIGITA.ru: DVD-плееры, видео-магнитофоны, видео-плееры. Большой выбор. Лучший сервис.




О видео сигнале.


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

Как работает стандартный телевизор.
В стандартном телевизоре используется вакуумная труба, которая имеет экран, покрытый слоем люминофора и электронную пушку, которая излучает электроны в направлении экрана. В момент удара электрона об экран и в течении некоторого времени после удара в месте удара люминофорный слой излучает свет. Траекторию электронного потока, излучаемого пушкой, можно изменить с помощью магнитного поля и тогда электроны будут ударяться в другую точку экрана. Используя такое управление можно рисовать горизонтальные линии по всему экрану. При изменении интенсивности электронного луча изменяется яркость свечения, таким образом можно получить на экране изображение. В системе PAL экран перерисовывается 25 раз в секунду. Чтобы уменьшить мерцание экрана при обновлении картинки, сначала рисуются все нечетные, а потом все четные линии. Поэтому картинка практически обновляется 50 раз в секунду. Для того чтобы получить цветное изображение, необходимо чтобы каждая точка экрана состояла из трех цветов: красного, зеленого и синего. Здесь мы будим рассматривать только черно-белое телевидение, так как только его можно получить в реальном времени с помощью PIC16F84.
.
Электронный луч рисует изображение. Две части изображения образуют одно сплошное.
Различные телевизионные стандарты.
Существуют три основных телевизионных стандарта: NTSC, SECAM и PAL. NTSC ( National Television System Committe ) – это американский стандарт. Он имеет 525 строк и частоту обновления кадров 30 Гц. SECAM ( Sequentil Color And Memory ) - французский стандарт и PAL ( Phase Alternating Lines ) имеют 625 строк в кадре при частоте кадров 25 Гц. Кроме различия кадровой и строчной частот эти стандарты отличаются способом кодирования цветного сигнала. Далее мы будим рассматривать стандарт PAL.


Информация в видеосигнале.
Точки разной яркости образуют на экране изображение. Когда электронный луч проходит по экрану, его интенсивность изменяется за счет изменения уровня видеосигнала. Но в этом сигнале нет информации о том, в какой части экрана находится в настоящее время луч. Для решения этой проблемы используется синхроимпульс, который передается в начале каждой строки. Синхроимпульс говорит телеприемнику, что текущая строка закончилась и необходимо перевести луч вниз, в начало следующей строки ( это похоже на нажатие кнопки 'Enter' на клавиатуре когда Вы набираете текст на компьютере ). Телеприемник должен также знать, когда начинается новый кадр. Об этом сообщает специальная комбинация синхроимпульсов ( как функция 'Новый документ' при написании текста с помощью компьютера ). При обновлении кадра 25 раз в секунду изображение будит заметно мерцать, поэтому сначала рисуются все нечетные, а потом все четные линии. За счет этого число кадров в секунду увеличивается до 50, и изображение становится более качественным. Информация о четности/нечетности строки передается в комбинации вертикальных синхроимпульсов. Амплитуда видеосигнала изменяется в пределах от 0 до 1В. Уровень 0,3В соответствует черному цвету, а 1В – белому ( яркость серого изменяется между этими значениями ). Уровень 0В соответствует синхроимпульсу.

Строка видеосигнала.
Изображение разделено на строки. Каждая строка имеет длительность 64 мкс. В первые 4 мкс передается строчный синхроимпульс. Это производится переводом уровня сигнала в 0 для того, чтобы сказать телеприемнику, что началась новая строка. Старые телевизоры были очень медленными, после получения синхроимпульса им требовалось 8 мкс для перевода электронного луча в начало следующей строки. В течении этого времени сигнал поддерживается на уровне черного. В оставшиеся 52 мкс передаются данные изображения. Изображение рисуется слева направо с яркостью, соответствующей уровню видеосигнала. Черный цвет соответствует уровню 0,3В, и с увеличением уровня видеосигнала увеличивается яркость.


Максимум яркости достигается при уровне видеосигнала 1В ( белый цвет ). На рисунке показана осциллограмма строки видеосигнала.
Осциллограмма строки видеосигнала.
Объединение строк вместе в изображение.
Изображение состоит из 625 строк. Но телевизор не показывает все 625. Часть из них используется для синхронизации. Другая часть ( не знаю точно сколько ) не видна на экране так как старым телевизорам требовалось некоторое время для перевода электронного луча из нижнего правого угла растра в верхний левый. ( В настоящее время эти строки используются для других возможностей, например для телетекста ).
Осциллограмма нескольких строк видеосигнала.
Вертикальная синхронизация.
Для того чтобы сообщить телеприемнику, что начинается новый кадр, посылается специальный импульсный пакет. Так как изображение состоит из двух полукадров, пакеты отличаются в четном и нечетном полукадрах. Импульсы кадровой синхронизации выглядят как на рисунке.


Здесь показано, чем отличаются вертикальные синхроимпульсы в разных полукадрах. Уровень напряжения изменяется от 0 до 0,3 В. Цифры указывают номер строки.

DIGITA.ru: Телевизоры, DVD-плееры, видеомагнитофоны, видео-плееры. Аппаратура Hi-End класса.


Программа загрузки конфигурации микросхем FPGA фирмы Xilinx


Андрей Федоров. mailto:andy@inser.loniis.spb.su

Хочу предложить Вам программку, которая, на мой взгляд, находится (по своему применению) где-то между любителями и профессионалами, между схемотехниками и программистами. Итак:
Программа предназначена для загрузки конфигурации микросхем FPGA фирмы Xilinx через LPT порт компьютера без использования специального оборудования фирмы Xilinx (XChecker). В качестве загружаемого формата используются файлы формата MCS-86 (один из трех форматов программаторов, поддерживаемых пакетом разработки Xilinx'а), что позволяет загружать как одиночную микросхему, так и цепочку микросхем. Программа может быть полезна при отладке устройств на FPGA Xilinx, а так же позволяет создавать цифровые устройства, взаимодействующие с компьютером через LPT порт и меняющие свою конфигурацию (схему) в процессе работы. Разумеется, для создания файлов *.mcs необходимо наличие фирменного пакета разработки (XACT).

Программа DLoad191.zip (719 Кб)

К недостаткам программы можно отнести тот факт, что она использует прямой доступ к порту и, соответственно, неработоспособна в среде Windows NT.

Могу также прислать компонентик (VCL Delphi/Builder), который, собственно, и занимается загрузкой конфигурации, что позволит включать функцию загрузки в свои приложения, но думаю, что радиолюбителям это уж совсем неинтересно.

Программатор PIC контроллеров


Конструкция представляет из себя очень простое и дешевое устройство для программирования и последующего чтения внутренней памяти PIC контроллеров типа PIC16C84 /83, PIC16F84 /83, PIC16CE625 /624/623. В отличие от многих аналогичных конструкций, программатор допускает внутрисхемное программирование.

При разработке за основу была взята схема AN589, рекомендуемая фирмой "Microchip" в документе 00589a.pdf  (42кб). В нем подробно описана как работа схемы, так и алгоритм программирования.

Программатор питается от источника напряжением 12…13v с током до 100ma и подключается к порту LPT1 персонального компьютера. Управляющая программа разрабатывалась для MS DOS, поэтому при работе в среде «Windows» для соблюдения необходимых временных соотношений при программировании ее необходимо запускать в режиме эмуляции MS DOS. Хотя сама программа прекрасно работает и в оконном режиме, попытка программирования в этом случае ни к чему хорошему не приведет. Алгоритм программирования большинства PIC контроллеров одинаков, поэтому не составит труда расширить их номенклатуру, просто у автора не было такой необходимости. Интерфейс программы прост и интуитивно понятен, однако желающие могут попытаться внести любые, необходимые на их взгляд усовершенствования. Вы можете загрузить исполняемый файл и исходный текст программы на Си с подробными комментариями на русском языке prg16c.zip  (36кб).

mailto:ra4nalr@write.kirov.ru

http://www.kirov.ru/~ra4nalr

610016  Россия, г.Киров-16, а/я 1906 Хлюпин Николай Петрович

© 1996-2000г.



Здесь инфорормация для тех, кто


Александр Денисов, RA3RBE, г.Тамбов
E-mail: denisov@geocities.com
Homepage: www.geocities.com/alldn Здесь инфорормация для тех, кто не имеет опыта работы с PIC процессорами. Для транслирования исходного текста программы в машинный код процессора используется широко распространенный, бесплатный ассемблер MPASM, для программирования - программатор PIX, также бесплатный и доступный на многих серверах. Схема аппаратной части программатора приведена на рисунке.

Архивы MPASM и PIX распаковываем в разных директориях MPASM и PIX соответственно. Файл *.asm с исходым текстом программы переписываем в директорию ассемблера MPASM. 1. Трансляция исходного текста. Набираем команду MPASM [_имя_].asm. После выполнения программы на экране дисплея должно быть следующее: MPASM 01. 40 O 1993-96 Microchip Technology Ink. /Byte Craft Limi Checking c:\.....\[_имя_].asm for symbols... Assembling... [_имя_].asm 639 Building files... Errors : 0 Warnings : 0 reported 0 suppressed Message : 0 reported 0 suppressed Lines assembled : 638 Press any key to continue. Отсутствие сообщения об ошибках и предупреждений говорит о том, что программа оттранслирована правильно. После трансляции в директории MPASM появится несколько файлов с именем [_имя_] и разными расширениями. Нужный нам для программирования файл будет [_имя_].HEX. 2. Программирование PIC процессора 2.1. Переходим в директорию PIX, запускаем программу PIX.EXE, подключаем к разьему COM2 аппаратную часть программатора (см. рисунок) с вставленным PIC процессором. 2.2. Даем команду F7 (Erase) - стираем ранее записанную информацию, т.к. новые микросхемы заполнены нулями, которые необходимо "стереть". Микросхема без информации заполнена 3FFF, а ее энергонезависимая память - FF. После стирания в этом можно убедиться, посмотрев содержимое памяти командой F4 (Read). 2.3. Даем команду F3 (File) и вибираем необходимый нам файл [_имя_].HEX из директории MPASM. 2.4. Последняя команда - F9 (Blow) - запись микросхемы.
После завершения процесса программирования появляется надпись: "All loaded Areas Blown OK 1195 mSec", последняя цифра может отличаться в зависимости от быстродействия компьютера. 2.5. Отключаем аппаратную часть программатора от порта COM2 и выгружаем программу командой ALT-X. Микросхема запрограммирована и готова к работе.



и позволяет только записывать без


Устройство содержит всего 2 транзистора и 5 резисторов и позволяет только записывать без чтения и верификации.

Программное обеспечение для программатора (bi2051.zip - 5 кб) Схема и документация в PDF формате доступна на сервере sistudio.com/sistudio/pdf/download.html

Вот схема программатора из описания



Поддерживаемые
микросхемы
Версии прошивок
AVR910 ver 1.5 AVR910 ver 2.3 AVR910m (1200) AVR910m2 (2313)
ATtiny10        
ATtiny11        
ATtiny12   x    
ATtiny15   x    
ATtiny19        
ATtiny28        
ATmega103   x x x
ATmega603   x   x
ATmega161   x    
ATmega163   x    
ATmega32   x    
ATmega83        
AT89S8252 x     x
AT89S52        
AT89S53       x
AT90S1200 x x x x
AT90S2313 x x x x
AT90S2323 x x x x
AT90S2333   x    
AT90S2343   x    
AT90S4433   x   x
AT90S4434   x    
AT90S4414 x x x  
AT90S8515 x x x x
AT90S8535 x x x x
AT90S8555   x    
     Вот схема программатора из описания AVR910.pdf

    Она прекрасно работает на скорости 19200, если Вы хотите увеличить скорость прошивки то схему нужно будет доработать поставив нормальную микросхему интерфейса RS232. Может получиться что-то такое:


    А вот как эта схема выглядит в жизни:
Для запуска программатора на частоте 115200, надо немного поправить ассемблерный файл. В самом начале есть две строчки, там надо просто поменять местами коментарии и всё :-)
У меня эта схема давно работает на 115200 без всяких нареканий.     Если вы только начинаете работать с AVR микроконтроллерами, и вам нечем запрограммировать первый кристалл для программатора, советую воспользоваться простой конструкцией, описанной на сайте фирмы ТЕХНОФОРСТ, а также здесь . Для конвертации НЕХ файлов в бинарные, с которыми работает этот программатор, воспользуйтесь программой hex2bin.exe. Все замечания, предложения, добавления, критику просьба направлять по е-mail: mars@mit8.ru. Спасибо! назад

Создание видеосигнала программным способом.


Итак, эта часть о том, как программным способом получить видеосигнал. Для того, чтобы понять как это делается, необходимо чтобы Вы хорошо усвоили ранее изложенный материал. Если Вы хорошо понимаете, что представляет собой видеосигнал, его легко будит получить программным путем имея процессор с неограниченными возможностями. Проблема в том, что требования к процессору достаточно высоки. Но даже если Вы не имеете мощного процессора кое-что все же можно сделать. Поговорим сначала о написании кода.
В моих примерах кода в этой части используются два следующих макроса:
DNOP –двойная команда NOP –макрос, который обеспечивает паузу в течении двух циклов. dnop MACRO LOCAL label label goto label+1 ENDM DELAY – макрос паузы, длительность которой в три раза больше числа, записанного в регистр W. Delay MACRO LOCAL label movwf delaycnt label decfsz delaycnt goto label ENDM
Схемное решение.
Для генерации видеосигнала необходима некая схема, способная создавать сигналы с амплитудой напряжения от 0 до 1В. Чтобы создать изображение Вам необходимо как минимум три уровня сигнала. Телевизор должен получать уровень черного и уровень синхросигнала для того, чтобы синхронизировать изображение. Если Вы хотите большего, чем просто черный экран, Вам понадобится некоторый уровень серого или белого. Для получения трех необходимых уровней аналогового сигнала требуется два бита данных цифрового сигнала. Стандартное входное сопротивление видеовхода телевизора – 75 Ом. Используя два резистора и два выхода порта микроконтроллера можно создать требуемые уровни напряжения.
При соединении обоих выходов D0 и D1 с землей, напряжение на видеовходе
телевизора будит равно 0, что соответствует синхроуровню.

Выход D1 соединен с землей, а выход D0 - с +5В. В этом случае резистор 450 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 900 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,33В, что очень близко к уровню черного. (Истинный уровень черного 0,3В.)


Выход D0 соединен с землей, а выход D1 - с +5В. В этом случае резистор 900 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 450 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,67В. Это уровень серого.

Оба выхода D0 и D1 соединены с +5В. В этом случае резисторы 900 Ом и 450 Ом включены параллельно, а 75 Ом-ное сопротивление видеовхода телевизора, подключено к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 1В. Это уровень белого.

Эта схема позволяет получить четыре уровня напряжения. На рисунках представлены эквивалентные схемы четырех различных уровней напряжения и показано, каким образом они получаются. Номинал резисторов не критичен. Вы можете использовать большие, стандартные значения: 470 Ом и 1 кОм вместо 450 Ом и 900 Ом. Схема будит работать, просто немного изменится яркость изображения.
Итак, мы можем создать синхроуровень, уровни черного, серого и белого. Этого достаточно чтобы создать простое изображение, как в играх Pong и Tetris. Возможно создание и большего числа уровней яркости если использовать большее число бит выходного порта. Но в этом случае Вы не сможете с помощью них выполнять другие функции.

Программно и аппаратно генерируемый сигнал.
В стандартных видеосистемах, таких, как видеокарта в ПК, информация о том, что выводить на экран берется из видеопамяти. Это осуществляется автоматически на аппаратном уровне. Синхроимпульсы формируются так же автоматически железом. Все, что требуется от программы - это записывать в видеопамять то изображение, которое аппаратная часть должна вывести на экран. Это требует мощной аппаратной части и много памяти. Видеокарта в ПК имеет обычно несколько МБайт видеопамяти. У PIC16F84 есть 68 Байт памяти, и эта память должна хранить не только изображение, но и другую информацию, например переменные. Невозможно держать в памяти всю картинку, как это происходит в видеокарте.


Видеоданные должны формироваться непосредственно в момент вывода изображения на экран. Создать изображение программным способом с помощью такого простого процессора достаточно трудно, это может быть только очень простое изображение. Зато этот способ очень дешев.

Строка, формирующая вертикальные полосы.
Первый тест, который я сделал, когда начал экспериментировать с программной генерацией видео – это получение вертикальных полос на экране. Надо создать строку, в которой информация о цвете изменяется в такой последовательности: серый – черный – белый – черный – серый. Повторяя эту строку непрерывно, получим на черном фоне экрана изображение трех полос: две серые по краям и одна белая по центру экрана. Сигнал включает горизонтальный синхроимпульс, последующую задержку и информацию о яркости. Телевизионное изображение будит устойчиво по горизонтали, а по вертикали может плавать или дрожать, так как вертикальные синхроимпульсы отсутствует. На рисунке показано как это примерно выглядит.
Осциллограмма сигнала, генерируемого кодом,
который приведен ниже. Низкие импульсы -
это серые полосы, высокий импульс в середине
- белая полоса.
Так выглядит видеосигнал на экране
телевизора. Две серых и одна белая полосы.
main: movlw COLOR_SYNC ;get sync level (1) ;**** 4us sync **** movwf VIDEO_PORT ;set port value (1) movlw 3 ;setup delay time (1) DELAY ;delay for 3us (9) movlw COLOR_BLACK ;get black color (1) ;**** 8us delay **** ; movwf VIDEO_PORT ;set port value (1) movlw 7 ;setup delay time (1) DELAY ;delay for 7us (21) movlw COLOR_GRAY ;get gray color (1) ;*** 52us image data *** movwf VIDEO_PORT ;set port value (1) movlw 3 ;setup delay time (1) DELAY ;delay for 3us (9) movlw COLOR_BLACK ;get black color (1) movwf VIDEO_PORT ;set port value (1) movlw 19 ;setup delay time (1) DELAY ;delay for 19us (57) movlw COLOR_WHITE ;get white color (1) movwf VIDEO_PORT ;set port value (1) movlw 3 ;setup delay time (1) DELAY ;delay for 3us (9) movlw COLOR_BLACK ;get black color (1) movwf VIDEO_PORT ;set port value (1) movlw 19 ;setup delay time (1) DELAY ;delay for 19us (57) movlw COLOR_GRAY ;get gray color (1) movwf VIDEO_PORT ;set port value (1) movlw 2 ;setup delay time (1) DELAY ;delay for 2us (6) DNOP ;delay for two clocks goto main ;once again (2) Этот код позволяет генерировать на черном фоне две серых и одну белую полосы. ( Внимание! Этот код написан мной по памяти и не тестировался, поэтому нет гарантии что он рабочий. )
Как Вы, наверное, заметили, этот фрагмент программы выполняется за 192 машинных цикла и создает строку длительностью 64 мкс.


Это время имеет очень большое значение.

Проблема с низким разрешением.
PIC16F84 при частоте 12 МГц выполняет 3 миллиона инструкций в секунду ( для выполнения одной инструкции ( команды ) необходимо 4 такта генератора ). За 64 мкс ( длительность строки ) выполняется 192 инструкции, а в течении 52 мкс ( видимая часть строки ) – только 156 инструкций. Если в эти 52 мкс значение выходного порта будит изменяться каждой инструкцией, Вы получите разрешение 156 пикселей по оси X. Это очень мало. К тому же даже все эти 156 пикселей не могут использованы та как Вы хотите. Если значение пикселя должно меняться с каждым новым циклом, Вы не сможете за один цикл просчитать значение пикселя и вывести его на экран.

Достижение высокого разрешения с помощью команды сдвига.
Если вы хотите показать 8 пикселей черного и белого, сохраненных в одном байте памяти, то это можно сделать так:

movlw 8 ;number of pixels is 8 (1) movwf counter ;set counter to number of pixels (1) shiftloop: movlw COLOR_BLACK ;set default color to black (1) rrf thedata,f ;rotate data right, make put bit in carry (1) skpnc ;check if carry, if not pixel remains black (1 or 2) movlw COLOR_WITE ;carry was set, set color to white (1) movwf VIDEO_PORT ;set color to DA (1) decfsz counter ;decrease counter, check for zero (1 or 2) goto shiftloop ;if more pixels, keep looping (2) Этот код выводит биты одного байта в видеопорт. Таким образом на экран можно вывести различые изображения.
В этом примере для вывода одного бита требуется 8 машинных циклов. При этом разрешение составляет только 19 пикселей, то есть практически применять этот способ бессмысленно. Однако есть хорошее решение этой проблемы. Можно использовать один порт как сдвиговый регистр, сдвигающий на выход по одному биту в каждом цикле. Но за все надо платить. Вы должны принести в жертву возможность использовать порт для других целей. К тому же этот вариант работает только в черно-белом режиме ( серого цвета нет ). Это может выглядеть так:
Соедините резистор 450 Ом с битом 0 PORTB, а резистор 900 Ом с одним из битов PORTA.


Для использования PORTB как дополнительного все его биты должны быть настроены как выходы. Бит PORTA устанавливается в 1, в PORTB записывается байт и сдвигается на выход. Генерируемые черно-белые уровни соответствуют байту, например как здесь:

movfw thedata ;set up the byte to be shifted out movwf PORTB,f ;now the first bit becomes visible (1 clock) rrf PORTB,f ;second bit is shifted out (1 clock) rrf PORTB,f ;third bit is shifted out (1 clock) rrf PORTB,f ;fourth bit is shifted out (1 clock) rrf PORTB,f ;fifth bit is shifted out (1 clock) rrf PORTB,f ;sixth bit is shifted out (1 clock) rrf PORTB,f ;sevenths bit is shifted out (1 clock) rrf PORTB,f ;eighth bit is shifted out (1 clock) Этот код выводит биты одного байта в видеопорт, как в предыдущем примере, но делает это на много быстрее. При этом программа использует все восемь бит выходного порта.
Этот пример позволяет каждый цикл изменять видеосигнал, что дает разрешение 156 пикселей, если не нужно установочного времени. В действительности обычно всегда есть значительное установочное время до и после вывода 8 бит графики. В течении этого времени выводятся черные или белые пиксели. В игре Pong установочное время можно видеть при отображении на экране текста. Там используется этот метод, поэтому между буквами на экране такое большое пространство. Я думаю реально получить 10 символов в строке, каждый шириной 8 пикселей. Таким образом в среднем для вывода каждого пикселя требуется 1,5 цикла ( включая установочное время ). В Pong биты, которые сдвигаются на выход, берутся из ОЗУ. Для одной строки требуется 8*8бит=8Байт. Для каждой линии эти 8 Байт должны быть получены путем чтения из ППЗУ, где они хранятся. В ходе выполнения программы в нужный момент требуемые данные строки изображения переписываются из ППЗУ в ОЗУ. Для того чтобы сделать все это для 8 символов требуется очень много времени. На это уходит целая строка. Вот почему текст отображается через строку. В тот момент, когда отображается черная строка, микропроцессор производит вычисления для следующей строки.



Как было сказано выше, символ рисуется только каждую вторую строку.

Итак, этот метод позволяет получить изображение с достаточно высоким разрешением, но требует целиком PORTB для сдвиговой операции. Сначала может показаться, что невозможно использовать PORTB для других целей, но это не так. Он легко может быть использован как выходной, если один из выходов PORTA использовать для запрета другим устройствам соединяться с PORTB, когда он используется как сдвиговый регистр. Так же возможно использовать PORTB как вход в момент, когда не выполняется операция сдвига. В моих играх мне требовалось много входов для подключения джойстика. Соединять джойстик напрямую рискованно, так как можно сжечь входной буфер порта. ( Джойстик – это группа выключателей, которые замыкаются на землю при нажатии. ) Я решил эту проблему путем использования 100кОм подтягивающих резисторов 1кОм защитных резисторов. Это позволяет напряжению опускаться до 0, когда джойстик нажат и PORTB используется как вход, но защищает от короткого замыкания при работе PORTB в качестве сдвигового регистра.

DIGITA.ru: огромный выбор телевизоров (обычные, проекционные, 100MHz, плазменные).

Вертикальная синхронизация.
Для получения устойчивого изображения необходимо добавить в видеосигнал импульсы вертикальной синхронизации. Это может быть достигнуто с помощью представленного ниже кода.
shortsync: ; label "Shortsync", entry for short sync generator movwf counter1 ; set counter1 to number of shortsyncs shortsync_l0: ; label "Shortsync_l0", short sync count loop entry bcf porta,0 ; set level to synclevel (bit 1) bcf portb,0 ; set level to synclevel (bit 0) dnop ; movlw 0x1D ; set counter2 to "30us" movwf counter2 ; nop ; bsf porta,0 ; set level to black shortsync_l1: ; label "Shortsync_l1", short sync delay loop decfsz counter2 ; do delay counting goto shortsync_l1 ; loop if not finished with delay decfsz counter1 ; count number of shortsyncs goto shortsync_l0 ; if more shortsyncs, keep looping retlw 5 ; return and set w to number of longsyncs (5 longsyncs) vertsync: ; label "vertsync", this is the label to call from main movlw 5 ; set number of shortsyncs to 5 btfss videostuff,0 ; check if first field movlw 6 ; yes, change number of short syncs to 6 call shortsync ; do those short syncs incf videostuff ; update field for the new frame longsync: ; label "longsync", just to make it easy to understand movwf counter1 ; set synccounter to number of longsyncs longsync_l0 ; label "longsync_l0", long sync count loop entr movlw 0x1D ; set counter to 30us movwf counter2 ; set level to sync (bit 1) bcf porta,0 ; set level to sync (bit 0) bcf portb,0 ; label "Shortsync_l1", long sync delay loop longsync_l1 ; do delay counting decfsz counter2 ; loop if not finished with delay goto longsync_l1 ; nop ; set level to black bsf portb,0 ; nop ; count number of shortsyncs decfsz counter1 ; if more shortsyncs, keep looping goto longsync_l0 ; set number of shortsyncs to 5 movlw 5 ; check if second field btfss videostuff,0 ; yes, do 4 shortsyncs instead movlw 4 ; do those short syncs goto shortsync
Этот код генерирует вертикальные синхроимпульсы, как было описано выше. Код состоит из участков, которые выполняются по нескольку раз. Сначала вызывается подпрограмма коротких импульсов, затем подпрограмма длинных импульсов, потом в последней строке кода снова вызывается подпрограмма коротких импульсов. Программа кажется запутанной, но это позволяет сократить ее длинну и сэкономить память программ.
<


br>Моя игра Pong.
Код игры Pong кажется запутанным и непонятным. Это моя первая программа, связанная с видео. Я многому научился после того, как ее написал и думаю, что возможно, ее можно было бы сделать более эффективной.
Для того, чтобы сохранить мяч в границах экрана, в программе приходится использовать много циклов IF. Первые линии просто белые. Это верхние линии, во время которых выполняются действия, определяющие логику игры. Для остальных линий определены по два значения: одно с мячом, второе – без мяча. В лини без мяча сначала показывается левый игрок, если он есть, потом черный участок, а затем, если необходимо , правый игрок. В линии с мячом выполняется то же самое, но на черном фоне в определенном месте должен быть показан мяч. До и после мяча присутствуют две паузы, во время которых вычисляется положение мяча в строке. Каждая пауза длится три цикла, поэтому мяч перемещается довольно большими скачками.
В низу экрана отображается счет. Для показа счета используется сдвиговый метод, описанный ранее. В большинстве строк проверяется, включен ли звук. Если да, на выход аудио подается сигнал.
Информация о тексте меню хранится в памяти данных в виде строк длинной 8 символов. Текст выводится на экран методом сдвига. Это происходит через строку так как в течении первой строки производится извлечение информации из памяти данных и сохранение ее в буфере, а уже во время второй строки эти данные передаются на выход видео.
.
Игра Pong в действии. Экран меню.
Моя игра Tetris.
Для того, чтобы хорошо понять логику работы программы, прежде чем писать ее на ассемблере для PIC, я сначала написал ее на Borland C для DOS для ПК.
Блоки хранятся в памяти в сжатом виде и в нужный момент распаковываются в буфер, где хранятся в соответствии с координатами места на экране. В программе есть три режима управления блоками в буфере экрана: установка, очистка и тест. Установка и очистка это режимы, в которых блоки могут добавляться и удаляться в/из в определенную часть экрана. В режиме тест проверяется попал ли блок в нужное положение.Такой подход делает программу достаточно структурированной и легкой ( по сравнению с Pong ) для просмотра. Режим вывода на экран похож на вывод текста, просто вместо букв на видеовыход сдвигаются данные о блоках и черных участках между ними.
В игре присутствует звуковое сопровождение, которое изменяется в зависимости от момента игры. Счет отображается сдвиговым методом, здесь все как обычно. Меню в игре нет, так как под него не хватило памяти.

Игра Tetris в действии.

Управление работой микропроцессора с помощью супервизоров


Управление работой микропроцессора с помощью супервизоров

      Цепи, контролирующие работу микропроцессоров известны так давно, что они часто считаются как нечто само собой разумеющееся. Существует большое количество таких интегральных схем, от простых трехножечных микросхем сброса до сложных, многофункциональных устройств. Один только Maxim предлагает почти сто основных типов, а вместе с модификациями почти тысячу.

      Основная функция микропроцессорного (µP) супервизора это "power-on-reset" (POR)- сброс микропроцессора при включении питания. Иначе, в устройствах на микропроцессорах (и микроконтроллерах) может произойти сбой при включении или при кратковременных провалах напряжения питания (brownout). В течение многих лет эта проблема частично решалась добавлением резистора, конденсатора и диода на вывод сброса RESET микропроцессора (рисунок 1).


Рисунок 1. Эта простая схема, только частично решает проблему контроля напряжения питания VDD.

      Благодаря RC цепочке, после включения напряжения питания, на выводе RESET некоторое время будет удерживаться низкий (активный) уровень. Если напряжение питания растет достаточно быстро, уровень на выводе RESET будет низким достаточно долго, чтобы, удерживая микропроцессор в режиме сброса, позволить закончиться внутренним переходным процессам перед началом нормальной работы. При выключении и уменьшении напряжения питания, диод обеспечивает быстрый разряд емкости.

      Этот схема хорошо работает при включении питания, только в том случае, если напряжение Vcc растет достаточно быстро по сравнению с постоянной времени RC цепочки. Задача цепи - не допустить работу микропроцессора при напряжении питания ниже допустимого уровня.

      Эта цепь также, не гарантирует надежного сброса микропроцессора при кратковременных провалах напряжения. Для формирования сброса в этом случае, напряжение питания должно упасть ниже, чем напряжение логического нуля минус падение напряжения на диоде (чтобы емкость разрядилась через диод).
Но напряжение питания обычно становиться значительно ниже минимально допустимого по техническим условиям, задолго до того как это происходит.       Чтобы решить эту проблему, производители микропроцессоров часто рекомендуют схему похожую на изображенную на рисунке 2. Она формирует сигнал сброса при снижении питания, но точность установки порога напряжения, при котором формируется сброс, ограничена точностью стабилитрона и погрешностью вызываемой параметрами транзистора.

Рисунок 2. Эта цепь способна контролировать провалы напряжения питания, но имеет невысокую точность и функциональность.       В эту цепь можно добавить функцию формирования временной паузы, включив конденсатор и диод. В итоге цепь будет состоять из семи элементов, и все еще будет иметь проблемы с точностью и с медленно растущим напряжением питания.
Какая точность является достаточной?      Рассмотрим общий пример, в котором микропроцессор работает при номинальном напряжении 5 вольт, но по техническим характеристикам сохраняет свою работоспособность и при 4,5 вольтах. Цепь сброса должна удерживать активный (при котором происходит сброс) уровень на выводе RESET при напряжении питания меньше 4,5 вольт, поэтому минимальный порог, при котором происходит сброс, должен быть 4,5 вольта. Следует, однако, поднять эту границу, из-за разброса значения порога сброса от температуры и от устройства к устройству. Вы можете задать в тех. задании параметры напряжения питания как 5В ±0%, если хотите иметь проблемы с разработчиком блока питания, но лучше определить диапазон напряжения питания от 4,75 В до 5,25 В. Тогда вы должны обеспечить порог сброса между 4,5 В и 4,75В; т.e., 4,63 В ±2,7%.      Пороговое напряжение сброса можно установить с помощью стабилитрона, но средняя точность стабилитрона составляет от ±5% до ±10%. За дополнительную цену можно найти стабилитрон и с более точными параметрами (до ±1%), но только при комнатной температуре и при определенном токе.


Все стабилитроны имеют существенную зависимость напряжения стабилизации от тока, а типичный температурный коэффициент составляет несколько мВ/°C. Только из-за температуры изменение порогового напряжения может составить несколько сот милливольт в диапазоне от 0°C до 70°C. Так что, цепь сброса на стабилитроне не подходит для обеспечения нормального сброса при включении и при провалах напряжения питания. Кроме того, даже слаботочные стабилитроны имеют ток стабилизации минимум 100 мкА, что является дополнительной нагрузкой в системах с батарейным питанием.
Как должна работать идеальная цепь сброса?       Мы установили, что изменение порогового напряжения сброса из-за температуры не должно превышать ±2,7%. Но, кроме того, без соответствующей паузы при формировании сброса, схема будет приводить к сбоям в работе микропроцессора в следующих случаях: при медленном повышении напряжения питания, упомянутым ранее, при большом количестве помех в питании при включении, при неравномерном повышении напряжения питания, или при защите от кратковременных провалов напряжения питания. Так как, когда контролируемое напряжение питания будет почти равно порогу сброса, различные помехи будут вызывать многократные переключения цепи, приводя к пульсациям на входе RESET.       Эту проблему можно было бы решить с помощью гистерезиса, и рынок предлагает несколько видов таких детекторов напряжения. К сожалению, наличие гистерезиса уменьшает допустимый разброс порогового напряжения. В выше упомянутом примере мы имели разброс в 250 мВ (4,75 В - 5,0 В). Если вы выделите 100 мВ на гистерезис, то минимальный порог для возрастающего напряжения питания составит на 100 мВ больше чем раньше, т.е. 4,6 В (больше 4,5 В). Этот сдвиг необходим, чтобы гарантировать порог срабатывания при уменьшающемся напряжении питания (при кратковременных провалах напряжения), не ниже 4,5 В. Таким образом, чтобы гарантировать, что оба пороговых напряжения будут находиться между 4,5 В и 4,75 В, верхний порог должен быть 4,67В ±1,6% (среднее значение между 4,6 В и 4,75 В).       Типичные детекторы напряжения такого типа, такие как Ricoh Rx5VL/Rx5VT и Seiko S-807, имеют точность установки порога при 25°C - ±2,5% и ±2,4%.


Реально устройства работают в большем, чем 25°C диапазоне температур, но эти продукты имеют типичные температурные коэффициенты 100ppm/°C и 120ppm/°C. Это увеличивает разброс порогов до ±2,85% и ±2,82% соответственно, в диапазоне от 0° до 70°C.       Серия Seiko S-808 - наиболее современный представитель из этого типа. Он имеет точность ±2% при 25°C и максимальный температурный коэффициент 350ppm/°C. В диапазоне от 0°C до 70°C, максимальный температурный коэффициент соответствует изменению 350e-6 x 70 = 0,0245, или 2,45%. В наихудшем случае ±3,225%. Если предположить, что обычно температурный коэффициент не будет максимальным, а скорее всего, будет соответствовать среднему значению, то в результате максимальный разброс (±2,6125%) в этом примере будет достаточно небольшим.       Но мы еще не рассмотрели гистерезис до конца. Выше приведенный анализ показал, что порог по возрастающему напряжению удовлетворяет нашим требованиям. Однако порог для уменьшающегося напряжения будет ниже, чем нужно. Типичное значение гистерезиса у всех этих датчиков составляет 5%, а максимальное 7-8%. Порог по возрастающему напряжению в нашем примере находится в требуемом диапазоне (от 4,5 В до 4,75 В), но порог для уменьшающегося напряжения может снизиться до 4,13 В. Таким образом, мы не можем гарантировать обнаружение кратковременного провала напряжения питания до тех пор, пока оно не опуститься почти на 0,4 В ниже допустимого.
Решение - электронная пауза
      Для предотвращения колебательного процесса при напряжении питания равном порогу сброса, без применения гистерезиса, мы должны удлинить импульс сброса. Как и в схеме с RC цепью описанной выше, импульс сброса должен удерживаться в течение определенного времени после превышения порога детектора, напряжением питания. Этот интервал называется период сброса. В отличие от схемы с RC цепью, этот период начинает формироваться, когда напряжение питания пересекает пороговое напряжение детектора.


Когда медленно увеличивающееся напряжение питания вызывает многократное переключение детектора, каждый раз, должен происходить перезапуск периода сброса для предотвращения колебания сигнала сброса микропроцессора.       Устройства, выполняющие эту основную функцию, существуют давно, а в последние годы они стали доступны и в миниатюрных трехножечных SOT23 корпусах. Первое SOT23 устройство (MAX809) стало наиболее повторяемым индустриальным стандартом. Универсальный MAX 809 выпускается с несколькими пороговыми напряжениями, задаваемыми при производстве, и гарантирует точность ±2,6% в диапазоне -40°C до +85°C. Кроме того, MAX 809 гарантирует минимальный период сброса в 140 мс. MAX 809 удовлетворяет всем указанным выше требованиям к супервизорам, и более прост в использовании, чем дискретные компоненты. Рисунок 3 иллюстрирует применение MAX809.
Рисунок 3. Трехножечная микросхема супервизора совмещает слежение за напряжением питания (при запуске и кратковременных провалах напряжения) с возможностью формирования интервала сброса.

      MAX809 потребляет ток 60 мкА. Некоторые современные клоны этого типа, в том числе ETC809 и IMP809, имеют максимальный потребляемый ток в диапазоне от 15 до 20 мкА. Новые супервизоры семейства MAX6326 и MAX6346, обеспечивают те же самые функциональные возможности при еще меньшем потреблении. Они потребляют максимум 1 мкА (типичное значение 0,5 мкА) при пороговом напряжении ниже 3,2 В и 1,75 мкА (типичное значение 1 мкА) для более высокого порогового напряжения.
Когда не достаточно контроля за напряжением питания.       Трехвыводные супервизоры обеспечивают только основные функции, но для многих применений требуются дополнительные. В качестве дополнительной функции часто требуется вход для ручного сброса (manual reset - MR). Это позволяет осуществлять сброс нажатием кнопки, а также различными логическими сигналами от других источников. Этот вход с подавлением дребезга контактов (использующий такую же задержку, как и при формировании сброса, при контроле за напряжением питания).


Такому супервизору необходимо 4 вывода, что обеспечивается SOT-143 (4-х ножечный SOT-23). Многие производители 3- х ножечных супервизоров, упомянутые выше, так же выпускают и 4-х ножечные микросхемы, имеющие данную функцию.       Большинство ранее выпущенных SOT устройств предназначены для пяти-вольтового или другого стандартноо напряжения. Однако два из 4-х ножечных устройств от Maxim (MAX6314 и MAX6315) представляют первые из недавно появившихся супервизоров, которые делают доступным широкий диапазон пользовательских напряжений и длительностей сброса. Наиболее часто применяемые комбинации доступны как стандартные продукты, но инженеры могут также выбрать пороговое напряжение от 2,5 В до 5,0 В с шагом 100 мВ и минимальной длительностью сброса 1 мс, 20 мс, 140 мс, 1,12 с (устанавливается при производстве).
Гав!       Другое обычное требование для микропроцессорных систем - сторожевой таймер (WDT). Сторожевой таймер обеспечивает защиту от "плохих" программ и других факторов, вызывающих программный сбой. Сторожевой таймер это просто перезапускаемый таймер, выход которого (WDO) изменяет свое состояние при истечении интервала, сбрасывая микроконтроллер или вызывая прерывание. Для предотвращения переполнения таймера, вы подключаете выход микроконтроллера к входу (WDI) сторожевого таймера. Затем программа должна периодически формировать импульсы на этом выводе, которые будут перезапускать сторожевой таймер, до того как произойдет его переполнения. Иначе на выходе (WDO) сторожевого таймера сформируется импульс прерывания или сброса.
Но мой микропроцессор имеет сторожевой таймер.       Многие микропроцессоры имеют встроенный сторожевой таймер, но часто он не обеспечивает полной защиты. Обычно сторожевой таймер включается и выключается программно. Раз программа может выключить сторожевой таймер, значит, нет гарантии полной защиты вашей системы от сбоя программы. Для этого, вам необходим внешней сторожевой таймер, который нельзя отключить программно.       Многие супервизоры могут выполнять эту функцию, в том числе и широко распространенный DS1232 от Dallas Semiconductor - это один из наиболее дублируемых супервизоров (рисунок 4a).


Он обеспечивает те же самые функции, что и 4-х ножечные устройства, плюс сторожевой таймер, который может быть запрограммирован с помощью входа TD на три различных периода времени. Используя вход TOL, вы можете также установить одно из двух пороговых напряжений сброса. DS1232 имеет также дополнительные выводы сброса. Оригинальная версия поставляется только в 8-ми выводных DIPs и 16-выводных wide-SO корпусах. Новые версии доступны и в 8-ми выводных SO.       Многие применения не требуют программируемости DS1232 и дополнительных выходов. Отказ от этих функций уменьшает число выводов до 5, что позволяет, применить 5-ти ножечный корпус типа SOT23. Первые такие приборы доступные в 5-ти ножечных SOT23, это MAX823 и MAX824 (рисунок 4б). Как и в DS1232, их выход сброса сторожевого таймера внутри микросхемы соединен с выходом монитора питания, формируя один общий выход сброса. MAX823 имеет низкий, а MAX824 высокий активный уровень сброса.
Рисунок 4a. Рисунок 4b.
Рисунок 4. Популярные супервизоры, имеющие сторожевой таймер и вход ручного сброса (MR).

      Эти 5-ти ножечные устройства стали родоначальниками супервизоров дающих разработчику больше возможностей. Микросхем серий от MAX6316 до MAX6322, например, обеспечивают разнообразные функции и комбинации выводов в корпусе SOT23-5. Доступны типы этих приборов с порогами сброса в диапазоне 2,5 В и 5,0 В с шагом 100 мВ, четырьмя различными периодами сброса (1 мс, 20 мс, 140 мс, 1,12 с), и четырьмя различными периодами сторожевого таймера (4,4 мс, 71 мс, 1,12 с, 17,9 с).
Контроль нескольких напряжений с помощью одной микросхемы.       Многие системы требуют для работы нескольких напряжений питания. Эти напряжения могут контролироваться с помощью нескольких микросхем, но большинство разработчиков предпочтут одну, для контроля двух или более напряжений. DS1834 фирмы Dallas, например, контролирует напряжения 5 В и 3 В (или 3,3 В).       Устройства, имеющие в своем составе аналоговые и цифровые цепи, часто требуют, что бы вы контролировали напряжение питания цифровой части схемы, наряду с положительным или отрицательным аналоговым напряжением.


Справиться с этой задачей помогут MAX6304, MAX6307, или MAX6310 (доступны в SOT корпусе), плюс четыре внешних резистора. Микросхемы отличаются только типом выхода сброса: с открым стоком и низким активным уровнем, двухтактный с низким или высоким активным уровнем. Они контролируют напряжение питания на выводе VCC, используя устанавливаемые при производстве пороги сброса в диапазоне от 2,5 В до 5,0 В с шагом 100 мВ. Оба устройства имеют компараторы повышенного и пониженного напряжения, чьи пороги устанавливаются внешними делителями. Входа недо- и перенапряжения этих двух компараторов могут осуществлять функцию "оконного" сброса, выдавая предупреждения (или формируя сброс), когда контролируемое напряжение слишком высокое или слишком низкое (выходит за границы окна).       Или же вы можете использовать вход перенапряжения, как детектор уменьшения напряжения отрицательной полярности. Объединение этой функции с установкой и конфигурацией детектора пониженного напряжения позволяют супервизору контролировать логическое напряжение, например 5 В, наряду с положительным или отрицательным аналоговым напряжением, например ±12В (Рисунок 5). Показанное устройство имеет двухтактный выход сброса с низким активным уровнем (базовый номер 6310), номинальное пороговое напряжение 4,63 В (суффикс "46"), и номинальный период сброса 200 мс (суффикс D3). Показанные внешние резисторы позволяют генерировать сброс, когда аналоговое напряжение становиться меньше ±10 В.
Рисунок 5. Внутренние компараторы осуществляют контроль повышения и снижения напряжения и функцию "оконного" сброса.

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


Многие из старых супервизоров имеют внутренние переключатели для батарейного и основного питания, а при мощных нагрузках они могут переключать основное питание, управляя внешнем транзистором.       Особенность переключателя на резервное питание, это защита от записи или управление доступом к чипу (chip enable - СЕ). При этом СЕ линия от микропроцессора или логики, которая обычно поступает к ОЗУ напрямую, проходит через супервизор. В обычном режиме работы сигнал проходит к ОЗУ без изменения. Во время сброса, супервизор выдает на СЕ высокий уровень, запрещая доступ к ОЗУ и таким образом защищая содержимое ОЗУ от ошибочной записи микропроцессором.       Большинство современных супервизоров относительно простые устройства, которые обычно выпускают в маленьких корпусах, таких как SOT, но некоторые имеют дополнительные функции. MAX818 в 8-ми ножечном µMAX корпусе, например, обеспечивает контроль питания и функцию сторожевого таймера, наряду с переключением на резервное питание и управлением СЕ сигналом (рисунок 6). Переключатель на резервное питание в нем также обеспечивает функцию "сохранность батарей", что предотвращает разрядку батарей установленных в устройство перед продажей.
Рисунок 6. Супервизор, выполняющий функции сторожевого таймера, переключатель на резервное питание и управление СЕ, наряду с контролем напряжения питания.

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


Это двоичный выход, переключаемый внутренним компаратором с порогом, немного превышающим пороговое напряжение сброса. Контролируя этот вывод, микропроцессор заранее получает предупреждение о предстоящем сбросе из-за снижения напряжения питания.       Некоторые устройства имеют внутренний компаратор уменьшения снижения питания, один вход которого подключен к внутреннему опорному источнику напряжения, а другой вход (и выход) свободный. Это позволяет разработчику контролировать любой необходимый уровень напряжения, используя внешний делитель. Это часто используется для контроля нестабилизированного напряжения от батарей или другого источника, подаваемого на стабилизатор напряжения. Выход снижения напряжения информирует микроконтроллер, когда входное напряжение снижается, приближаясь к минимально допустимому для правильной работы стабилизатора. Раннее предупреждение позволяет системе правильно завершить работу перед пропаданием напряжения. Такими многофункциональными супервизорами являются, например DS1236, MAX793, и MAX807.       Однако требования некоторых сложных и критичных систем, не могут быть выполнены с помощью одной микросхемы, даже много функциональной. Хорошим примером является высококачественные много осевые контроллеры перемещений от Motion Engineering Inc. (Santa Barbara, CA). Эти системы (XMP семейство) имеют уникальную, многостороннюю защиту схемы, состоящую их комбинации стандартных супервизоров и минимальной внешней логики (Рисунок 7). Простейший контроллер этого семейства (PCI версия и компактная PCI (CPCI) версия) обеспечивает питание DSP (цифровой сигнальный процессор) и контроль до 16 осей, т.е. 16 двигателей.
Рисунок 7. Несколько микросхем обеспечивают многостороннюю защиту сложной и критичной системы.

      Поскольку стандартный интерфейс между контроллером и драйвером двигателя ±10В, ХМР формирует напряжение питания ±15 В с помощью DC-DC преобразователя расположенного на плате и питающего выходные каскады.


Он использует это напряжение, наряду со стандартными по CPCI спецификации ±12 В, +5 В, +3,3 В. Для PCI версии контроллера 3,3 В получают из 5 В используя другой DC-DC преобразователь. Так как аналоговые выходы непосредственно управляют скоростью двигателя, при аварийной ситуации они отключаются. Система контролирует все напряжения питания и выключает аналоговые выходы, если какое либо из напряжений выйдет за пределы нормы.       Аппаратные средства используют сторожевой таймер для защиты себя, двигателей и их нагрузки от программных сбоев. Сторожевой таймер с коротким периодом (4 мс) перехватывает программные ошибки до того, как произойдут какие либо повреждения. При включении питания и загрузке, сторожевой таймер должен быть отключен до тех пор, пока управляющей компьютер и XMP не синхронизируются. После чего сторожевой таймер начинает работать таким образом, что бы программное обеспечение не смогло отключить его снова, без полного сброса DSP.       Управляющий компьютер (в котором установлена ХМР) или внешний сигнал могут вызвать аппаратный сброс, который вызовет полную перезагрузку, приводя плату в такое же состояние, как и при включении питания. Сторожевой таймер вызывает только "мягкий" сброс, который отключает аналоговые выходы и заставляет FPGA (один из типов ПЛИС-программируемая логическая интегральная схема) сбросить свои I/O (входы/выходы) без перезагрузки конфигурации. Состояние "мягкого" сброса продолжается до тех пор, пока компьютер не решит что делать. Остальные источники вызывают аппаратный сброс.       Один MAX6307 контролирует напряжение питания ± 15 В, другой ± 12 В. Как было сказано выше, вход превышения напряжения используется как детектор уменьшения отрицательного напряжения. Выходы сброса MAX6307 с открытым стоком по схеме ИЛИ объединены со сбросом формируемым компьютером, который для этого записывает определенное значение через PCI интерфейс в регистр CPLD (один из типов ПЛИС).


Результат поступает на вход ручного сброса (MR) MAX6315, а сигнал Внешнего Сброса подается на вход ручного сброса другого MAX6315. Один 6315 (с порогом 4,64 В) контролирует питание 5 В, а другой (порог 2,93 В) контролирует питание 3,3 В. Их выходы, объединенные по схеме ИЛИ, производят аппаратный сброс, который вызывает возвращение платы к такому же состоянию, как и при включении питания.       MAX6303 в корпусе µMAX используется как сторожевой таймер. Этот супервизор использует два внешних конденсатора для установки независимых периодов сторожевого таймера и сброса. Период сторожевого таймера умножается на 1 или на 500 в зависимости от состояния входа WDS. Различные комбинации внешнего конденсатора и напряжения на WDS входе обеспечивают периоды от 100 мкс до нескольких минут. MAX6303 также имеет детектор уменьшения напряжения (в данной схеме не используется) порог которого устанавливается двумя внешними резисторами.       Подача на вывод WDS MAX6303 высокого уровня и при свободном WDI входе отключает сторожевой таймер. Используя эту возможность и два флага (сигнала) из DSP, подаваемые в CPLD, после полного аппаратного сброса происходит выключение сторожевой таймер MAX6303. Первый сигнал STROBE используется как строб сторожевого таймера, второй ENABLE как разрешение работы сторожевого таймера (низкий активный уровень). Строб сигнал проходит через трехстабильный буфер в CPLD, прежде чем попасть на вход WDI. Сигнал разрешения фиксируется в триггере CPLD, а выход триггера управляет трех стабильным буфером.       Этот триггер вместе с аналогичным, через который проходит строб сигнал, гарантирует, что оба сигнала будут высокого уровня, что приведет к отключению сторожевого таймера. Как только DSP загрузиться, он установит сигнал разрешения в низкий уровень. Это обнулит WDS триггер, что позволит строб сигналу STROBE пройти от CPLD на вход сторожевого таймера. Это вызовет включение сторожевого таймера. Триггер сконфигурирован так, что на входе WDS не может появиться высокий уровень, без полного сброса DSP.


Чтобы избежать "мягкой" перезагрузки, DSP должен обслуживать таймер каждые 4 мс.       После истечения периода сторожевого таймера, на его выходе появляется сигнал сброса поступающий в CPLD, которая в свою очередь очищает свои внутренние управляющие регистры. Это указывает управляющему компьютеру, что произошел "мягкий" сброс. Сигнал на выходе сброса CPLD производит "мягкий" сброс FPGA, и также объединяется с полным аппаратным сбросом (выход MAX6315) для отключения аналоговых выходов. 74x08 элемент в SOT корпусе, работающий при очень низком напряжении, гарантирует, что сигнал сброса сохраниться и при скачках напряжения питания 5 В. Так как аналоговые выходы теперь отключены, компьютер может не торопясь решить, что делать. Он может перезагрузить DSP через PCI интерфейс и убрать "мягкий" сброс, очистив триггер, когда DSP будет готов. Или же он может перезагрузить всю систему.       Используя три вида стандартных супервизора, простые вентили в SOT23-корпусе и минимум ресурсов CPLD, MEI реализовал очень надежную защиту. Цепь включает в себя 5 SOT корпусов, восемь миниатюрных (вероятно SMD) резисторов, два миниатюрных конденсатора, и один восьми ножечный µMax корпус в половину размера SO-восьминожечного корпуса. Общее занимаемое пространство примерно соответствует пространству, занимаемому стандартными 16-ножечным SO и 8-ми ножечным SO корпусами.       Микросхемы супервизоров могут обеспечить необходимую защиту большинства существующих приложений, от простого сброса при включении, до сложных комплексных функций. Разработчик должен знать возможности, достоинства и недостатки этих микросхем. Даже если не существует одного устройства выполняющего все функции, необходимые в разрабатываемом устройстве, разумное использование миниатюрных компонентов может обеспечить недорогое и эффективное решение задачи при минимально используемом объеме.


Здесь находятся программы на ассемблере.


Здесь находятся программы на ассемблере. (можно просматривать блокнотом)   Управляемый ШИМ на основе микроконтроллера AT90S1200 Потапчук Марис mailto:%20mapic@online.com.ua 24.06.2003 г

      При проектировании и создании данного устройства преследовалась цель создать простой, надежный, а главное универсальный цифровой регулятор на основе самого дешового МК AVR фирмы Atmel - AT90S1200.
      Устройство получилось действительно простым, как по части электроники, так и по части програмного обеспечения. А гибкость программы данного ШИМ регулятора разрешает использовать его для управления любыми устройствами.
      И так, перейдем к аппаратной части устройства (Рис.1). Ядром всего устройства является МК AT90S1200. Его ресурсов более чем хватает для организации ШИМа.

      К выводам 12,13 и 14 подключается клавиатура из трех кнопок (“On/Off”,”+”,”-“).
      К выводу 16 подключается светодиод, который показывает режим работы ШИМа.
      Вывод 15, собствено и является выходом ШИМа.

      Програмно ШИМ построен с использованием 8-битного таймера/счечика AT90S1200. Действует он следующим образом. Сначала в таймер загружается значение, которое соответствует значению длительность импульса и вычисляется формулой:
(число загружаемое в таймер) = 255 - (длительность импульса)
Соответствено на выводе PB3 устанавливается логическая 1. После чего таймер начинает считать до переполнения (255). Во время переполнения возникает прерывание. После этого в таймер загружается дополнение до 255 (по сути оно соответствует длительности импульса):
(число загружаемое в таймер) = 255 - (длительность паузы)
и на выводе PB3 устанавливаетя логический 0. После чего цикл повторяется.

(Период ШИМа в данном случае равен: (длительность импульса) + (длительность паузы) = 255. Отсюда и (число загружаемое в таймер) = 255 - (длительность паузы) = (длительность импульса) * Прим. Sinbad )

      Программа ШИМа на Асамблере с детальными коментариями приведена ниже.



.INCLUDE "1200def.inc" ;============================================================== ; Программа управляемого ШИМа для AT90S1200 ;============================================================== .ORG 000 ;Вектор сброса rjmp reset .ORG 002 ;Вектор прерывания по переполнению таймера inc r27 ;Додаем единицу к регистру r27 sbrc r27,0 ;Проверяем на четность младший бит r27 rjmp pause ;Если четный то пауза sbrs r27,0 ;Проверяем на четность младший бит r27 rjmp impulse ;Если не четный то импульс pause: cbi portb,3 ;Устанавливаем на выводе PB3 логический 0 out tcnt0,r28 ;Загружаем таймер длительностю логической 1 rjmp exit_timer ;Идем на выход из прерывания impulse: sbi portb,3 ;Устанавливаем на выводе PB3 логический 1 out tcnt0,r29 ;Загружаем таймер длительностю логического 0 rjmp exit_timer ;Идем на выход из прерывания exit_timer: reti ;Выход из процедуры припывания reset: ldi r31,$18 ;настраиваем порт В out ddrb,r31 ;PB0,PB1,PB2--как входы,а PB3,PB4--как выходы ldi r28,$99 ;Задаем начальную длительность импульса ldi r29,$66 ;Задаем начальную длительность паузы ldi r31,$17 ;Включаем подтягивающие резисторы out portb,r31 ;к входам PB0,PB1,PB2 ldi r31,$01 ;Настраиваем роботу таймера out tccr0,r31 ;Тактировка от частоти генратора МК без делителя ldi r31,$02 out timsk,r31 ;Розрешение прерывания от таймера stop: cbi portb,4 ;Сбрасываем вывод PB4 в ноль чем зажыгаем светодиод ldi r27,$0 rjmp scan1 ;Отправляемся на сканирование клавиатуры scan1: sbis pinb,0 ;Если нажата кнопка ON/OFF(PD0) rjmp start ;то идем на старт sbis pinb,1 ;Если нажата кнопка "+"(PD1) rjmp start ;то идем на старт sbis pinb,2 ;Если нажата кнопка "-"(PD2) rjmp start ;то идем на старт rjmp scan1 ;Если ничего не нажато то повторяем цыкл сканирования клавиатуры заново start: sbi portb,4 ;Устанавливаем лог.1 на выводе PB4 чем гасим светодиод sbi portb,3 ;Устанавливаем лог. 1 на выходе ШИМ (PB3) out tcnt0,r29 ;Загружаем в таймер счечик начальное значение длины импульса ШИМа sei ;Разрешаем прерывания rcall pause_scan ;Вызываем подпрогаму задержки rjmp scan2 ;Переходим на сканирование клавиатуры scan2: sbis pinb,0 ;Если нажата кнопка ON/OFF(PD0) rjmp off ;то переходим на на часть програмы выключение sbis pinb,1 ;Если нажата кнопка "+"(PD1) rjmp plus ;то переходим на часть програмы увеличения значения ШИМ sbis pinb,2 ;Если нажата кнопка "-"(PD2) rjmp minus ;то переходим на часть програмы уменьшения значения ШИМ rjmp scan2 ;Если нечего не нажато то повторяем цыкл сканирования клавиатуры заново off: cli ;Запрещаем все прирывания и от таймера в том числе cbi portb,3 ;Устанавливаем на выходе ШИМа (PB3) лог. 0 rcall pause_scan ;Вызываем подпрограму задержки сканирования клавиатуры rjmp stop ;Идем в начало програми на метку stop plus: ldi r26,$ff ;Задаем максимальное значение ШИМ cpse r26,r28 ;Проверяем не максимальное ли значение rjmp plus1 ;если нет то идем на часть програмы увеличения значения ШИМ rjmp scan2 ;если максимальное значение то идем назад на сканирование кнопок minus: ldi r26,$33 ;Задаем минимальное значение ШИМа cpse r26,r28 ;Проверяем ни минимальное ли значение rjmp minus1 ;если нет то идем на часть програмы уменьшения значения ШИМа rjmp scan2 ;Если же значение минимальное то возвращаемся на цыкл сканирования клавиатуры plus1: ldi r26,$33 ;Задаем дискретность ШИМа тоесть значение на которое будет увеличиватся или уменшатся значение ШИМ add r28,r26 ;Увеличиваем длительность импульса sub r29,r26 ;Уменьшаем значение паузы rcall pause_scan ;Вызываем подпрограму задержки rjmp scan2 ;Возвращаемся назад на сканирование клавиатуры minus1: ldi r26,$33 ;Задаем дискретность ШИМа тоесть значение на которое будет увеличиватся или уменшатся значение ШИМ add r29,r26 ;Увеличиваем длительность паузы ШИМа sub r28,r26 ;Уменьшаем длительность импульса ШИМа rcall pause_scan ;Вызываем подпрограму задержки rjmp scan2 ;Возвращаемся назад на сканирование клавиатуры ;============================================================== ;Подпрограма задержки.Основная задача етой подпрограмы защита от дребезга контактов кнопок а также задает интервал с которым будет действовать автоповтор при удержании кнопки. ;============================================================== pause_scan: ldi r25,3 D100_3: clr r24 ;Обнуляем регистр D100_2: clr r23 ;Обнуляем регистр D100_1: dec r23 ;Отнимаем единицу от значения даного регистра brne D100_1 ;Проверяем условие перехода dec r24 ;Отнимаем единицу от значения даного регистра brne D100_2 ;Проверяем условие перехода dec R25 ;Отнимаем единицу от значения даного регистра brne D100_3 ;Проверяем условие перехода ret ;выходим из подпрограмы .EXIT


      Программа посредством кнопок обеспечивает следующий набор функций:
           1. Включение любой из кнопок (“On/Off”,”+”,”-“ ).
           2. Выключение кнопкой On/Off.
           3. Изменение скважности ШИМа в сторону увеличения (“-”) и уменьшения (“+”).
           4. Автоповтор при удержании ”+” или ”-“.
      Светодиод является индикатором роботи ШИМа . Данная программа обеспечивает 5 уровней скважности ШИМ.

      Ниже приведена программа (без пояснений), которая обеспечивает 20 уровней скважности ШИМа (плавная регулировка).
     (В первой программе шаг изменения длительности был 33h = 51, т.е. 5 * 51 = 255, а во второй Ah = 10 . Изменение в блоках plus1: и minus1: * Прим. Sinbad )

.INCLUDE "1200def.inc" .ORG 000 rjmp reset .ORG 002 inc r27 sbrc r27,0 rjmp pause sbrs r27,0 rjmp impulse pause: cbi portb,3 out tcnt0,r28 rjmp exit_timer impulse: sbi portb,3 out tcnt0,r29 rjmp exit_timer exit_timer: reti reset: ldi r31,$18 out ddrb,r31 ldi r28,$c3 ldi r29,$3c ldi r31,$17 out portb,r31 ldi r31,$01 out tccr0,r31 ldi r31,$02 out timsk,r31 stop: cbi portb,4 ldi r27,$0 rjmp scan1 scan1: sbis pinb,0 rjmp start sbis pinb,1 rjmp start sbis pinb,2 rjmp start rjmp scan1 start: sbi portb,4 sbi portb,3 out tcnt0,r29 sei rcall pause_scan rjmp scan2 scan2: sbis pinb,0 rjmp off sbis pinb,1 rjmp plus sbis pinb,2 rjmp minus rjmp scan2 off: cli cbi portb,3 rcall pause_scan rjmp stop plus: ldi r26,$ff cpse r26,r28 rjmp plus1 rjmp scan2 minus: ldi r26,$f cpse r26,r28 rjmp minus1 rjmp scan2 plus1: ldi r26,$a add r28,r26 sub r29,r26 rcall pause_scan rjmp scan2 minus1: ldi r26,$a add r29,r26 sub r28,r26 rcall pause_scan rjmp scan2 pause_scan: ldi R25,2 D100_3: clr r24 D100_2: clr r23 D100_1: dec r23 brne D100_1 dec r24 brne D100_2 dec R25 brne D100_3 ret .EXIT

      Так как таймер тактируется непосредственно от тактового генератора то частота ШИМа на прямую зависит от частоты резонатора.


      Ниже приведены некоторые частоты резонаторов, а также соответствующие им частоты ШИМа, измеренные при помощи осциллографа.

Таблица 1. Частоты кварцевых резонаторов и соответтвующие им частоты ШИМ
Частота резонатора

Частота ШИМ
455КГц
6930Гц
2МГц
7140Гц
5,12МГц
18000Гц
8МГц
28400Гц
14,318МГц
51000Гц

      На схеме (Рис.1) в качестве ключевого элемента применен транзистор. Она подходит для управления маломощными нагрузками (ток не более 1А). Если же планируется применение более мощных нагрузок, лучше использовать полевой транзистор. Если же данный ШИМ будет управлять высоковольтными нагрузками, нужно применить тиристор или симистор (например как это сделано в «Сенсорном регуляторе.» http://evm.wallst.ru/main/sensor/index.htm).

      Также нужно отметить, что особое внимание нужно уделить защите МК от высокочастотных помех, генераторами которых могут быть нагрузка ШИМа (например щетки электродвигателя) или же сеть питания (в случае питания МК напрямую от сети 220В).
Потапчук Марис       mailto:%20mapic@online.com.ua     24.06.2003 г

Устройство управления на микроконтроллере PIC16F84.


Этот проект был задуман и реализован еще до того как в продаже появились новые недорогие микроконтроллеры PIC16F628 , имеющие встроенный последовательный интерфейс. Может быть сегодня этот проект уже не актуален, но, все же, думаю предложенная здесь информация кому то будет интересна.

Введение.
То, что представлено здесь, это не совсем проект. Это скорее заготовка для возможного проекта. Здесь рассматривается вопрос создания на базе микроконтроллера PIC16F84 устройства управления / контроля, которое в процессе работы обменивается информацией с ПК. Напомню, что PIC16F64 не имеет встроенного последовательного порта, поэтому основная задача проекта - реализация интерфейса RS-232. Проект полностью базируется на информации и программах, предложенных в статье " Asynchronus Serial I/O Using PIC16Cxx " ( перевод смотрите здесь ).

Назначение и работа устройства.
Прибор состоит из исполнительного УСТРОЙСТВА, связанного с ПК через Com порт и программы управления 'rs232tst.exe' которая работает под Windows 95/98. Исполнительное УСТРОЙСТВО имеет три светодиода, включать и выключать которые Вы можете нажатием кнопки мыши. При этом программа посылает УСТРОЙСТВУ команду управления. Микроконтроллер обрабатывает принятую команду, включает или выключает требуемый светодиод, посылает компьютеру подтверждение выполненого действия. Разумеется светодиоды можно заменить чем то другим, например ключем на семисторе, который будет включать и выключать свет в комнате и т. п. .
Реализация последовательной ассинхронной передачи данных, применяемая в этом проекте имеет один существенный недостаток. Исполнительное УСТРОЙСТВО не имеет на входе приемного буфера, такого, какой есть у стандартных устройств, работающих по протоколу RS-232 ( например UART16550). Микроконтроллеру требуется определенное время для обработки принятой команды. Это время включает в себя идентификацию команды и выполнение связанной с ней действий. Если до истечения этого времени компьютер передаст УСТРОЙСТВУ новую команду, она будит потеряна.
Для решения этой проблемы, в программе 'rs232tst.exe' предусмотрен режим работы, при котором используется программный передающий буфер, который заменяет отсутствующий приемный буфер УСТОРЙСТВА. Более подробное описание работы программы 'rs232tst.exe' смотрите в файле помощи программы.
Технические характеристики:
- напряжение питания – 2 .. 5 В;
- тактовая частота – 4 МГц;
- потребляемый ток – 10 .. 40 мА;
- максимальная скорость обмена данными с ПК – 1200 Бод.

Схема.
УСТРОЙСТВО выполнено на микроконтроллере PIC16F84. Микросхема MAX232 обеспечивает совместимость ТТЛ уровней напряжения с уровнями RS-232.



Прграмма.
Программа для микроконтроллера состоит из нескольких файлов. Основной из них - файл 'pj_rs232.asm', в нем реализована вся логика работы устройства. Два вспомогательных файла 'Txmtr.asm' и 'Rcvr.asm' реализуют функции передачи и приема байта. Эти файлы целиком без изменений взяты из " Asynchronus Serial I/O Using PIC16Cxx ". В файле 'pj_rs232.asm' есть подробные комментарии выполняемых действий, поэтому нет необходимости разбирать работу программы здесь.

Изготовление.
Скачать архив проекта ( схема + '.asm' файлы + .'hex' файл + файл программы 'rs232tst.exe' = 179 кБайт ) можно здесь. В файле 'pj_rs232.asm' заложены следующие настройки:
- тактовая частота 4 МГц;
- скорость передачи 1200 бит в секунду;
- 8 бит данных;
- 1 стоп бит;
- проверка четности не выполняется;
- аппаратный контроль не используется.
Эти настройки соответствуют настройкам по умолчанию параметров Com порта в программе 'rs232tst.exe'.

НА ГЛАВНУЮ | ЧТО ТАКОЕ PIC ? | ПРОГРАММАТОР | ПРОЕКТЫ | СТАТЬИ | ССЫЛКИ


#bn { DISPLAY: block } #bt { DISPLAY: block }

ВОСЬМИКАНАЛЬНЫЙ МИКРОПРОЦЕССОРНЫЙ УЛЬТРАЗВУКОВОЙ ДАЛЬНОМЕР


А.В.Хромов, В.В.Покровский

Рассматривается система, содержащая ультразвуковые дальномерные модули (УДМ) и блок управления и обработки информации на основе БИС КР580ИК80А. Связь блока управления с УДМ осуществляется через программируемый параллельный интерфейс (ППИ) КР580ВВ55.

В УДМ в качестве источника и приемника используется серийный пьезорезонансный микрофон МУП-1, работающий на частоте 40 кГц. Передающая часть УДМ содержит управляемый генератор и согласующий каскад на транзисторе. Включение генератора осуществляется подачей сигнала низкого уровня в порт С.

Приемная часть УДМ объединяет три каскада операционных усилителей, детектор и компаратор. Выход компаратора соединен с первым входом логического элемента 2ИЛИНЕ, второй вход и выход которого связаны соответственно с выводами портов В и А ППИ (рис. 1). Таким образом, программное управление УДМ и прием информации осуществляются по трем линиям. К одному ППИ может быть одновременно подсоединено восемь УДМ.


Рис.1. Структурная схема подключения ультразвукового
дальномера к микропроцессорной системе.

Система совместного управления восьмиканальным ультразвуковым дальномером работает следующим образом. По программе выполняется запись кода 00 в порт С ППИ (рис. 2). Через время t выполняется запись кода РР в тот же порт. При этом происходит подача и снятие сигналов «запуск» низкого уровня.

поступающих на входы упряпляемых генераторов, что обеспечивает формирование пачек импульсов резонансной частоты передатчика длительностью t, излучаемых в нужных направлениях. В зависимости от диапазона измеряемых расстояний t принимает значения от 0,3 до 1,0 мс. Через 1,2 мс (время зятухания помех) в порт В ППИ записывается код 00, что обеспечивает подачу сигналов «разрешение», поступающих в виде сигналов низкого уровня на вторые входы элементов 2ИЛИ—НЕ.


Рис. 2. Временные диаграммы работы микропроцессорного блока
управления ультразвуковыми дальномерными модулями: L1, L8— расстояние от
УДМ1, УДМ8 до отражающей поверхности; Uзв — скорость звука.

Таким образом открывается канал приема отраженных сигналов с УДМ.
С этого . момента программа осуществляет циклический опрос состояния порта А ППИ и счет числа выполненных обращений. В случае прихода отраженного сигнала от одного или нескольких УДМ накопившееся число опросов, пропорциональное расстоянию до отражающей поверхности, вместе с адресами соответствующих УДМ заносится в ОЗУ. В дальнейшем информация, поступающая от УДМ, данные с которых были записаны в ОЗУ, игнорируется. Программа измерения расстояний оформлена в виде подпрограммы (рис.3) и может входить в состав программного обеспечения системы управления. По истечении времени Т1=12 мс, соответствующего удвоенному максимально возможному расстоянию до отражающих объектов, происходит выход из подпрограммы измерения дальности. В результате работы программы в ОЗУ формируется массив из адресов УДМ и соответствующих дальностей, расположенных в порядке поступления отраженных сигналов. Для получения результата к информации о дальности в ОЗУ надо прибавить константу, соответствующую времени затухания помех. Максимальное число ячеек ОЗУ, необходимых для хранения измерительной информации, равно 16 байт (адреса в ОЗУ с 21 00 по 210). Эта информация обрабатывается, и через время Т2=30 мс, достаточное для затухания кратных отражений, весь цикл измерения может быть повторен. Благодаря введению согласующих временных задержек обеспечивается равенство длительностей выполнения команд при записи информации в ОЗУ и при проверке конца счета циклов. Максимальная дальность действия системы измерения расстояний определяется типом применяемых ультразвуковых приемопередатчиков и в данном случае составляет 2 м. Минимальная дальность действия соответствует времени затухания помех и равно 0,2 м. Минимальная дискретность измерения расстояния определяется временем выполнения цикла опроса порта А ППИ. В рассматриваемой системе при тактовой частоте 2 МГц время выполнения цикла равно 60 мкс и подобрано таким образом, что дискретность измерения расстояния составляет 1 см. Уменьшение дискретности нецелесообразно, так как она становится значительно меньше ошибки датчиковой части. Листинг программы измерения дальности: ======================================================= ADRES EQU 210FH ; конечный АДРЕС ОЗУ DALN: MVI A,82H ; ЗАПИСЬ в РУС.


OUT RUS ; СЛОВА-СОСТОЯНИЯ. XRA А ; LXI H,ADRES ; A1: MOV M,A ; DCR L ; НАЧАЛЬНЫЕ JP A1 ; УСТАНОВКИ. MOV C,L ; MOV B,A ; MOV D,A ; OUT PORT C ; ВКЛЮЧИТЬ ГЕНЕРАТОРЫ УДМ MVI F,28Н ; ЗАДЕРЖКА НА ВРЕМЯ A2: DCR A ; ФОРМИРОВАНИЯ ПАЧКИ OP A2 ; ИМПУЛЬСОВ. OUT PORT C ; ВЫКЛЮЧИТЬ ГЕНЕРАТОР УДМ MVI F,A0H ; ЗАДЕРЖКА НА ВРЕМЯ A3: DCR A ; ЗАТУХАНИЯ JNZ A3 ; ПОМЕХ. OUT PORT B ; ПОСЛАТЬ СИГНАЛ РАЗРЕШЕНИЯ. A4: MVI A,C5 ; ПРОВЕРКА КОНЦА CMP D ; ВЫПОЛНЕНИЯ RZ ; ПОДПРОГРАММЫ. MVI A,O7H ; СОГЛАСУЮЩАЯ A5: DCR A ; ВРЕМЕННАЯ JNZ A5 ; ЗАДЕРЖКА. IN PORT A ; ПРОВЕРИТЬ НАЛИЧИЕ ОТРАЖЕНИЯ. JNR D ; УВЕЛИЧИТЬ КОЛИЧЕСТВО ЦИКЛОВ ОПРОСА. ANA C ; ИСКЛЮЧИТЬ ПОВТОРНУЮ ИНФОРМАЦИИ. CMP B ; ПРОВЕРИТЬ НАЛИЧИЕ JZ A4 ; ИНФОРМАЦИИ. INX H ; ЗАПИСАТЬ АДРЕСА MOV M,A ; УДМ в ОЗУ. INX H ; ЗАПИСАТЬ ТЕКУЩЕЕ КОЛИЧЕСТВО MOV M,A ; ЦИКЛОВ ОПРОСА О ОЗУ. CMA ; УЧЕСТЬ НОМЕРА УДМ, ANA C ; ИНЦФОРМАЦИЯ ОТ КОТОРЫХ MOV C,A ; ЗАПИСАНА В ОЗУ. MVI A,04H ; СОГЛАСУЮЩАЯ JMP A5 ; ВРЕМЕННАЯ ЗАДЕРЖКА. END «Микропроцессорные средства и системы» № 4, 1988, с. 73-74.


Вы решили заняться AVR, но не знаете с чего начать?


Вы решили заняться AVR, но не знаете с чего начать?

Постараюсь вам помочь.

Что самое необходимое для работы с AVR, правильно - средства разработки:

1. Программатор - необходим чтобы прошить программу в контроллер.
2. Ассемблер - необходим для компиляции прграммы - получения шестнадцатиричного файлы с расширением .НЕХ (который прошивается в микроконтроллер) из ассемблерного файла с расширением .ASM (который вы пишете сами).
3. Отладчик - необходим что бы отлаживать программу на компьютере.


Начнем с программатора

Можно его конечно купить, а можно и сделать самим. AVR-ки поддерживают два вида программирования - паралельное и последовательное. Обычно используется последовательное, так как для этого необходимо всего 6 проводов. Последовательное программирование также позволяет использовать внутрисистемное программирование (In system programming - ISP), т.е. вы запаиваете микроконтролер в вашу плату, запаиваете 6-ти контактный разьем, а затем с помощью программатора можете в любой момент изменить прошивку. Например, через год работы вашего устройства обнаружилось определенное количество ошибок в программе. Тогда вы открываете корпус прибора, подключаете программатор и прошиваете новую версию программы.


Хватит теории, прейдем к практике

Итак нам нужен программатор. Я пользуюсь самодельным. Схему, прошивку и программу управления для фирменного внутрисистемного программатора я наш на сайте фирмы Atmel. Все это можно найти на моем сайте здесь - http://sin-bad.narod.ru/isp.htm . Этим программатором я лично прошивал АТ90S 1200, 8515, 4414 и 2313 (в последних случаях в меню DEVICE устанавливал AT90S8515).

Но этот программатор работает на AVR АТ90S 1200. Сперва я обратился к знакомому с просьбой прошить атмелку, но его программатор не смого прошить АТ90S 1200, хотя отлично шил АТ90S 8515. Пришлось мне выкручиваться самому. В интернете я нашел схему совсем примитивного программатора под ДОС. Это просто панелька для AVR, подключаемая к LPT порту компа. Схему и программу можно скачать здесь http://sin-bad.narod.ru/AVR_Dos_Prog.zip.


Я быстренько спаял его и стал прошивать АТ90S 1200 для фирменного внутрисистемного программатора. По началу ДОС программатор ни как ни хотел программировать атмелку, тогда я решил подать на нее внешнее питание 5 В (в схеме питание подаеться с порта через диоды, на них падает напряжение около 0,6 В, т.е. питание AVR составляет около 4,4 В). После чего, с третий или четвертой попытки мне удалось запрограммировать мироконтроллер. Затем я сразу засунул его в фирменный внутрисистемный программатор. Так я обзавелся бесплатным (все детали обошлись мне где-то в 150 руб.) программатором.

Теперь об ассемблере

Вообще-то удобнее пользоваться Атмеловской средой разработки АSTUDIO (бесплатно можно найти на сайте производителя Atmel), которая позволяет писать программы на ассеблере, Си, отлаживать программу (эмулирует AVR), и программировать через фирменный внутрисистемный программатор. Скачать АSTUDIO можно здесь - http://www.atmel.ru/Software/astudio3.exe - версия 3.54 около 6,4 Мбайт или здесь http://www.atmel.ru/Software/astudio4.exe - версия 4.02 около 14,7 Мбайт.

Отдельно ассемблер под винду можно найти здесь - ftp://www.atmel.com/pub/atmel/asmpack.exe или http://www.atmel.ru/Atmel/software/asmpack.exe.

Но у первых версий было ограничение по обьему программ на ассемблере, так что мне пришлось пользоваться досовским ассемблером (правда я работал на нем под виндой). Скачать его можно отсюда - http://sin-bad.narod.ru/Avrasm.exe .

Программу я писал в виндовском Блокноте, только расширение файла делал .ASM . Для того, чтобы каждый раз не набирать командную строку, создаю .BAT - овский файл с таким содержанием:

    avrasm.exe   имя_файла.asm   имя_файла.txt   имя_файла.hex

Все файлы должны находиться в одном каталоге с avrasm.exe или указывайте полный путь к ним.

Вот в общем-то и вcе, что необходимо для разработки устройств на микроконтроллерах AVR, фирмы ATMEL.

Будут вопросы, обращайтесь.