Как я начинал прграммировать микроконтроллеры AVR
Как я начинал прграммировать микроконтроллеры AVR
АВТОР: ADMIN | 11 ОКТЯБРЯ 2011
Привет всем тем кто решил начать программировать контроллеры AVR. В этой и последующих статьях я буду подробно рассказывать как я начинал программировать микроконтроллеры AVR при помощи программы компилятора CodeVisionAVR. Почему ее, да черт ее знает) Писать программы будем на языке С.
Для начала оговорюсь. Данные статьи будут расчитаны на людей которые впервые взяли в руки микроконтроллер или вообще только думают брать его или нет. Так что если знатоки будут читать, то попрошу без сарказма. Изложенный материал будет по принципу, вот ту фитюлину туда и будет вот это. Я просто не понимаю людей которым задаешь вопрос типа: а как сделать бегущую строку из восьми светодиодов, а в ответ получаешь кусок какого-то кода и фразу типа "Ну тут и чайник разберется". Поэтому здесь все будет разжевано и положено в рот.
И так начнемс)
Микроконтроллер - шо це за зверюга? Да это просто обычный компьютер запиханный в микросхему. О как. Да да именно так. На этой микросхеме имеется: ЦПУ, АЛУ, память программ, EEPROM (электрически перепрограммируемая память), ОЗУ, порты ввода/вывода, UART (в компе это COM порт). Ну и куча еще полезной периферии. Вся эта система может работать на частоте до 16 МГц. Ну что так мало-то скажете Вы))) Да, для Intel i7 мало, а для тех функций, ради которых создавались микроконтроллеры этого с лихвой достаточно. Ведь зачем гигагерцы для управления скажем стиральной машиной. Или к примеру захотим мы управлять люстрой при помощи ИК пульта от ТВ. Ну зачем нам гигагерцы? Так что для практически любых извращений с микроконтроллером, нам этих частот хватит с лихвой.
Рассматривать все примеры будем на микроконтроллере ATmega8. Я выбрал его так как он дешевый, легко доступный, ну и просто он мне нравится).
Вот он как выглядит.
Такой корпус называется PDIP. Еще бывают в корпусах TQFP, но с ним для начинающих будут проблемы) Вот как он выглядит.
Жутко, да? Вот и я про тоже. Так что давайте будем работать с PDIP корпусом. Ну прежде чем начать программить, давайте разберемся с микросхемой, что куда и зачем. Для начала давайте взглянем на схему выводов.
Поехали с самого начала.
1. PC6 (RESET) - эта ножка является шестым битом порта "С" и одновременно выполняет роль сброса микроконтроллера (МК). Сброс происходит если на этой ноге удержать логическую единицу больше 30 мс. При этом МК перезагрузится, то есть все регистры сбросятся и контроллер начнет выполнять программу с начала.
2. PD0 (RXD) - эта ножка является нулевым битом порта "D" и одновременно выполняет роль приемника для UART. О нем мы потом отдельно поговорим, когда будем соединять наш микроконтроллер с компьютером.
3. PD1 (TXD) - эта ножка является первым битом порта "D" и одновременно выполняет роль передатчика для UART. О нем мы тоже отдельно поговорим, когда будем соединять наш микроконтроллер с компьютером.
4. PD2 (INT0) - эта ножка является вторым битом порта "D" и одновременно выполняет роль внешнего прерывания с номером 0. То есть если мы разрешим прерывания, то нам нужно будет задать значение при котором будет возникать прерывание и обработать его. К примеру мы скажем что если на этой ножке появится логическая единица, то должно сработать прерывание. Это означает что если на ноге появилась логическая единица, то основная программа тут же прекращает работу, данные и адрес последней команды заносятся в стек и контроллер передает работу обработчику прерывания. Обработчик прерывания - это некая функция которая написана нами, к примеру включение светодиода подключенного к одной из ножек МК. А после выполнения этой функции, МК вытаскивает из стека все обратно и продолжает выполнения основной программы с того же места где ее прервали. Ну это так на пальцах, подробнее мы рассмотрим позже.
5. PD3 (INT1) - эта ножка является третьим битом порта "D" и одновременно выполняет роль внешнего прерывания с номером 1. То же что и предыдущее.
6. PD4 (XCK/T0) - эта ножка является четвертым битом порта "D" и одновременно выполняет роль входа/выхода внешнего тактового сигнала USART. Это нужно для работы с синхонным/асинхронным приемо-передатчиком. А так же входом внешнего тактового сигнала таймера/счетчика Т0. Я думаю что на пальцах объяснять цель Т0 не надо. Из название все понятно, но для тех кто не понял мы обязательно подробно о нем поговорим позже.
7. VCC - это питание МК. То есть +5в заводим сюда.
8. GND - это тоже относится к питанию МК. То есть общий провод сюда (который -)
9. PB6 (XTAL1/TOSC1) - эта ножка является шестым битом порта "В" и одновременно выполняет роль входа для подключения внешнего резонатора.
10. PB7(XTAL2/TOSC2) - эта ножка является седьмым битом порта "В" и одновременно выполняет роль выхода для подключения внешнего резонатора.
11. PD5 (T1) - эта ножка является пятым битом порта "D" и одновременно выполняет роль входа внешнего тактового сигнала таймера/счетчика Т1
12. PD6 (AIN0) - эта ножка является шестым битом порта "D" и одновременно выполняет роль положительного входа компартора
13. PD7 (AIN1) - эта ножка является седьмым битом порта "D" и одновременно выполняет роль отрицательного входа компартора
14. PB0 (ICP1) - эта ножка является нулевым битом порта "B" и одновременно выполняет роль входа захвата таймера/счетчика Т1
15. PB1 (OC1A)- эта ножка является первым битом порта "B" и одновременно выполняет роль выхода А таймера/счетчика Т1
16. PB2 (SS/OC1B)- эта ножка является вторым битом порта "B" и одновременно выполняет роль выбора slave-устройства в канале SPI, а так же входа В таймера/счетчика Т1
17. PB3 (MOSI/OC2)- эта ножка является третьим битом порта "B" и одновременно выполняет рольвыхода Master или входа Slave данных канала SPI, а также выхода таймера/счетчика Т2
18. PB4 (MISO)- эта ножка является четвертым битом порта "B" и одновременно выполняет роль входа Master или выхода Slave данных канала SPI
19. PB5 (SCK)- эта ножка является пятым битом порта "B" и одновременно выполняет роль выхода Master или входа Slave тактового сигнала SPI
20. AVCC- это вывод источника питания АЦП
21. AREF- это вход опорного напряжения для АЦП
22. GND- это аналоговый общий вывод
23. PC0 (ADC0)- эта ножка является нулевым битом порта "С" и одновременно выполняет роль входа АЦП канала 0
24. PC1 (ADC1)- эта ножка является первым битом порта "С" и одновременно выполняет роль входа АЦП канала 1
25. PC2 (ADC2)- эта ножка является вторым битом порта "С" и одновременно выполняет роль входа АЦП канала 2
26. PC3 (ADC3)- эта ножка является третьим битом порта "С" и одновременно выполняет роль входа АЦП канала 3
27. PC4 (ADC4/SDA)- эта ножка является четвертым битом порта "С" и одновременно выполняет рольвхода АЦП канала 4, а также линии данных модуля TWI
28. PC5 (ADC5/SCL)- эта ножка является пятым битом порта "С" и одновременно выполняет роль входа АЦП канала 5, а также линии тактового сигнала модуля TWI
Ну вот вроде и пробежались по назначениям выводов. Если что-то непонятно, а такое точно есть, не расстраивайтесь позже все встанет на свои места. Теперь давайте рассмотрим стандартную схему обвязки, без которой МК не заработает.
На схеме показаны кварц с конденсаторами и подключение питания 5 вольт. Эта схема минимальна но достаточно чтобы МК стартанул и начал работать. В дальнейших схемах я не буду указывать питание, будем считать что оно есть как само собой разумеющееся. Соответственно нога 7 это +5 в, а нога 8 общий провод. Можно еще добавить между 7-й и 8-й ногой электролит на 1000 мкФ.
Ну вот и разобрались с подключением. В следующей статье рассмотрим примеры программирования. Напишем простенькую программку и заставим ожить наш МК.
While(условие)
{
Тело цикла
};
Сначала цикл проверяет условие. Если условиеравноtrue (правда), это любое значение кроме 0илиfalse(ложь), то цикл выполняет по кругу все операторы которые расположены внутри его тела, то есть между фигурными скобками до тех пор пока условие истенно. Как только условие стало равно 0илиfalse(ложь), то цикл тут же прекращает выполнять операторы в своем теле и передает работу следующему за ним оператору. Короче цикл проверяет условие, ели правда то выполняет все операторы по очереди в своем теле, а потом снова смотрит условие. Если правда то выполняет все операторы еще раз. И так до тех пор пока условие не станет неправдой.
Возвращаемся к нашим баранам. Строка под номером 1 while(!PINB.0); В скобках стоит условие !PINB.0. Шо сиё означает? Восклицательный знак как бы переворачивает значение в другую сторону. Можно перевести его как приставку НЕ.Если в условии написано !true подставляем приставку НЕ и получаемНЕправда то есть ложь.Надпись PINB.0говорит МК чтобы тот прочитал из порта В со входа 0 значение. Так как у нас к нему подключена кнопка, то мы можем получить значение либо 0, либо 1. Если кнопка не нажата, то значение 0, а если нажата, то 1 (если не понятно смотрим схему). Отсюда становиться понятно смысл цикла. Так как у цикла нет тела, то он просто будет проверять условие и ждать до тех пор пока оно не станет ложью и гордо выйдет из него. Раз мы условились что при отжатой кнопке у нас на входе 0, а это для цикла ложь, то тут нам и поможет восклицательный знак. Пока кнопка не нажата цикл считает что это правда и крутится по кругу, но как только мы нажали на кнопку, условие сменилось на правду с восклицательным знаком, то есть стала ложью и цикл передал работу следующему за ним оператору. Это строка под номером 2. Рассмотрим ее.
Оператор условия:
If(условие)
{
Else
{
Clock Value ну тут задается делитель тактовой частоты. Естественно данный пункт работает только с частотой кварца, а не с внешними генераторами. И что мы тут видим? Да собственно ничего, какие-то цифры и все. Так вот эти цифры и есть частоты деленные на коэффициент деления. Их всего 5. Первый равен единице, то есть деления нет. Вот мы и видим наши чистые 4 МГц. Второй равен 8. Разделим 4 МГц на восемь и получим 500 КГц. Третий равен 64. Разделим 4 МГЦ на 64 и получим 62,5 КГц. Четвертый 256. Разделим 4 МГЦ на 256 и получим 15,625 КГц. И последний равен 1024. Разделим 4 МГц на 1024 и получим 3906,25 Гц, а принимают как 3,906 КГц. Вот что означают эти непонятные цифры. При выборе других частот кварца, программа сама все разделит и цифры поменяются.
3. Mode здесь задается режим работы таймера. Либо обычный Normal top=FFFFh, либо в режиме ШИМ. Нам потребуется обычный режим, поэтому ничего менять здесь не надо.
Input Capt здесь определяется фронт по которому произойдет захват таймера, и есть возможность подавления шума. Эти два пункта вы можете использовать если захотите собрать частотомер, а так нам и этот пункт тоже не нужен. Поэтому галочку ставить не надо.
6. Interrupt Con слово interrup в переводе с английского означает прервать. Я перевел для того чтобы в будущем если встретите это слово, то чаще всего оно будет означать прерывание. Что такое прерывание? Когда процессор выполняет работу основной программы, то он шаг за шагом выполняет команды. Но бывают моменты, когда требуется все бросить и выполнить некую, коротенькую подпрограммку, и прямо сейчас. Что делать. Вот тут и вступают в силу так называемые вектора прерывания. Это аппаратно генерируемые сигналы которые говорят процессору все бросить и срочно выполнить какое-то задание. К примеру ваш МК выполняет какую-то программу, но вам нужно получить данные температурного датчика при возникновении не штатной ситуации. Например превышение температуры в котле. Термостат сгенерировал вам импульс. А откуда вы узнаете когда это произошло– Не проверять же постоянно приходящий сигнал. Это занимает машинные циклы, что вызывает к увеличению времени выполнения программы. Так вот давайте отдадим эту слежку кусочку микросхемы, которая при получении данного сигнала и постучит по плечу трудового процессора и скажет ему, дружок, те срочно нужно выполнить подпрограммку, а по нашему примеру вычитать температуру и после этого вернутся в основную программу к тому месту где ее бросил. То есть прерывание дают возможность процессору работать не задумываясь о внешних событиях, а обрабатывать их лишь по происшествию последних. Вот и здесь выставляется галочка которая отвечает за включение или выключения обработка прерывания, которое создаст наш таймер. Но тут есть еще одно но. Я распинаться обо всех системах не буду, это долго. Давайте просто выберем из списка прерывание под названием Compare A Match и поставим галочку. Слово Compare переводиться как сравнивать. То есть мы сказали программе что если значения нашего счетчика А будет равно заданному значению, то сгенерится прерывание и наш МК гордо бросит основную программу и выполнит прерывание.
И так. Давайте продолжим наше знакомство с микроконтроллером Atmega 8. В этой статье я постараюсь наиболее подробно и понятно рассказать как работать с ЖК дисплеем. Дисплей будет у нас самый простой со знакогенератором в две строки по 16 символов. Управлять будем дисплеем при помощи библиотечных функций любезно предоставленными нам разработчиками программы CodeVisionAVR.
Работа программы в МК это конечно хорошо, но какая польза от такой работы если мы не можем увидеть ее в действии. Конечно можно присоединить к выходным ножкам МК разные устройства: моторы, реле, светодиоды и т. д. Но все же хочется глазами взглянуть на саму программу. Ну к примеру, как вы себе представляете ПК без монитора. Ну ни как. Вот и здесь также можно сделать подобие монитора. Почему подобие? Да потому что ЖК имеет только знакогенератор и все. Можно выводить только знаки и никакой графики. Да, можно и графический дисплей прикрутить, но это в следующей статье.
Нус начнем. Что такое ЖК дисплей со знакогенератором? Смотрим на картинку.
Вот так выглядит наш подопытный зверь. Что мы видим. Плата с припаянным на ней жидко-кристаллическим дисплеем и ряд контактных площадок для подключения питания, данных и команд. Управляет всем этим чудом контроллер типа HD44780. Этот контроллер для ЖК как IBM совместимость для ПК. Да, да. Если вы видите что ЖК работает на контроллере совместимом с HD44780, то можно смело говорить: "Я знаю команды этого МК", при этом даже не зная фирмы изготовителя. Я уверяю вас, команды все одинаковы. К примеру возьмем наш отечественный ЖК фирмы "МЭЛТ". На его борту установлен контроллер КБ1013ВГ6 фирмы "Ангстрем", а по сути дела это тот же HD44780. Просто "Ангстрем" сделали его аналог, а команды у него такие же как и у HD44780. Ну вроде по железу пока все. А нет! Есть у всех ЖК дисплеев одно проблема. Нумерация и расположение контактных площадок и их назначения могут сильно различаться. Но изучив один ЖК можно на остальные лишь искать цоколевку и все.
Давайте рассмотрим эти самый контактные площадки. Чаще всего их насчитывается 16 штук.
1. GND (VSS) | Общий ввод (0В) |
2. UCC (VDD) | Напряжение питания (+5В) |
3. V0 (VEE) | Управление контрастностью |
4. A0 (RS) | Выбор сигнал/команда |
5. R/W (RW) | Выбор чтение/запись |
6. E | Разрешение обращения к модулю (строб данных) |
7. DB0 (D0) | Шина данных/команд бит 0 |
8. DB1 (D1) | Шина данных/команд бит 1 |
9. DB2 (D2) | Шина данных/команд бит 2 |
10. DB3 (D3) | Шина данных/команд бит 3 |
11. DB4 (D4) | Шина данных/команд бит 4 |
12. DB5 (D5) | Шина данных/команд бит 5 |
13. DB6 (D6) | Шина данных/команд бит 6 |
14. DB7 (D7) | Шина данных/команд бит 7 |
15. +LED (A) | + питание подсветки |
16. -LED (K) | - питания подсветки |
Я думаю что описания в таблице достаточно информативно и расписывать каждое я не буду. Остановлюсь лишь на питании подсветки. В цепь ставьте обязательно токоограничивающий резюк где-то на 330-470 Ом. А то в мануале ничего не было написано и я с радостью спалил светодиоды. Когда просмотрел разводку на плате, то резисторов там не нашел :) Вот так бывает.
Теперь давайте посмотрим на схему подключения.
Здесь все просто. Слева три входа ЖК это схема питания и регулировки контраста. Далее три входа RS RW E. Ну с этим тоже все понятно, а вот почему линии данных/команд всего четыре. Тут все просто. Управляющий контроллер позволяет работать как по 8-ми битной шине, так и по 4-х битной. Ну вот так придумали. Так как мы будем работать с библиотеками CodeVisionAVR, то нам потребуются лишь 4-х битная схема. Схема подключения на картинке не спроста именно такая. Она заточена под работу с библиотеками. Если использовать версию программы старше 2.05.0, то со всеми ЖК, библиотеки будут работать толькопо данной схеме. Более младшие версии могут устанавливать любой расклад подключения, что благоприятно влияет на трассировку будущих плат.
Ну что, схема готова. Теперь давайте попробуем что-нибудь вывести на экран. Открываем программу CodeVisionAVR и создаем новый проект с чипом Atmega8 и частотой кварца 4 МГц. Далее переходим во вкладку LCD.
Во всплывающем менюLCD Port:выбираем порт В. Ведь мы к нему подключились. Далее выбираем количество знаков в строке, пункт Chars./Line:16 штук. Ведь ЖК у нас на 2 строки по 16 знаков. Ниже приведены как раз те линии соединения про которые я говорил. Если вы их сравните со схемой, то увидите что они совпадают. Их программа вывела лишь для справки и поменять их никак нельзя. Если конечно у вас версия программы 0.05.0 или выше, то там можно выбрать на свой вкус, но мы пока поработаем с версией 0.04.4a. Теперь сохраняем проект как это было описано в части номер 2.
Давайте рассмотрим что создала нам программа.
#include <mega8.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
Первая строка подключает файл с данными о всех адресах портов и регистрах МК. Вторая строка разрешает писать программу на ассемблере. Третья прописывает порт В, к которому мы подключили МК. Четвертая закрывает работу с ассемблером. И в последней строке подключается файл для работы с ЖК. При помощи этого файла мы сможем работать с ЖК довольно просто используя библиотечные функции. Давайте теперь спустимся в самый низ программы.
lcd_init(16);
while (1)
{
};
Что мы видим. Над основным циклом программы появилась строка lcd_init(16).Вот это как раз и одна из функций библиотеки. Данная функция вызывается один раз и выполняет инициализацию ЖК. В скобках задается количество знаков в строке. Так как наш ЖК 2 на 16, то и в скобках записано число 16. Ну вроде и все, больше генератор нам ничего не нагенерил. Вернусь к функции lcd_init(16). Данная функция проводит инициализацию ЖК, а именно включает дисплей, очищает экран, выставляет курсор в верхний левый угол и выключает его. То есть дисплей готов получать данные. Видите как все просто. Можно конечно самому на ассемблере написать функции инициализации дисплея, но зачем это делать, если уже все сделали за нас. Теперь давайте выведем что-нибудь на экран. Я не буду отходить от традиций и выведу самую распространенную фразу "Hello World"
lcd_init(16);
lcd_gotoxy(3,0);
lcd_putsf("Hello World");
while (1)
{
};
Что здесь поменялось? После функции инициализации я дописал еще две. Первая lcd_gotoxy(3,0)означает, что я хочу начать писать в первую строку пропустив 4 знака слева. Если вы заметили то отсчет начинается с 0, как строк так и знаков. То есть я данной функцией устанавливаю координаты курсора. Вторая функция выводит на экран строку занесенную в скобки. Двойные кавычки обязательно. И вот что у нас получилось.
Вот так просто можно вывести на ЖК текст. Вроде бы и на этом можно ставить точку, но как же вывести значение какой-нибудь переменной? Ведь программа например должна выводить полученную температуру или значение напряжения или еще чего. А все просто.
lcd_gotoxy(3,0);
lcd_putsf("Hello World");
lcd_gotoxy(7,1);
sprintf(string, "%i", parametr);
lcd_puts(string);
while (1)
{
};
Как видите у нас добавилось три строчки после вывода строки. Давайте рассмотрим их. Ну с координатой все понятно, седьмой символ вторая строка. Далее идет функция sprintf(string, "%i", parametr);которая помещает в строковый массив string значение переменной parametrс форматированием "%i"десятичное целое со знаком. А функция lcd_puts(string);выводит эту строку на дисплей. Главное не забудьте перед главной функцией main(),вверху программы там где прописываются глобальные переменный, прописать массив char string[17];.Почему 17 ячеек? А потому что максимальное число символов, если мы не забыли, равно 16. А при выводе строки массив должен обязательно иметь последнюю ячейку с нулем. Если мы напишем в количество ячеек массива равное 16, то при выводе 16 символов, 16-й не будет выведен. И подключите заголовочный файл #include <stdio.h>для работы со строками. Ну а переменнуюint parametr = 100;задавайте где хотите. Это зависит от вашей программы.
При форматировании используйте символы:
i | Десятичное целое со знаком |
d | Десятичное целое со знаком |
u | Десятичное целое без знака |
e | Вещественное с плавающей точкой (формат вывода [-]x.xxxxx e[-]xx) |
E | Вещественное с плавающей точкой (формат вывода [-]x.xxxxx E[-]xx) |
f | Вещественное с плавающей точкой (формат вывода [-]xxx.xxxxx) |
x | Шестнадцатеричное целое без знака (вывод символов нижнего регистра) |
X | Шестнадцатеричное целое без знака (вывод символов верхнего регистра) |
c | Символ со знаком |
Да вот еще, зайдите в настройки компилятора Project->Configureи выберите вкладку C compiler.Во всплывающей вкладке (s)printf Features: нужно выбрать float, width, precision.Это надо для работы с числами с плавающей точкой.
Ну вот вроде и все. Если возникнут вопросы, то задавайте в коментах или пишите на почту.
–
Как я начинал прграммировать микроконтроллеры AVR
АВТОР: ADMIN | 11 ОКТЯБРЯ 2011
Привет всем тем кто решил начать программировать контроллеры AVR. В этой и последующих статьях я буду подробно рассказывать как я начинал программировать микроконтроллеры AVR при помощи программы компилятора CodeVisionAVR. Почему ее, да черт ее знает) Писать программы будем на языке С.
Для начала оговорюсь. Данные статьи будут расчитаны на людей которые впервые взяли в руки микроконтроллер или вообще только думают брать его или нет. Так что если знатоки будут читать, то попрошу без сарказма. Изложенный материал будет по принципу, вот ту фитюлину туда и будет вот это. Я просто не понимаю людей которым задаешь вопрос типа: а как сделать бегущую строку из восьми светодиодов, а в ответ получаешь кусок какого-то кода и фразу типа "Ну тут и чайник разберется". Поэтому здесь все будет разжевано и положено в рот.
И так начнемс)
Микроконтроллер - шо це за зверюга? Да это просто обычный компьютер запиханный в микросхему. О как. Да да именно так. На этой микросхеме имеется: ЦПУ, АЛУ, память программ, EEPROM (электрически перепрограммируемая память), ОЗУ, порты ввода/вывода, UART (в компе это COM порт). Ну и куча еще полезной периферии. Вся эта система может работать на частоте до 16 МГц. Ну что так мало-то скажете Вы))) Да, для Intel i7 мало, а для тех функций, ради которых создавались микроконтроллеры этого с лихвой достаточно. Ведь зачем гигагерцы для управления скажем стиральной машиной. Или к примеру захотим мы управлять люстрой при помощи ИК пульта от ТВ. Ну зачем нам гигагерцы? Так что для практически любых извращений с микроконтроллером, нам этих частот хватит с лихвой.
Рассматривать все примеры будем на микроконтроллере ATmega8. Я выбрал его так как он дешевый, легко доступный, ну и просто он мне нравится).
Вот он как выглядит.
Такой корпус называется PDIP. Еще бывают в корпусах TQFP, но с ним для начинающих будут проблемы) Вот как он выглядит.
Жутко, да? Вот и я про тоже. Так что давайте будем работать с PDIP корпусом. Ну прежде чем начать программить, давайте разберемся с микросхемой, что куда и зачем. Для начала давайте взглянем на схему выводов.
Поехали с самого начала.
1. PC6 (RESET) - эта ножка является шестым битом порта "С" и одновременно выполняет роль сброса микроконтроллера (МК). Сброс происходит если на этой ноге удержать логическую единицу больше 30 мс. При этом МК перезагрузится, то есть все регистры сбросятся и контроллер начнет выполнять программу с начала.
2. PD0 (RXD) - эта ножка является нулевым битом порта "D" и одновременно выполняет роль приемника для UART. О нем мы потом отдельно поговорим, когда будем соединять наш микроконтроллер с компьютером.
3. PD1 (TXD) - эта ножка является первым битом порта "D" и одновременно выполняет роль передатчика для UART. О нем мы тоже отдельно поговорим, когда будем соединять наш микроконтроллер с компьютером.
4. PD2 (INT0) - эта ножка является вторым битом порта "D" и одновременно выполняет роль внешнего прерывания с номером 0. То есть если мы разрешим прерывания, то нам нужно будет задать значение при котором будет возникать прерывание и обработать его. К примеру мы скажем что если на этой ножке появится логическая единица, то должно сработать прерывание. Это означает что если на ноге появилась логическая единица, то основная программа тут же прекращает работу, данные и адрес последней команды заносятся в стек и контроллер передает работу обработчику прерывания. Обработчик прерывания - это некая функция которая написана нами, к примеру включение светодиода подключенного к одной из ножек МК. А после выполнения этой функции, МК вытаскивает из стека все обратно и продолжает выполнения основной программы с того же места где ее прервали. Ну это так на пальцах, подробнее мы рассмотрим позже.
5. PD3 (INT1) - эта ножка является третьим битом порта "D" и одновременно выполняет роль внешнего прерывания с номером 1. То же что и предыдущее.
6. PD4 (XCK/T0) - эта ножка является четвертым битом порта "D" и одновременно выполняет роль входа/выхода внешнего тактового сигнала USART. Это нужно для работы с синхонным/асинхронным приемо-передатчиком. А так же входом внешнего тактового сигнала таймера/счетчика Т0. Я думаю что на пальцах объяснять цель Т0 не надо. Из название все понятно, но для тех кто не понял мы обязательно подробно о нем поговорим позже.
7. VCC - это питание МК. То есть +5в заводим сюда.
8. GND - это тоже относится к питанию МК. То есть общий провод сюда (который -)
9. PB6 (XTAL1/TOSC1) - эта ножка является шестым битом порта "В" и одновременно выполняет роль входа для подключения внешнего резонатора.
10. PB7(XTAL2/TOSC2) - эта ножка является седьмым битом порта "В" и одновременно выполняет роль выхода для подключения внешнего резонатора.
11. PD5 (T1) - эта ножка является пятым битом порта "D" и одновременно выполняет роль входа внешнего тактового сигнала таймера/счетчика Т1
12. PD6 (AIN0) - эта ножка является шестым битом порта "D" и одновременно выполняет роль положительного входа компартора
13. PD7 (AIN1) - эта ножка является седьмым битом порта "D" и одновременно выполняет роль отрицательного входа компартора
14. PB0 (ICP1) - эта ножка является нулевым битом порта "B" и одновременно выполняет роль входа захвата таймера/счетчика Т1
15. PB1 (OC1A)- эта ножка является первым битом порта "B" и одновременно выполняет роль выхода А таймера/счетчика Т1
16. PB2 (SS/OC1B)- эта ножка является вторым битом порта "B" и одновременно выполняет роль выбора slave-устройства в канале SPI, а так же входа В таймера/счетчика Т1
17. PB3 (MOSI/OC2)- эта ножка является третьим битом порта "B" и одновременно выполняет рольвыхода Master или входа Slave данных канала SPI, а также выхода таймера/счетчика Т2
18. PB4 (MISO)- эта ножка является четвертым битом порта "B" и одновременно выполняет роль входа Master или выхода Slave данных канала SPI
19. PB5 (SCK)- эта ножка является пятым битом порта "B" и одновременно выполняет роль выхода Master или входа Slave тактового сигнала SPI
20. AVCC- это вывод источника питания АЦП
21. AREF- это вход опорного напряжения для АЦП
22. GND- это аналоговый общий вывод
23. PC0 (ADC0)- эта ножка является нулевым битом порта "С" и одновременно выполняет роль входа АЦП канала 0
24. PC1 (ADC1)- эта ножка является первым битом порта "С" и одновременно выполняет роль входа АЦП канала 1
25. PC2 (ADC2)- эта ножка является вторым битом порта "С" и одновременно выполняет роль входа АЦП канала 2
26. PC3 (ADC3)- эта ножка является третьим битом порта "С" и одновременно выполняет роль входа АЦП канала 3
27. PC4 (ADC4/SDA)- эта ножка является четвертым битом порта "С" и одновременно выполняет рольвхода АЦП канала 4, а также линии данных модуля TWI
28. PC5 (ADC5/SCL)- эта ножка является пятым битом порта "С" и одновременно выполняет роль входа АЦП канала 5, а также линии тактового сигнала модуля TWI
Ну вот вроде и пробежались по назначениям выводов. Если что-то непонятно, а такое точно есть, не расстраивайтесь позже все встанет на свои места. Теперь давайте рассмотрим стандартную схему обвязки, без которой МК не заработает.
На схеме показаны кварц с конденсаторами и подключение питания 5 вольт. Эта схема минимальна но достаточно чтобы МК стартанул и начал работать. В дальнейших схемах я не буду указывать питание, будем считать что оно есть как само собой разумеющееся. Соответственно нога 7 это +5 в, а нога 8 общий провод. Можно еще добавить между 7-й и 8-й ногой электролит на 1000 мкФ.
Ну вот и разобрались с подключением. В следующей статье рассмотрим примеры программирования. Напишем простенькую программку и заставим ожить наш МК.