Микроконтроллеры AVR - с чего начатьКонтроллер Управление программатором Программирование Ссылки

КОНТРОЛЛЕР НА БАЗЕ МИКРОКОНТРОЛЛЕРА AVR.

 На этой страничке рассматриваются вопросы, возникшие при отработке контроллера на базе микроконтроллера AVR.

Аппаратная реализация контроллера.

 Посмотришь, например, на МК ATmega8515 - и подумаешь: "Ах, как много портов - целых четыре! Ну, куда мне столько?" Но, скажем, при подключении внешнего статического ОЗУ полностью используются порты A, C и цепи WR, RD порта D, для последовательной загрузки программ задействуются три линии порта B, свою лепту вносит организация обмена по RS-232 или USB (две линии порта D).
 В описываемом контроллере не используются аппаратные прерывания, аналоговый компаратор и SPI. Поэтому в порте B альтернативно используются только три цепи, обеспечивающие последовательную загрузку программ в микроконтроллер. Они идут на разъем, к которому программатор подключается только на время программирования. Значит во время работы могут использоваться все восемь линий порта B для ввода данных (в этом случае нет необходимости в буферной микросхеме). Для обеспечения же программирования три цепи порта должны подключаться только к программатору. Поэтому цепляем все восемь линий порта B непосредственно к разъему контроллера, три из них - еще и к разъему программатора. Для программирования вынимаем плату из блока и подключаем программатор, для работы отключаем программатор и вставляем плату в блок. При программировании плату можно оставлять в блоке, если позаботиться о том, чтобы отключались выходные цепи, которые могут зашунтировать цепи программатора.
 На мой взгляд надежнее вынимать плату из блока, не заботясь о состоянии "чужих" цепей. Порт B в моем устройстве принимает данные, порты A, C и две цепи порта D обеспечивают работу внешней оперативной памяти, еще две цепи порта принимают вспомогательные сигналы и две цепи обслуживают RS-232. Для работы с RS-232 к ним подключается микросхема, питающаяся от +5V и преобразующая сигналы RS-232 (единица: -3V...-12V, ноль: +3V...+12V) в уровни TTL-логики и наоборот.
 Для обеспечения двадцати одного выходного сигнала подключим три восьмиразрядных регистра, адресуя их как ячейки памяти.

Что-то с памятью вообще стало.

 Для моего контроллера внутреннего ОЗУ микроконтроллера было маловато. Для начала я прицепил две 537РУ10, сделал тест - программу с записью - считыванием всех нулей, затем всех единиц и, наконец, "шахматки" (чередование 10101010 и 01010101). Сбои не обнаруживались. При пошаговом режиме проконтролировал адреса, данные, сигналы Read, Write и ALE - все было в порядке. Было интересно в пошаговом режиме проверить действительное состояние линий адреса, так как диапазон адресов внутреннего ОЗУ, например, для AT90S8515 - 060H...259H. Надежда на то, что включение внешнего ОЗУ без дополнительных ухищрений позволит использовать его полностью, рюхнулась при пошаговой отладке. Доступа к первым 608-ми (=260H) ячейкам внешнего ОЗУ не было, физический адрес оказался таким же как и "моральный". Выход - адресоваться к внешнему ОЗУ, начиная, например, с адреса 400H с соответственной распайкой линий адреса.
 Но худшее, конечно, впереди. После того, как связь с компьютером по RS-232 была налажена, оказалось, что при считывании детерминированного (заранее известного) массива данных с аппаратуры и при перегонке его по RS-232 в компьютер происходят сбои при обращении примерно к одинаковым адресам. Причин могло быть несколько:
  • высокая тактовая частота - замена кварца 4МГц на 500кГц ничего не изменила;
  • сбои при считывании массива с аппаратуры - вычисление этого массива в микроконтроллере с записью в ОЗУ показали, что эффект не пропадает; дальнейшие поиски причины проводились уже с вычислением массива в микроконтроллере AVR без обращения к аппаратуре;
  • RS-232 - при вычислении массива и передаче его без хранения в ОЗУ сбои отсутствовали;
  • ИС 537РУ10 - взаимная перепайка старших линий адреса (фактически взаимозамена микросхем 537РУ10) ничего не изменила: сбои происходили так же часто примерно на тех же адресах;
  • буфер младшего байта адреса 1533ИР33 - сбойные адреса коррелировались, чаще повторяясь через кратные 256-ти интервалы;
 Сбои отсутствовали, если передача происходила без прогрева, сразу после включения! Помог конденсатор в 100пФ, подключенный к линии ALE. Однако, такое решение проблемы чревато боком - не известно, что будет при изменении внешних условий.
 Нормально заработал контроллер с памятью HM62256LP-12 и регистром 74HCT573N в качестве буфера младшего байта адреса, тактовая частота микроконтроллера составляла 4 МГц. В зависимости от тактовой частоты микроконтроллера AVR в качестве буфера младшего байта адреса подходят регистры 74HC573, 74HCT573, 74AC573, 74ACT573.

Подключение внешнего ОЗУ

