Рубрики
Схемы на AVR

Мигающий светодиод на микроконтроллере AVR ATmega32

Мигающий светодиод – это, пожалуй, самая простая схема, которую можно реализовать на микроконтроллере семейства AVR. Предназначена она для начинающих радиолюбителей – чтобы они на примере этой простейшей схемы смогли сделать свой первый шаг в направлении знакомства с микроконтроллерами AVR. В данной схеме мы подсоединим светодиод к микроконтроллеру AVR ATmega32 и заставим его мигать с интервалом в полсекунды.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Светодиод (купить на AliExpress).
  4. Резистор 220 Ом.
  5. Источник питания с напряжением 5 Вольт.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

Схема устройства приведена на следующем рисунке. Как видите, она простейшая.

Светодиод D1 подсоединен через резистор R1 к выводу 19 микроконтроллера. Резистор необходим для ограничения тока, протекающего через светодиод. Помните, что микроконтроллер не может обеспечивать на своих выводах ток более 30 мА.

Для этой схемы нет необходимости в использовании внешнего кварцевого резонатора. Микроконтроллер ATmega32 по умолчанию работает от своего внутреннего RC-генератор с частотой 1 МГц – для рассматриваемой нами задачи этого вполне достаточно. Внешний кварцевый резонатор целесообразно подключать к микроконтроллеру только когда требуется повышенная точность таймера или возникают другие задачи, требующие точного измерения временного промежутка. По умолчанию при покупке микроконтроллер настроен так, чтобы работать от внутреннего RC-генератора.

Исходный код программы на языке C (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке C (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

#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
    }
}

Теперь код программы без комментариев.

/*
 * 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);
    }
}

Видео, демонстрирующее работу схемы

9 ответов к “Мигающий светодиод на микроконтроллере AVR ATmega32”

Привет! Почему светодиод может моргать быстрее примерно в 4 раза, Atmega8a-PU, прошит на 8МГц внутренний генератор.

Всё, разобрался! вписал лишнюю строку
#define F_CPU 100000UL //<—| это определение оказывается важнее!
#define LED PORTD // |
#define F_CPU 8000000 //—|

Юрий, да опечатка просто, программисты ведь люди рассеянные ))

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

Вы наверное к какой то другой статье хотели свой комментарий написать? На схеме в этой статье всего один светодиод

Особого смысла в этом нет, можно один раз вместо этого написать _delay_ms(440);, просто я решил не изменять программу-оригинал с того сайта, откуда я ее взял. Статья просто переводная, с англоязычного сайта. Конечно, такую статью я мог бы и сам написать, но картинки и видео свои к такой статье быстро не сделаешь, поэтому и беру их с англоязычного сайта. Но я думаю авторы того сайта не в обиде — я же популярность их видеороликов повышаю. Все равно сами они никогда не будут писать статьи на русском, им это не выгодно

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *