Мигающий светодиод – это, пожалуй, самая простая схема, которую можно реализовать на микроконтроллере семейства AVR. Предназначена она для начинающих радиолюбителей – чтобы они на примере этой простейшей схемы смогли сделать свой первый шаг в направлении знакомства с микроконтроллерами AVR. В данной схеме мы подсоединим светодиод к микроконтроллеру AVR ATmega32 и заставим его мигать с интервалом в полсекунды.
Необходимые компоненты
Аппаратное обеспечение
- Микроконтроллер ATmega32 (купить на AliExpress).
- Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
- Светодиод (купить на AliExpress).
- Резистор 220 Ом (купить на AliExpress).
- Источник питания с напряжением 5 Вольт.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Программное обеспечение
- Atmel Studio версии 6.1 (или выше).
- Progisp или flash magic (необязательно).
Работа схемы
Схема устройства приведена на следующем рисунке. Как видите, она простейшая.
Светодиод D1 подсоединен через резистор R1 к выводу 19 микроконтроллера. Резистор необходим для ограничения тока, протекающего через светодиод. Помните, что микроконтроллер не может обеспечивать на своих выводах ток более 30 мА.
Для этой схемы нет необходимости в использовании внешнего кварцевого резонатора. Микроконтроллер ATmega32 по умолчанию работает от своего внутреннего RC-генератор с частотой 1 МГц – для рассматриваемой нами задачи этого вполне достаточно. Внешний кварцевый резонатор целесообразно подключать к микроконтроллеру только когда требуется повышенная точность таймера или возникают другие задачи, требующие точного измерения временного промежутка. По умолчанию при покупке микроконтроллер настроен так, чтобы работать от внутреннего RC-генератора.
Исходный код программы на языке C (Си) с пояснениями
Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке C (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <avr/io.h> //заголовок, разрешающий управление выводами микроконтроллера #define F_CPU 1000000 //задание тактовой частоты #include <util/delay.h> //заголовок, разрешающий управление функциями задержки времени в программе int main(void) { DDRD = 0xFF; // ( или 0b1111 1111 в двоичном коде) В программе AVRSTUDIO для того чтобы использовать порт (вывод) микроконтролера как вход, мы должны использовать значение "НОЛЬ", а чтобы использовать его как выход – мы должны использовать значение "ЕДИНИЦА". Поскольку мы установили всем используемым портам значение 1, то все выводы (контакты) будут использоваться как выходные. А если бы мы, к примеру, установили значение “0b1111 0111”, то в этом случае PIN 3 (вывод) работал бы на ввод данных. while(1) // бесконечный цикл, чтобы светодиод мигал все время работы программы { PORTD = 0xFF; // на все пины (выводы) PORTD подается напряжение 5 В (LED ON) _delay_ms(220); //задержка на 200ms _delay_ms(220); ); // задержка на 200ms PORTD = 0x00; // на все выводы PORTD подается низкий потенциал (земля) _delay_ms(220); ); // задержка на 200ms _delay_ms(220); ); // задержка на 200ms } } |
Теперь код программы без комментариев.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * C Program to Blink an LED with ATmega32 Microcontroller * * Author: DILIP RAJA */ #include <avr/io.h> #define F_CPU 1000000 #include <util/delay.h> int main(void) { DDRD = 0xFF; while(1) { PORTD = 0xFF; _delay_ms(220); _delay_ms(220); PORTD = 0x00; _delay_ms(220); _delay_ms(220); } } |
Привет! Почему светодиод может моргать быстрее примерно в 4 раза, Atmega8a-PU, прошит на 8МГц внутренний генератор.
Всё, разобрался! вписал лишнюю строку
#define F_CPU 100000UL //<--| это определение оказывается важнее!
#define LED PORTD // |
#define F_CPU 8000000 //---|
Мы рады что вы разобрались
Почему в коде стоит задержка _delay_ms(220), а в коментарии 200мс, а не 220?
Юрий, да опечатка просто, программисты ведь люди рассеянные ))
Ничего не мигает. Просто загорелись все диоды кроме первого и последнего
Вы наверное к какой то другой статье хотели свой комментарий написать? На схеме в этой статье всего один светодиод
Зачем дважды повторяется строка с задержкой _delay_ms(220);?
Особого смысла в этом нет, можно один раз вместо этого написать _delay_ms(440);, просто я решил не изменять программу-оригинал с того сайта, откуда я ее взял. Статья просто переводная, с англоязычного сайта. Конечно, такую статью я мог бы и сам написать, но картинки и видео свои к такой статье быстро не сделаешь, поэтому и беру их с англоязычного сайта. Но я думаю авторы того сайта не в обиде - я же популярность их видеороликов повышаю. Все равно сами они никогда не будут писать статьи на русском, им это не выгодно