.
 Для ускорения загрузки страниц вместо фрагментов схем буду давать их словесное описание. Попробуйте использовать эти комментарии в приложении к рисунку External SRAM Connected to the AVR в техническом описании или нарисовать по ним собственный эскиз, так как на слух они воспринимаются тяжеловато. Фрагмент схемы (размер sch.jpg 71К) можно посмотреть здесь. На схеме DD2 - микроконтроллер AT90S8515; DD3 - буфер младшего байта адреса; DD4 - формирователь сигналов записи в буфера DD7...DD9 информации, выводимой на внешние устройства; DD5, DD6 - микросхемы памяти 537РУ10.
 Цепь ALE микроконтроллера соединить с цепью C буфера младшего байта адреса; EO буфера - на 0V; RD, WR микроконтроллера соответственно к OE, WE обеих микросхем (МС) памяти (OE - разрешение выхода МС памяти, WE - разрешение записи).
 Буфер (регистр) младшего байта памяти восемью линиями цепляется к порту A микроконтроллера. Восемь выходов буфера и восемь цепей A8...A15 микроконтроллера обеспечивают 16-разрядную адресацию внешнего ОЗУ. Выходы буфера соединяются с цепями A0...A7 обеих МС памяти (537РУ10), цепи A8...A10 микроконтроллера соединяются с одноименными цепями МС памяти, цепи A11, A12 микроконтроллера AVR цепляются к CS первой и второй МС памяти соответственно; цепи данных обеих МС памяти цепляются к соответствующим цепям порта A, образуя шину данных [-»].
 Так, цепь A0 микроконтроллера подключается к цепям D0 обеих МС 537РУ10 и к цепям D0 трех буферов выходных сигналов, образуя шину данных внешнего ОЗУ, а также к цепи D0 буфера младшего байта адреса, выход же этого буфера соединяется с цепями A0 обеих ИС 537РУ10. Аналогично разводятся цепи A1...A7 микроконтроллера.
 Микроконтроллер AVR должен быть программно переведен в режим работы с внешним ОЗУ.
 Прямое (без инверсии) соединение линии адреса с цепью CS памяти необходимо учесть при программировании: для нашего примера диапазон адресов для первой 537РУ10: F000H...F7FFH, для второй - E800H...EFFFH, т.е., обращение к первой происходит при нуле в 11-м разряде адреса (A11=0), ко второй - при нуле в 12-м разряде (A12=0), полагая A13...A15=1.
 Такая организация, кстати, обеспечивает доступ ко всей памяти без выпадающих 608-ми байт.
 Вообще-то обращение к обеим 537РУ10 будет происходить при любых состояниях цепей A13...A15. Что будет, если дополнительно прицепить несколько буферов и адресоваться к ним, как к ячейкам памяти, можно посмотреть в следующем разделе.

Буфера как ячейки памяти.

 В качестве буферов DD7...DD9 используем регистры 1533ИР33. Необходимости переводить их в третье состояние нет, поэтому соединим их цепи EO с 0V. Цепи данных регистров соединим с соответствующими цепями шины данных.
 Запись данных в такой регистр происходит при подаче высокого уровня на цепь C регистра. Управление линиями C трех регистров произведем через три двухвходовых элемента 2-ИЛИ-НЕ (одна ИС типа ЛЕ1 любой TTL-серии содержит 4 таких элемента). Один вход каждого элемента соединим с цепью WR микроконтроллера, второй вход - с цепью адреса: A13 - для первого, A14 - для второго и A15 - для третьего элемента 2-ИЛИ-НЕ; выход первого элемента соединим с цепью C первого регистра, второго и третьего элементов - с цепями C, соответственно, второго и третьего регистров.
 Запись данных из микроконтроллера AVR в первый регистр произойдет при нуле в цепи A13 (соответствующий адрес D800H), во второй - при нуле в цепи A14 (адрес B800H), в третий - A15=0 (адрес 7800H).
 Рассмотрим подробнее адрес на примере второго регистра, запись в который происходит при одновременном выполнении условий WR=0 и A14=0, что реализуется выполнением одной из команд записи по адресу микроконтроллера AVR. Запись произойдет при следующем состоянии линий адреса: х0хх хххх хххх хххх. Здесь в двоичном коде записано состояние адресных цепей (A15...A0), х - любое состояние. Но при нулевом уровне в цепях A15, A13, A12 или A11 запись одновременно произойдет и в соответствующий регистр или микросхему памяти, поэтому для записи только во второй регистр полагаем, что в этих цепях уровень логической единицы, тогда адрес второго регистра: 1011 1ххх хххх хххх. Оставшиеся х могут быть любыми, будем полагать их равными нулю, тогда адрес второго регистра: 1011 1000 0000 0000, что соответствует числу B800H (шестнадцатеричному). Такая адресация не причинит хлопот при программировании: просто в начале программы надо ввести константы базовых адресов для двух МС памяти и трех буферных регистров.
 При необходимости увеличить число буферных регистров можно поставить дешифратор адреса, тогда использование только трех линий адреса (A13...A15) позволит обращаться уже к 2 в степени 3 регистрам, т.е., к 8-ми регистрам.
 При значительном числе линий ввода - вывода удобно использовать PLD (программируемые логические устройства): на одном чипе можно программно организовать регистры, дешифраторы, управляющую логику, симулировать процессы, происходящие в чипе. Для PLD ALTERA подходит рекомендуемый программатор ByteBlaster, бесплатное программное обеспечение есть на сайте компании ALTERA.

