Arduino atmega8: микроконтроллер для начинающих
Содержание
- 1 Подключение AVR микроконтроллера к программатору
- 2 Работа схемы
- 3 Платы Arduino
- 4 Atmel Studio 7 | Первая программа
- 5 Принципиальная схема устройства
- 6 Документация по языку Си и AVR Си
- 7 Что такое гибкий датчик?
- 8 Исходный код программы на языке С (Си) с пояснениями
- 9 Обозначения индексов микроконтроллеров
- 10 Порты ввода-вывода микроконтроллера
Подключение AVR микроконтроллера к программатору
Выше было рассказано что для подключения микроконтроллера к программатору нужно соединить выводы ISP: VCC, GND, MISO, MOSI, SCK, RST. Выводы с данными названиями присутствуют у всех микроконтроллеров, так что даташит нам в помощь.
Рис. 2. Распиновка микроконтроллера ATmega8 и подключение его к ISP (USB ASP).
У программатора USB ASP на коннекторе ISP предусмотрено напряжение +5В (VCC), так что для программирования чипа можно воспользоваться питанием от программатора, а вернее от USB порта к которому он подключен.
В рассмотреных раньше программаторах, что используют COM и LPT порты, нет вывода VCC, а это значит что с использованием этих программаторов на выводы GND (-) и VCC (+) микроконтроллера нужно подать напряжение питания 5В от внешнего источника.
Подключения микроконтроллера к программатору USB ASP на беспаечной макетной панели очень просто реализовать при помощи перемычек (проводники со штырьками на двух концах).
Рис. 3. Подключение к ISP коннектору программатора USB ASP на беспаечной макетной панели.
Рис. 4. Программатор USBASP подключен к микроконтроллеру ATmega8 (увеличение рисунка по клику).
Приведенного на рисунке выше подключения уже достаточно чтобы записать прошивку в микроконтроллер. По умолчанию в микроконтроллере ATmega8 используется внутренняя RC-цепочка что задает частоту тактового генератора, поэтому мы не устанавливали внешний кварц и конденсаторов.
Работа схемы
Схема для передающей стороны приведена на следующем рисунке.
В схеме необходимо сделать следующие соединения:
- Pin D7 of atmega8 -> Pin13 HT12E.
- Pin D6 of atmega8 -> Pin12 HT12E.
- Pin D5 of atmega8 -> Pin11 HT12E.
- Pin D4 of atmega8 -> Pin10 HT12E.
- Кнопка to Pin B0 of Atmega.
- Резистор 1 МОм между pin15 и 16 of HT12E.
- Pin17 of HT12E к контакту данных передающего модуля.
- Pin 18 of HT12E to 5V.
- GND pin 1-9 and Pin 14 of HT12E and Pin 8 of Atmega.
Схема для приемной стороны приведена на следующем рисунке.
В схеме необходимо сделать следующие соединения:
- Pin D7 of atmega8 -> Pin13 HT12D.
- Pin D6 of atmega8 -> Pin12 HT12D.
- Pin D5 of atmega8 -> Pin11 HT12D.
- Pin D4 of atmega8 -> Pin10 HT12d.
- LED to Pin B0 of Atmega.
- Pin14 of HT12D к контакту данных приемного модуля.
- Резистор 47 кОм между pin15 и 16 of HT12D.
- GND pin 1-9 of HT12D and Pin 8 of Atmega.
- Светодиод к pin 17 of HT12D.
- 5V to pin 7 of Atmega and pin 18 of HT12D.
Общий вид конструкции приведен на следующем рисунке:
Платы Arduino
Ардуино продаётся во множестве вариантов; главное, что объединяет платы, – это концепция готового изделия. Вам не нужно травить плату и паять все её компоненты, вы получаете готовое к работе изделие. Можно собирать любые устройства, не используя паяльник. Все соединения в базовом варианте выполняются с помощью макетной платы и перемычек.
Сердце платы – микроконтроллер семейства AVR. Изначально был применён микроконтроллер atmega8, но его возможности не безграничны, и плата подвергалась модернизации и изменениям. Стандартная плата, которая наиболее распространена у любителей – это плата версии UNO, существует много её вариаций, а её размеры сравнимы с кредитной карточкой.
Плата Arduino Nano – полный аналог большего собрата, но в гораздо меньших размерах, версия arduino atmega168 была самой популярной и недорогой, но её сменила другая модель – arduino atmega328, стоимость которой аналогична, а возможности больше.
Следующей важной деталью является печатная плата. Разведена и запаяна на заводе, позволяет избежать проблем с её созданием, травлением и пайкой
Качество платы зависит от производителя конкретного экземпляра, но, в основном, оно на высоком уровне. Питание платы осуществляется с помощью пары линейных стабилизаторов, типа L7805, или других LDO стабилизаторов напряжения.
Клеммная колодка – отличный способ сделать надёжное разъёмное соединение и быстро выполнить изменения в схеме прототипов ваших устройств. Для тех, кому не хватает стандартных разъёмов, есть более крупные и мощные платы, например, на atmega2560, у которой доступно полсотни портов для работы с периферией.
На фото изображена плата Arduino Mega 2560. На её основе можно собрать довольно сложного робота, систему умного дома или 3d-принтер на ардуино.
Не стоит думать, что младшие версии слабы, например, микроконтроллер atmega328, на котором построены модели Uno, nano, mini и другие, имеет вдвое больше памяти по сравнению с 168 моделью – 2 кб ОЗУ и 32 кб Flash памяти. Это позволяет записывать более сложные программы в память микроконтроллера.
Atmel Studio 7 | Первая программа
Текст, выделенный зеленым цветом – это комментарии. В данном случае приводится имя проекта и автора, а также время и дата создания проекта. Комментарии не являются программным кодом, поэтому они игнорируются компилятором. Комментарии позволяют программисту улучшить читаемость кода, что особенно помогает при поиске ошибок и отладке программы.
Цвет комментариев и других элементов программы можно изменять в настройках Atmel Studio.
/*
* 1.c
*
* Created: 07.08.2017 16:57:59
* Author : ZBL
*/
Комментарии бываю однострочные и многострочные. В данном шаблоне программы применяются многострочные комментарии. Они начинаются косой линией со звездочкой, а заканчиваются звездочкой с косой линией.
/* — начало комментария
.
.
.
.
*/ — конец комментария
Весь текс, который помещен между /* и */ полностью пропускается компилятором.
Однострочный комментарий обозначается двумя косыми линиями и действует в пределах одной строки. Текст перед двумя косыми распознается компилятором как код программы, а после – как комментарий.
// Здесь пишется однострочный комментарий
На практике использование комментариев считается хорошим тоном программирования. В дальнейшем мы будем применять оба их типа.
Принципиальная схема устройства
Основой является микроконтроллер ATmega8, который настроен на работу от внутреннего RC осциллятора 1 МГц. Это следует учитывать при программировании микроконтроллера при установке fuse-битов, а также необходимо установить бит EESAVE.
Светодиоды – индикаторы статуса предназначены для информирования пользователя о ходе процесса восстановления. С этой же целью может использоваться персональный компьютер с терминальной программой и COM портом (RS232). На плате предусмотрен разъем для подключения линии Tx микроконтроллера к интерфейсу RS232 компьютера, при этом необходимо использовать преобразователь логических уровней интерфейса, например на микросхеме MAX232. Терминальная программа настраивается на скорость передачи данных 38400 бод, без проверки четности, 8 бит данных, 1 стоп-бит. В терминальной программе отображается вся информация о ходе процесса восстановления конфигурации.
Документация по языку Си и AVR Си
Герберт Шилдт — Полный справочник по C: gerbert-shildt-c-complete-guide.zip (912Кб, HTML).
Это оцифрованные электронные версии книг с очень удобной навигацией, которые были найдены в сети. Все права на содержимое этих книг принадлежат их авторам.
По возможности купите себе хороший и свежий справочник по Си в бумажном виде для удобного обучения и работы.
Библиотека Си для AVR микроконтроллеров (AVR C Runtime Library) — https://savannah.nongnu.org/projects/avr-libc/
По приведенной выше ссылке можно почитать документацию (на английском языке) прямо на сайте или же скачать ее одним файлом в форматах HTML и PDF, там есть вся необходимая информация по использованию библиотеки avr-libc для программирования AVR микроконтроллеров.
Что такое гибкий датчик?
Гибкий датчик (FLEX sensor) представляет собой преобразователь, чье сопротивление изменяется если изменяется его форма (датчика). Внешний вид данного датчика показан на следующем рисунке.
Как правило, данный датчик используется для измерения изменений линейности. Когда датчик изогнут, его сопротивление сильно изменяется. Этот эффект продемонстрирован на следующем рисунке.
В нашей схеме мы будем конвертировать изменение сопротивления датчика в изменение напряжения с помощью делителя напряжения (см. рисунок ниже). Делитель напряжения в нашем случае будет состоять из постоянного резистора R1 и переменного резистора R2, роль которого будет выполнять наш гибкий датчик. Средняя точка делителя напряжения будет использоваться для измерений. Когда сопротивление резистора R2 будет изменяться, то и напряжение в средней точке делителя будет изменяться пропорционально (линейная зависимость). Таким образом, степень изогнутости (или линейности) гибкого датчика будет преобразовываться в изменение напряжения.
При проектировании схем с делителем напряжения следует принимать во внимание то, что входной ток на АЦП микроконтроллера AVR должен быть не менее 50 мкА. Поэтому следует правильно выбирать резисторы делителя напряжения чтобы минимизировать влияние нагрузки (loading effect) резистора на проходящий через делитель ток
Мы будем использовать делитель напряжения таким образом, что при входном напряжении на нем 25В мы на его выходе будем получать напряжение 5В. Таким образом, в программе нам будет нужно умножать измеренное значение напряжение на 5 чтобы рассчитать истинное значение напряжения.
Исходный код программы на языке С (Си) с пояснениями
Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.
#include <avr/io.h> // заголовок чтобы разрешить контроль данных на контактах#define F_CPU 1000000 // задание тактовой частоты микроконтроллера #include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе#define E 5// задействуем 5-й контакт PORTD (“enable”), поскольку он соединен с контактом “enable” ЖК дисплея#define RS 6// задействуем выбор регистра (“registerselection”) на 6-м контакте PORTD, поскольку он соединен с контактом RS ЖК дисплея void send_a_command(unsigned char command);void send_a_character(unsigned char character);void send_a_string(char *string_of_characters); int main(void){DDRB = 0xFF; // установка portB на вывод данныхDDRD = 0xFF; // установка portD на вывод данных_delay_ms(50); //задержка 50msDDRC = 0; // установка portС на ввод данныхADMUX |=(1<<REFS0); // установка опорного напряжения для АЦПADCSRA |=(1<<ADEN)|(1<<ADFR)|(1<<ADPS0);// активация АЦП, установка режима непрерывного преобразования, установка коэффициента деления предделителя АЦП 2 float i =0;float RESISTANCE= 0; // переменная для хранения значения цифрового выходаchar RESISTANCESHOW ; // массив символов для отображения на экране ЖК дисплея значения сопротивленияsend_a_command(0x01); // очистить экран 0x01 = 00000001_delay_ms(50);send_a_command(0x38);// сообщаем ЖК дисплею что мы будем использовать 8 битный режим передачи данных/команд _delay_ms(50);send_a_command(0b00001111); //включаем курсор и мигание курсора на ЖК дисплее ADCSRA |=(1<<ADSC); //старт АЦПsend_a_string («CIRCUIT DIGEST «);// отображение строки «CIRCUIT DIGEST «send_a_command(0x80 + 0x40 + 0);// переводим курсор на 1 позицию второй строкиsend_a_string («RESISTANCE=»);// отображение строки «RESISTANCE=»send_a_command(0x80 + 0x40 + 11);// переводим курсор на 10 позицию второй строкиwhile(1){i=ADC/204.8;//поскольку мы используем 10 битный АЦП и для опорного напряжения 5В мы имеем Vref(5V)/1024=5mV(4.88mV), мы получим один цифровой инкремент для каждых 5мВ, соответственно на каждый дополнительный 1В мы будем иметь 204.8 приращения счетчика. То есть для определения истинного значения напряжения нужно выполнить следующую последовательность действий.dtostrf(RESISTANCE, 4, 1, RESISTANCESHOW);send_a_string(RESISTANCESHOW);send_a_string(«K»);
//dtostr(double precision value, width, precision, string that will store the numbers);// Value – число, или переменная , содержащая число//Width – общая длина числа, которое функция dtostrf должна преобразовать в строку, включающая точку и отрицательный знак числа(-). Например, если рассматриваем число -532.87, то его длина будет равна 7 (5 цифр + знак (-) + точка (.))//Precision – задает точность преобразования, то есть сколько знаков после запятой учитывать_delay_ms(50);send_a_command(0x80 + 0x40 + 11); //возвращаем курсор на 10 позицию второй строки}}void send_a_command(unsigned char command){PORTA = command;PORTD &= ~ (1<<RS); // устанавливаем RS в 0 чтобы сообщить ЖК дисплею что мы будем передавать командуPORTD |= 1<<E; // сообщаем ЖК дисплею чтобы он принял команду/данные_delay_ms(50);PORTD &= ~1<<E; // сообщаем ЖК дисплею что мы закончили передачу данныхPORTA= 0;}void send_a_character(unsigned char character){PORTA= character;PORTD |= 1<<RS; // сообщаем ЖК дисплею что мы будем передавать данные (не команду) PORTD |= 1<<E; // сообщаем ЖК дисплею чтобы он начал прием данных_delay_ms(50);PORTD &= ~1<<E; // сообщаем ЖК дисплею что мы закончили передачу данных PORTA = 0;}void send_a_string(char *string_of_characters){while(*string_of_characters > 0){send_a_character(*string_of_characters++);}}
Обозначения индексов микроконтроллеров
После обозначения базовой версии и серии микроконтроллера, через дефис идет индекс, указывающий вариант исполнения микроконтроллера.Индекс состоит из 1-2 цифр, которые означают максимальную частоту, на которой микроконтроллер может стабильно работать при нормальном для него напряжении питания, и из 1-3 букв, которые обозначают вариант корпуса, температурный диапазон работы, и особенности изготовления.Первая буква (или две буквы) после частоты обозначает тип корпуса:P — корпус DIP (PDIP)A — корпус TQFPM — корпус MLFTS — корпус SOT-23 (ATtiny4/5/9/10)J — корпус PLCCA — корпус UDFN/USONC — корпус CBGACK — корпус LGAS — корпус EIAJ SOICSS — узкий корпус JEDEC SOICT — корпус TSOPX — корпус TSSOP
Следующая буква означает температурный диапазон и особенности изготовления:C — коммерческий температурный диапазон (0 °C — 70 °C)A — температурный диапазон −20 °C — +85 °C, с использованием бессвинцового припояI — индустриальный температурный диапазон (-40 °C — +85 °C)U — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием бессвинцового припояH — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием NiPdAuN — расширенный температурный диапазон (-40 °C — +105 °C), с использованием бессвинцового припояF — расширенный температурный диапазон (-40 °C — +125 °C)Z — автомобильный температурный диапазон (-40 °C — +125 °C)D — расширенный автомобильный температурный диапазон (-40 °C — +150 °C)
Еще в самом конце может быть буква R, которая означает, что микроконтроллеры упакованы в ленты для автоматизированных систем сборки
К примеру:ATmega8L-8AU — максимальная частота — 8 мегагерц, корпус — TQFP, индустриальный температурный диапазон (-40 °C — +85 °C), с использованием бессвинцового припояATmega8-16PN — максимальная частота — 16 мегагерц, корпус — PDIP, расширенный температурный диапазон (-40 °C — +105 °C), с использованием бессвинцового припоя
Если вы знаете, что обозначают буквы и цифры в маркировке микроконтроллера, значит знаете основные параметры микроконтроллеров, и всегда сможете подобрать для своей конструкции наиболее оптимальный вариант микроконтроллера.
Линейка микроконтроллеров ATmegaЛинейка микроконтроллеров ATtiny
Маркировка микроконтроллеров AVR ATmega и ATtinyМаркировка микроконтроллеров AVR семейства ATmega и ATtiny, базовые версии и версии микроконтроллеров, индекс микроконтроллеров
Published by: Мир микроконтроллеров
Date Published: 04/27/2015
Порты ввода-вывода микроконтроллера
Микроконтроллер ATmega8 имеет 28 выводов, каждый из них выполняет определенные функции. Светодиод можно подключить к большинству выводов, однако, не ко всем, ведь минимум пара выводов занята под питание. Чтобы четко знать назначение каждого вывода МК воспользуется даташитом. В даташите находим распиновку (обозначение) всех выводов.
Почти каждый вывод может выполнять несколько функций. Сокращения названий функций приводятся в скобках рядом с выводами. В последующих статья мы обязательно их все рассмотрим. Сейчас же нас интересуют некоторые из них.
Для работы микроконтроллера, впрочем, как и любой другой микросхемы, необходимо напряжение. Во избежание ложных срабатываний МК нужно питать только стабильным напряжением от 4,5 В до 5,5 В. Этот диапазон напряжений строго регламентирован и приведен в даташите.
Плюс («+») источника питания подсоединяется в 7-й ножке, обозначенной VCC. Минус («-») – к 8-й или 22-й ножке, которые имеют обозначение GND (GND – сокращенно от ground – «земля»).
Остальные ножки позволяют микроконтроллеру взаимодействовать с внешними устройствами. Они объединены в отдельные группы и называются порты ввода-вывода микроконтроллера. С помощью них можно как подавать сигналы на вход МК, например с различных датчиков, так и выдавать сигналы для управления другими устройствами или для отображения информации на различных индикаторах и дисплеях.
Микроконтроллер ATmega8 имеет три порта ввода-вывода: B, C и D. Порты могут быть полными и неполными. Полный порт состоит из восьми бит и соответственно имеет столько же одноименных выводов. У неполного порта меньше 8 бит, поэтому число выводов такого порта также менее восьми.
У данного МК порты B и D полные. А порт C неполный и имеет семь бит
Еще раз обращаю внимание, что нумерация битов начинается с нуля, например PB0, PB1, PB2…
Не удивляйтесь, что у ATmega8 отсутствует порт A. Другие МК, имеющие большее число выводов, могут содержать как порт A, так и порт E. У микроконтроллеров с меньшим числом выводов может быть только один порт и тот неполный.