Как я научился работать с микроконтроллерами — опыт новичка
Всем привет. В этой статье хотел рассказать о том, как я научился работать с микроконтроллерами
(далее по тексту — МК) и на какие подводные камни налетел. Сразу скажу — статья не претендует на эксклюзивность, так как любой человек работающий с МК проходил через то, что прошёл я. Прошу строго не судить, а прочитать как историю.
Вместо вступления
Впервые интерес к МК у меня возник, когда я учился в 10 классе. На тот момент был 2009 год. Я умел немного программировать на ПК в QBasic и Visual Basic — школьная программа, но так сложилась жизнь, что я особо не разбирался в программировании, да и отсутствие знающих людей по части электроники и МК рядом сделали своё дело — для меня это была новая ниша. Хотя я с детства ковырялся с платами и микросхемами найденными на помойках, но как оно работало я толком не понимал — толком никто не мог объяснить. Как работает транзистор нормально я узнал только спустя пару лет после описанных событий. Когда я выбирал первый МК то смотрел характеристики на сайте ЧИП-ДИП. Скажу честно — для меня это было как иероглифы. Так что не стоит этого бояться. И да, про Arduino тогда никто понятия не имел.
Как всё началось
Начал ковыряться в яндексах и гуглах. Понимал, что сам контроллер — половина дела, нужна ещё и программа. А как сказано во вступлении — с программированием у меня было не очень. В конце концов попал на какой-то сайт. Как стало позднее ясно, я с этим сайтом реально «попал». Создатель сайта написал ещё и учебник по программированию, я на радостях скачал учебник и первое что там увидел — «В качестве образца для работы я использовал PIC16F84A ». Собственно так я и выбрал свой первый МК. Теперь вопрос — почему я именно «попал». А попал я из-за того, что создатель этого учебника и сайта предлагал программировать МК на АССЕМБЛЕРЕ. Его не все практикующие проггеры то знают, а тут новичок… Контроллер я уже заказал, и только потом начал читать учебник, к сожалению.
Как я выходил из положения
После того, как я понял, что ничего не понял, я забросил МК на пару лет, но параллельно всё-таки шарился на форумах типа Схем.нет и прочих, и ко мне постепенно приходило понимание вопроса. Решил учиться кстати на модели PIC16F877A.
Итак, что нужно знать новичку:
Микроконтроллер — это маленький компьютер, в нём есть и Арифметико-логическое устройство — процессор по сути дела, и оперативная память и некое подобие жесткого диска — память программ и данных, но выполнено это всё в одной микросхеме. Соответственно в зависимости от модели и производителя у него следующие характеристики (ориентировочно):
Языки программирования
Начал выбирать язык программирования и среду в которой можно программировать. Так как я хоть как-то знал Basic, то и задумался, что было бы хорошо прогать на нём. Да, он не очень совершенный и ещё куча недостатков, но для начала подходил как нельзя кстати. Мне повезло, оказалось, что есть язык PIC-Basic. По нему есть учебник, автор Чак Хелибайк и переведённое на русский руководство, собственно до всего доходил дальше по учебнику и руководству. Среда работает из-под ДОС, но можно прикрутить CodeStudio и всё будет работать из-под Windows.
Программатор
Следующая проблема, стоявшая у меня на пути — чем записать программу в чип. Понятное дело, что нужен программатор, я решил экономить, попробовал собрать несколько схем из этих ваших интернетов. Одной схемы недостаточно, нужна ещё программа которая используя программатор (саму железку) занесёт код в память. Все мои опыты окончились неудачами, по причине малого опыта. Решил я больше не смотреть на то, как от чипов идёт дым и заказал PICKit3, после этого не знал проблем, поигрался пару дней с ним и всё заработало.
Что нужно знать новичку:
Несколько слов про периферию
Для связи с внешним миром и удобства работы и разработки в МК встраивают различные периферийные схемы, например АЦП — аналогово-цифровой преобразователь, так что можно без лишней обвязки измерять напряжение подаваемое на вывод МК, но оно должно быть не выше чем напряжение питания, иначе чип сгорит. Используя делитель напряжения можно сделать вольтметр, например. Периферия, количество встроенных функций и их характеристики тоже зависят от модели, как правило чем дороже модель — тем богаче комплектация. Так же следует не забывать, что у контроллера ограниченное число ножек, к которым можно подключиться.
Например у PIC16F877А их 40 штук, причем 7 штук вылетают сразу, т.к. используются для подачи питания, подключения резонатора и управления аварийным сбросом. Так же надо внимательно смотреть документацию на чип. Например тот же АЦП — в PIC16F877А он может измерять напряжение только на 8 конкретных ножках чипа, на других он это делать не может. То есть под каждую встроенную функцию отводятся конкретные выводы и поменять их нельзя.
Вы еще не программируете микроконтроллеры? Тогда мы идем к вам!
Здравствуйте, уважаемые Хабражители!
В этой статье я хочу рассказать о том, как однажды решил начать программировать микроконтроллеры, что для этого понадобилось и что в итоге получилось.
Тема микроконтроллеров меня заинтересовала очень давно, году этак в 2001. Но тогда достать программатор по месту жительства оказалось проблематично, а о покупке через Интернет и речи не было. Пришлось отложить это дело до лучших времен. И вот, в один прекрасный день я обнаружил, что лучшие времена пришли не выходя из дома можно купить все, что мне было нужно. Решил попробовать. Итак, что нам понадобится:
1. Программатор
Для прошивки надо соединить выходы программатора VCC, GND, RESET, SCK, MOSI, MISO с соответствующими выходами микроконтроллера. Для простоты я собрал вспомогательную схему прямо на макетной плате:
Слева на плате — тот самый микроконтроллер, который мы собираемся прошивать.
2. Микроконтроллер
С выбором микроконтроллера я особо не заморачивался и взял ATmega8 от Atmel — 23 пина ввода/вывода, два 8-битных таймера, один 16-битный, частота — до 16 Мгц, маленькое потребление (1-3.6 мА), дешевый ($2). В общем, для начала — более чем достаточно.
Под Linux для компиляции и загрузки прошивки на контроллер отлично работает связка avr-gcc + avrdude. Установка тривиальная. Следуя инструкции, можно за несколько минут установить все необходимое ПО. Единственный ньюанс, на который следует обратить внимание — avrdude (ПО для записи на контроллер) может потребовать права супер-пользователя для доступа к программатору. Выход — запустить через sudo (не очень хорошая идея), либо прописать специальные udev права. Синтаксис может отличаться в разных версиях ОС, но в моем случае (Linux Mint 15) сработало добавление следующего правила в файл /etc/udev/rules.d/41-atmega.rules :
После этого, естественно, необходим перезапуск сервиса
Компилировать и прошивать без проблем можно прямо из командной строки (кто бы сомневался), но если проектов много, то удобнее поставить плагин AVR Eclipse и делать все прямо из среды Eclipse.
Под Windows придется поставить драйвер. В остальном проблем нет. Ради научного интереса попробовал связку AVR Studio + eXtreme Burner в Windows. Опять-таки, все работает на ура.
Начинаем программировать
Программировать AVR контроллеры можно как на ассемблере (AVR assembler), так и на Си. Тут, думаю, каждый должен сделать свой выбор сам в зависимости от конкретной задачи и своих предпочтений. Лично я в первую очередь начал ковырять ассемблер. При программировании на ассемблере архитектура устройства становится понятнее и появляется ощущение, что копаешься непосредственно во внутренностях контроллера. К тому же полагаю, что в особенно критических по размеру и производительности программах знание ассемблера может очень пригодиться. После ознакомления с AVR ассемблером я переполз на Си.
После знакомства с архитектурой и основными принципами, решил собрать что-то полезное и интересное. Тут мне помогла дочурка, она занимается шахматами и в один прекрасный вечер заявила, что хочет иметь часы-таймер для партий на время. БАЦ! Вот она — идея первого проекта! Можно было конечно заказать их на том же eBay, но захотелось сделать свои собственные часы, с блэк… эээ… с индикаторами и кнопочками. Сказано — сделано!
Разбор полета
Рассмотрим каждую функцию в отдельности.
Настройка портов ввода/вывода происходит очень просто — в регистр DDRx (где x — буква, обозначающая порт) записивается число, каждый бит которого означает, будет ли соответствующий пин устройством ввода (соответствует 0) либо вывода (соответствует 1). Таким образом, заслав в DDRB и DDRD число 0xFF, мы сделали B и D портами вывода. Соответственно, команда DDRC = 0b11100000; превращает первые 5 пинов порта C во входные пины, а оставшиеся — в выходные. Команда PORTC |= 0b00011111; включает внутренние подтягивающие резисторы на 5 входах контроллера. Согласно схеме, к этим входам подключены кнопки, которые при нажатии замкнут их на землю. Таким образом контроллер понимает, что кнопка нажата.
Далее следует настройка двух таймеров, Timer0 и Timer1. Первый мы используем для обновления индикаторов, а второй — для обратного отсчета времени, предварительно настроив его на срабатывание каждую секунду. Подробное описание всех констант и метода настройки таймера на определенноый интервал можно найти в документации к ATmega8.
При срабатывании таймера управление передается соответствующему обработчику прерывания. В нашем случае это обработчик TIMER0_OVF_vect, который вызывает процедуру вывода времени на индикаторы, и TIMER1_COMPA_vect, который обрабатывает обратный отсчет.
Вывод на индикаторы
Функция display использует метод динамической индикации. Дело в том, что каждый отдельно взятый индикатор имеет 9 контактов (7 для управления сегментами, 1 для точки и 1 для питания). Для управления 4 цифрами понадобилось бы 36 контактов. Слишком расточительно. Поэтому вывод разрядов на индикатор с несколькими цифрами организован по следующему принципу:
Напряжение поочередно подается на каждый из общих контактов, что позволяет высветить на соответствующем индикаторе нужную цифру при помощи одних и тех же 8 управляющих контактов. При достаточно высокой частоте вывода это выглядит для глаза как статическая картинка. Именно поэтому все 8 питающих контактов обоих индикаторов на схеме подключены к 8 выходам порта D, а 16 управляющих сегментами контактов соединены попарно и подключены к 8 выходам порта B. Таким образом, функция display с задержкой в 0.25 мс попеременно выводит нужную цифру на каждый из индикаторов. Под конец отключаются все выходы, подающие напряжение на индикаторы (команда PORTD = 0; ). Если этого не сделать, то последняя выводимая цифра будет продолжать гореть до следующего вызова функции display, что приведет к ее более яркому свечению по сравнению с остальными.
Прототип был собран на макетной плате:
После тестирования прототипа пришло время все это добро разместить в корпусе, обеспечить питание и т.д.
Ниже показан окончательный вид устройства. Часы питаются от 9-вольтовой батарейки типа “Крона”. Потребление тока — 55 мА.
Заключение
Что такое чип памяти и как программировать микросхемы
Главная страница » Что такое чип памяти и как программировать микросхемы

Микросхемы разного назначения применяются в составе электроники современной техники. Огромное многообразие такого рода компонентов дополняют микросхемы памяти. Этот вид радиодеталей (среди электронщиков и в народе) зачастую называют просто – чипы. Основное назначение чипов памяти – хранение определённой информации с возможностью внесения (записи), изменения (перезаписи) или полного удаления (стирания) программными средствами. Всеобщий интерес к чипам памяти понятен. Мастерам, знающим как программировать микросхемы памяти, открываются широкие просторы в области ремонта и настройки современных электронных устройств.
О чипах – микросхемах хранения информации
Микросхема памяти — это электронный компонент, внутренняя структура которого способна сохранять (запоминать) внесённые программы, какие-либо данные или одновременно то и другое. По сути, загруженные в чип сведения представляют собой серию команд, состоящих из набора вычислительных единиц микропроцессора.
Следует отметить: чипы памяти всегда являются неотъемлемым дополнением микропроцессоров – управляющих микросхем. В свою очередь микропроцессор является основой электроники любой современной техники.

Таким образом, микропроцессор управляет работой электронной техники, а чип памяти хранит сведения, необходимые микропроцессору. Программы или данные хранятся в чипе памяти как ряд чисел — нулей и единиц (биты). Один бит может быть представлен логическими нулем (0) либо единицей (1).
В единичном виде обработка битов видится сложной. Поэтому биты объединяются в группы. Шестнадцать бит составляют группу «слов», восемь бит составляют байт — «часть слова», четыре бита — «кусочек слова».
Программным термином для чипов, что используется чаще других, является байт. Это набор из восьми бит, который может принимать от 2 до 8 числовых вариаций, что в общей сложности даёт 256 различных значений.
Для представления байта используется шестнадцатеричная система счисления, где предусматривается использование 16 значений из двух групп:
Поэтому в комбинациях двух знаков шестнадцатеричной системы также укладываются 256 значений (от 00h до FFh). Конечный символ «h» указывает на принадлежность к шестнадцатеричным числам.
Организация микросхем (чипов) памяти
Для 8-битных чипов памяти (наиболее распространенный тип) биты объединяются в байты (8 бит) и сохраняются под определённым «адресом». По назначенному адресу открывается доступ к байтам. Вывод восьми битов адреса доступа осуществляется через восемь портов данных.

Например, 8-мегабитный чип серии 27c801 имеет в общей сложности 1048576 байт (8388608 бит). Каждый байт имеет свой собственный адрес, пронумерованный от 00000h до FFFFFh (десятичное значение 0 — 1048575).
Помимо 8-битных чипов памяти, существуют также 16-битные чипы памяти. Есть микросхемы последовательного доступа, характеризуемые как 1-битные и 4-битные чипы памяти. Правда, последние из отмеченных микросхем теперь уже практически не встречаются.
Микросхемы памяти EPROM (серия 27… 27C …)
Термином «EPROM» зашифрована аббревиатурой техническая характеристика микросхем — стираемая программируемая память только читаемая (Erasable Programmable Read Only Memory). Что это значит в деталях?

Несмотря на расшифровку куска аббревиатуры – «только для чтения» (Read Only Memory), информация доступна для стирания и перезаписи, но только с помощью программатора. Часть аббревиатуры — «Erasable», сообщает о возможности стирания данных.
Структура чипов серии 27… 27C… поддерживает стирание информации методом воздействия на ячейки хранения интенсивным ультрафиолетовым излучением (длина волны 254 нм). Обозначение аббревиатуры «программируемый» (Programmable) указывает на возможность программирования, когда любая цифровая информация может быть заложена в чип.
Для программирования чипов требуется программатор. К примеру, 27 серия успешно прошивается устройствами «Batronix Eprommer» или «Galep-4».

