26 August 2008

О микроконтроллерах

Computer hardware
Около 55% проданных в мире процессоров приходится на 8ми битные микроконтроллеры. Более 4 млрд. 8ми битных микроконтроллеров продано в 2006. Они установлены в микроволновках, стиральных машинах, музыкальных центрах… При этом они являются однокристальными компьютерами, со своим процессором, памятью, портами ввода-вывода. В статье я постараюсь кратко объяснить что это за звери и как их приручают.

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

Микроконтроллер – это однокристальная ЭВМ. В 1971 придумали разместить всю обвязку процессора (ОЗУ, контроллеры портов, ПЗУ и т.д.) на одном чипе. В 1980 intel уже выпускает первый микроконтроллер. На сегодняшний момент на чипе микроконтроллера содержится процессор, flash память для программ, объемом 1К – 256K; 32 B — 8KB SRAM (ОЗУ); 64 B – 4KB EEPROM. Тактовая частота 1 – 16 Мгц. Конечно же цифры только примерные, всё зависит от производителя и модели. Таким образом микроконтроллер имеет гарвардскую архитектуру, т.е. раздельные памяти данных и программ.

Естественно без холивара не обошлось и тут. На рынке примерно по 30% занимают контроллеры разных производителей и архитектур. Старое семейство MCS-51 (8051), семейство PIC от фирмы microchip и семейство AVR от фирмы Atmel. Всяческие специализированные микроконтроллеры мы не рассматриваем. (Есть кстати даже наш, отечественный микроконтроллер КР1878ВЕ1 (An15E03) от фирмы Ангстрем, только для него пишут и на нем разрабатывают устройства военные и законченные гики, т.к. нет ни развитой поддержки, ни инструментария). На тех форумах, что я обитаю, подавляющим большинством используются микроконтроллеры фирмы atmel, поэтому дальнейшее повествование будет в основном о них. Глобально они от PIC и других не отличаются, различия лишь в параметрах (скорость, количество команд, памяти, наличие перефирии…).

Причины использования микроконтроллеров.

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

На чем программируется микроконтроллер?

Исторически основной язык – ассемблер. В частности КР1878ВЕ1 программируется только на ассемблере. Для других микроконтроллеров существую компиляторы для языка Си. Для atmelовских микроконтроллеров существует опенсорсный компилятор WinAVR (порт gcc). Также есть компилятор для бейсика Bascom AVR, и даже для языка Forth. Изначально архитектура микроконтроллеров AVR была оптимизирована для того, что бы программы написанные на Си выполнялись быстрее.

Рассмотрим на примере.
Давайте возьмем микроконтроллер ATMEGA8 и на его примере рассмотрим что он может.
За 28 руб. (опт) / 41 руб. (розн) мы получаем чип, который содержит в себе:
• 8 ми битный RISC процессор, 130 команд, большая часть из которых выполняется за 1 такт, 32 регистра общего назначения. Производительность до 16 MIPS при 16 Мгц.
• 8К flash памяти для программ, 512 байт EEPROM памяти, 1K SRAM
• Два 8ми битных и один 16 битный таймер (позволяют формировать импульсы заданной длительности/ подсчитывать импульсы автономно, не отвлекая CPU)
• 3 канала ШИМ
• 8ми канальный АЦП
• Аппаратный модуль Two Wire Interface (клон I2C)
• Модуль USART
• Аналоговый компаратор.
• 23 линии ввода/вывода
Подробно всё описано в даташите к этому микроконтроллеру: www.atmel.com/dyn/resources/prod_documents/doc2486.pdf (308 стр, англ.). Среди выпускаемых фирмой Atmel это не самый слабый и не самый крутой микроконтроллер.
Так как количество ножек у микросхемы ограничено, то практически все имеют по 2 функции, переключаемые программно.
Линии ввода-вывода объединены группами по 8 в порты, именуемые PORTA, PORTB и т.д. Управление портами и встроенной периферией производится путем записи и чтения данных из специальных регистров. Так например что бы выставить высокий логический уровень (+5 В) на третьей линии порта A нужно выставить третий бит в регистре PORTA вот так:
PORTA |= (1<<3);
А для того что бы например измерить уровень сигнала на 1 выводе АЦП нужно:

ADCSRA |= (1<<6); //устанавливаем бит ADSC который запускает процесс измерения
//процесс преобразования занимает около 13 тактов
Result = ADCW; //забираем результат из соответствующего регистра.


Работа с остальными модулями микроконтроллера (USART, TWI, таймеры) примерно такая же – выставить нужные биты, что бы их настроить, и забрать/записать данные в специальные регистры.

У микроконтроллера развитая система прерываний. Что бы не нагружать процессор постоянной проверкой состояния (завершилось ли преобразование АЦП, достиг ли счётчик таймера требуемого значения, поступил ли сигнал на порт) включаются прерывания на соответствующие события и пишутся обработчики прерывания.
Программа микроконтроллера представляет собой бесконечный цикл. Вот например программа которая будет мигать светодиодом, подключенным в 3 ноге порта A:

#include <delay.h>
void main (void)
{
while(1)
{
PORTA |= (1<<3); //основная программа
delay_ms(100);
PORTA &= ~(1<<3);
delay_ms(100);
};
};


Таким образом видно, что ничего сложного в микроконтроллерах нет, и практически каждый при желании может делать необходимые для себя гаджеты, как например часы-полка, опубликованные на хабрахабре недавно. Также я недавно видел как на базе платформы Arduino (тот же микроконтроллер только распаянный на плате и кучей клемм для подключения внешней нагрузки) сделали дверной звонок, работающий с твиттером (http://rooreynolds.com/2008/05/14/hacking-the-doorbell/) Благодаря тому, что силами энтузиастов созданы библиотеки для работы с распространенными узлами (LCD экраны, термометры…) срок и сложность разработки сильно сокращаются. В следующей статье я покажу как за 1,5 дня сделать электронные часы на микроконтроллере.
Tags:DIYмикроконтроллерыликбез
Hubs: Computer hardware
+81
14.9k 94
Comments 101
Popular right now
Hyperscale - Performance Engineer
from 150,000 to 350,000 ₽Rubrain.comRemote job
Wireless Systems Engineer
from 100,000 to 200,000 ₽ON SemiconductorСанкт-Петербург
Программист BIOS
from 160,000 ₽AquariusМосква
Golang back-end developer, full-time, remote
from 90,000 to 150,000 ₽Midas.InvestmentsRemote job
DevOps Engineer (Кипр)
from 3,500 to 4,000 €WisebitsМосква