Пошаговая отладка.

 Для чего еще может понадобиться пошаговая отладка, кроме случая, описанного выше, я не знаю. Для виртуальной пошаговой отладки достаточно симулятора программы AVR Studio 3.0; для контроля же состояния внешних линий можно программно вводить задержки или точки останова, дойдя до которых программа ожидает определенного состояния на какой-либо линии.
 Если же пошаговая отладка понадобится, то надо изготовить известную схему бездребезгового ключа, вырабатывающего уровень логической единицы при нажатой кнопке и уровень логического нуля при отпущенной кнопке. Такая схема реализуется на трехконтактной (переключаещей) кнопке, двух резисторах и RS-триггере. Запитывается схема от цепей 0V и +5V платы контроллера. Пошаговый режим реализуется без отключения кварцевого резонатора. Ко входу XTAL1 микроконтроллера AVR дополнительно припаивается штырек, к выходу бездребезгового ключа - гнездо на проволоке. После подачи питания гнездо надевается на штырек.
 Для работы в пошаговом режиме необходимо отключить сторожевой таймер (WatchDog Timer или WDT). Этот таймер включается после подачи питания и, независимо от тактовой частоты, при отсутствии команды перезапуска WDT или отключения WDT сбрасывает микроконтроллер AVR. Если WDT не перезапустить или не выключить, сбросы повторяются с периодом в несколько миллисекунд. Для пошагового режима в программу вводится команда отключения WDT.
 Для отключения WDT соответствующая команда должна быть выполнена за микросекунды после подачи питания, поэтому до подключения бездребезгового ключа микроконтроллер AVR должен отработать несколько тактов с кварцевым резонатором, далее в программе должен быть цикл ожидания изменения состояния на контрольной линии (свободная цепь какого-нибудь порта), иначе программа выполнится до конца при еще работающем кварцевом резонаторе (на всю программу может потребоваться меньше миллисекунды). Теперь можно подключить бездребезговый ключ и установить необходимое для продолжения программы состояние контрольной линии. Микроконтроллер AVR готов к пошаговой отладке. Отключение ключа возобновит работу микроконтроллера AVR с кварцевым резонатором.
 Если пошаговая отладка - постоянная суровая жизненная необходимость, схему ключа можно дополнить так, чтобы она предварительно выдавала несколько импульсов (достаточно десятка) для того, чтобы успел пройти программный запрет работы сторожевого таймера. Затем схема должна перейти в режим работы от кнопки (схема достаточно проста). Такое устройство надо подключать до подачи питания, цикл ожидания при этом не нужен.

RS-232, он же UART.

 Итак, для связи по RS-232 нужна микросхема, преобразующая уровни RS-232 в TTL и обратно, например, SP202ECP. Такие микросхемы выпускаются многими компаниями, например, Analog Devices или Maxim. К названной микросхеме цепляется 5 конденсаторов по 0,1мкФ , сама микросхема цепляется линиями приема и передачи с TTL-уровнями к микроконтроллеру AVR и линиями приема и передачи с соответствующими уровнями к порту RS-232 другого устройства. Для общения с компьютером необходимы программы обслуживания RS-232 и для микроконтроллера AVR, и для компьютера.
 Необходимо отметить, что при плохо спроектированном заземлении легко вывести из строя не только микросхему для RS-232 на контроллере, но и в компьютере. У меня все работало нормально, пока плата не попала в аппаратуру со стабилизировнным источником питания, от которого в свою очередь питался преобразователь напряжения, а от него - аппаратура и контроллер. Через некоторое время после многочисленных включений - выключений аппаратуры при работающем незаземленном компьютере передающая часть микросхемы в компьютере вылетела. В связи с этим думаю, что не помешала бы опторазвязка на передающих линиях, а при наличии нескольких компьютеров лучше работать с тем, у которого микросхема для RS-232 расположена не на материнской плате, а на плате, вставляемой в слот расширения материнки (это легко проверить по тому, к чему подключены разъемы COM-порта внутри компьютера). На извлекаемой плате легче заменить микросхему.

После пары сгоревших СОМ-портов я все-таки сделал опторазвязку, обеспечивающую скорость передачи 115200 бит/с, со стороны РС оптопары питаются от линии RTS СОМ-порта. 


акселерометры цифровые с USB и RS-485 интерфейсами, аналоговые


   

<=  ссылки на разработки

различные АЦП с USB-интерфейсом и памятью
контроллер термопар с USB-интерфейсом
контроллер GSM управления и сигнализации
люксметр
колориметр
прочие разработки
печатная плата в домашних условиях
гарнитура стационарного телефона
 
Хостинг от uCoz