Подключение светодиодов к микроконтроллеру AVR

В статье будет рассмотрено подключение светодиодов к микроконтроллеру, работа с портами и написание программы на СИ. Статья, прежде всего, предназначена новичкам, которые только взялись за микроконтроллеры AVR.

Для начала нужно выбрать микроконтроллер. В моем случае это ATmega8535. В данном случае микроконтроллер можно брать любой, так как данная задача легко реализуется под любой МК. Писать программу для микроконтроллера можно на Ассемблере, СИ, Pascal-е и Bascom. Я использовал язык СИ, все эти языки разные.
Конкретную разницу между Си и Паскалем можно увидеть ниже.

На С:

 //Мигающий светодиод void main()   {  ddrB = 0b11111111; //задаём порты B на выход   portB = 0b11111111; //по умолчанию всё выключено              while(1)              {               portB = ˜portB; //переключаем состояние светодиода на обратное               delay_ms(100); //делаем задержку на 100 миллисекунд              }            }  

на Pascal-е:

 program First;  begin    ddrB := $FF;  //задаём порт B на выход    portB := $FF; //по умолчанию ничего не горит    while(1) do    begin    portB := not(portB);     //переключаем состояние светодиода на обратное    delay_ms(100);           //делаем небольшую задержку    end;   end. 

Программу я писал в CodeVisionAVR V2.60 Evaluation, она получилась самой примитивной, но зато простой. Вот некоторые фрагменты программы:

 #include  // библиотека  контроллера  #include  //библиотека задержки   volatile char FCV_A1;  //  переменные выключателей volatile char FCV_OP1; volatile char FCV_OP2;  void main(void){       while(1)      //бесконечный цикл      {         // B1 -> OP1,  номер порта к которому подключен выключатель          DDRB = DDRB & 0xfd;         FCV_OP1 = ((PINB & 0x02) == 0x02);         // B2 -> OP2         DDRB = DDRB & 0xfb;         FCV_OP2 = ((PINB & 0x04) == 0x04);         // B3 -> a1         DDRB = DDRB & 0xf7;         FCV_A1 = ((PINB & 0x08) == 0x08); 

Эта часть кода мигает каждым светодиодом по очереди:

 	DDRD = 0xFF; // порт D установлен как выход 	PORTD = 0; // на порте D  находится  0 	PORTD.0=1;//1 -> D0 //  зажигает светодиод  	delay_ms(250);  // задержка в 250 миллисекунд 	PORTD.0=0;//0 -> D0 // гасит светодиод 	delay_ms(250); 	PORTD.1=1;//1 -> D1 	delay_ms(250); 	PORTD.1=0;//0 -> D1 	delay_ms(250); 	PORTD.2=1;//1 -> D2 	delay_ms(250); 	PORTD.2=0;//0 -> D2 

Функция switch (FCV_A1) {…} приводит в действие одну из частей программы(case 1 или default ) в зависимости от положения выключателя A1.

Функция
if (FCV_OP1) { } 
else{ … }  
или  
if (FCV_OP2) { }
else{ … }
следит за положением выключателя OP1 или OP2, если включен, выполняется один из 2 кусков кода подпрограмм case 1 или default, а если выключен то иначе, в зависимости от положения выключателя  A1.

Остальные части программы не требуют объяснения, так как построены аналогично.

Принципиальная схема:

Принципиальная схема

Светодиоды можно включить и по другому:

Схема подключения светодиодов

В этой схеме на 1 порт подключаются сразу два светодиода через транзистор. В этом случае транзистор работает как ключ.

Схема подключения светодиодов

Здесь светодиод подключается через токоограничивающий резистор. При подключении светодиода на землю, он будет гореть тогда когда на выходе порта будет логическая 1, а при подключении на +, на выходе порта должен быть 0.

Еще можно подключить так:

Схема подключения светодиодов

PX – это ножка используемого порта.

Кнопку или выключатель можно подключить еще и так:

Схема подключения кнопки

Микроконтроллер тактируется от внутреннего генератора на 8МГц

Байты конфигурации:
0xE4 LOW
или
LOW  SUT0 CKSEL3 CKSEL1 CKSEL0 отмечены запрограммированные фьюзы
HIGH трогать не надо
запрограммированный фьюз=0, а не запрограммированный=1.
Перед выставлением фьюзов, их нужно сначала считать с МК. Потом выставить нужные фьюзы, например, в  программе Khazama AVR Programmer незапрограммированные фьюзы помечаются галочкой.

Фото устройства

Питание схемы не должно превышать 5 вольт, лучше на вход питания поставить стабилизатор 7805.

Светодиоды любые маломощные. Для мощных светодиодов использовать схему с транзисторными ключами и сделать раздельные питание, то есть МК питается от одного стабилизатора 7805, а светодиоды от другого, например L7805 (1.5А). Стабилизатор и ключевые транзисторы следует выбирать в зависимости от мощности светодиодов.

Ниже вы можете скачать исходники, прошивку, проект в Proteus и Flowcode

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК AVR 8-бит ATmega8535 1
R1-R8 Резистор 220 Ом — 1 кОм 8
R9-R11 Резистор 10 кОм 3
V1-V8 Светодиод 8
Тактовая кнопка 3