Тип памяти серии 27… 27C… сохраняет записанные программатором данные до следующего программирования с функцией стирания или без таковой. Допускается многократное программирование без стирания, при условии изменения битов только от состояния единицы до состояния нуля или имеющих состояние нуль.
Если же требуется запрограммировать чип памяти с изменением бита от состояния нуля до состояния единицы, прежде необходимо применить функцию стирания. Такая функция предусмотрена в конструкциях микросхем.
Конфигурация исполнения серии 27…, 27C..
Микросхемы 27 серии выпускаются с окном из кварцевого стекла для засветки ультрафиолетом или без окна. Конфигурация чипа без окна не поддерживает функцию ультрафиолетового стирания. Такой тип микросхем (без окна) относят к чипам EPROM, которые программируются за один раз. Маркируются чипы как OTP (One Time Programmable) — одноразовое программирование.

На устройствах с окном после стирания ультрафиолетом и последующего программирования, кварцевое окно закрывают наклейкой. Так защищают данные от возможного повреждения светом.
Солнечные лучи содержат ультрафиолет, а это значит – свет солнца способен стирать информацию, записанную в микросхеме. Правда, чтобы полностью стереть данные солнечным светом, потребуется несколько сотен часов прямого воздействия солнечных лучей.
Также следует отметить особенности EPROM серии 27C… Символ «С» в данном случае указывает на принадлежность чипа к семейству CMOS (Complimentary Metal Oxide Semiconductor) — комплементарный метал-оксидный полупроводник.
Этот вид микросхем памяти отличается сниженной производительностью по отношению к семейству NMOS (N-channel Metal Oxide Semiconductor) — N-канальный метал-оксидный полупроводник.
Кроме того, серия 27C требует меньшего напряжения питания (12,5В). Между тем обе конфигурации исполнения совместимы. Поэтому, к примеру, микросхема 2764 вполне заменима на чип 27C64.
Микросхемы памяти EEPROM серии 28C…
Здесь первое отличие заметно в аббревиатуре типа памяти – EEPROM, что означает электрически стираемое программируемое постоянное запоминающее устройство (Electrically Erasable Programmable Read Only Memory).
Построение этой серии практически идентично 27 чипам. Однако 28 серия позволяет стирать отдельные байты или всё пространство памяти электрическим способом, без применения ультрафиолета.

Поскольку отдельные байты можно стереть, не удаляя всю хранимую информацию, эти отдельные байты могут быть перезаписаны. Однако процесс записи EEPROM занимает больше времени, чем программирование EPROM. Разница до нескольких миллисекунд на байт.
Чтобы компенсировать этот недостаток, чипы подобные AT28C256, оснащаются функцией блочного программирования. При таком подходе к программированию, одновременно (блоком) загружаются 64, 128 или 256 байт. Блочный способ сокращает время программирования.
Чипы памяти FLASH EEPROM серии 28F …, 29C …, 29F …
Эти чипы можно стирать электрически — полностью или блоками, а некоторые (подобные AT28C …) могут программироваться блоками.
Между тем Flash-память не всегда применимо использовать в качестве замены обычного чипа. Причины, как правило, заключаются в разной конфигурации корпусного исполнения.

Простой пример, когда Flash-память доступна только в корпусах на 32 контакта или более. Поэтому, допустим, чип 28F256 на 32 вывода не совместим с чипом 27C256, имеющим 28 контактных выводов. При этом микросхемы имеют одинаковый объём памяти и другие параметры, подходящие для замены.
Чипы EEPROM с последовательным доступом (24C …, 25C …, 93C …)
Микросхемы памяти с последовательным интерфейсом отличаются тем, что вывод данных и наименование имен в них происходят частями (последовательно).
Последовательный процесс позволяет получить доступ только к одному биту за раз, и доступный адрес также передаётся по битам. Но последовательное программирование имеет явное преимущество в плане конфигурации корпусов.

Это преимущество успешно используется. Практически все EEPROM последовательного доступа изготавливаются в виде 8-контактных малогабаритных микросхем. Такое исполнение корпуса видится более практичным, удобным.
Запоминающие устройства ОЗУ серии 52 …, 62 …, 48Z …, DS12 …, XS22 …
Аббревиатура ОЗУ (RAM) расшифровывается как «память произвольного доступа» (Random Access Memory). Также микросхемы серии 52 …, 62 … и подобные часто характеризуются «оперативными запоминающими устройствами».
Их отличительные черты – скоростная запись без необходимости предварительного стирания. Здесь видится некоторое преимущество относительно других изделий. Но есть и недостаток – чипы ОЗУ отмеченной и других серий утрачивают все записанные и сохранённые данные при отключении питания.
Однако имеется альтернатива – память NVRAM (Non Volatile Random Access Memory) – энергонезависимая память серий 48, DS, XS и подобная, с произвольным доступом. Этот вид чипов выделяется среди основных преимуществ микросхем RAM высокой скоростью перезаписи и простым программированием. Потеря питания не оказывает влияние на сохранённую информацию.

Как же способом достигается энергетическая независимость NVRAM? Оказывается, производителями используются две методики:
Для первого варианта: при отключении питания происходит автоматический переход на внутренний источник энергии. По словам производителей чипов с АКБ, энергии встроенного уникального аккумулятора вполне достаточно на 10 лет работы.
Для второго варианта: технология предусматривает копирование данных пространства памяти NVRAM на встроенное пространство EEPROM. Если утрачивается питание, копия информации остаётся нетронутой и после восстановления энергии, автоматически копируется на NVRAM.
Маркировка и взаимозаменяемость компонентов
Выведенная на корпусе маркировка чипа памяти традиционно содержит:
Также на корпусах нередко отмечаются сведения о производителе. Независимо от производителя, многие микросхемы памяти совместимы.

Также микросхемы памяти должны иметь одинаковый размер (объём) и равноценное или меньшее время доступа. Желательно выбирать корпус, подходящий по температурному диапазону. Следует отметить: размер памяти задается в битах, не в байтах. За цифрой объёма обычно следует обозначение версии (например, «F»).
Далее, через дефис, отмечается максимально разрешенная скорость доступа в наносекундах — время задержки между циклами ввода адреса и вывода данных на порты чипа памяти. Время задержки обозначается двумя цифрами (например, «70» соответствует 70 нс, а вот «10» соответствует 100 нс). Наконец, завершают маркировку изделия тип корпуса и допустимый диапазон температур.
Пример расшифровки маркировки микросхемы памяти M27C1001-10F1:
Из практики программирования запоминающих устройств
На видео ниже демонстрируется пример из практики инженера-электронщика, касающийся программирования специальных чипов, наделённых функционалом электрической «памяти»:
При помощи информации: Batronix












