В статье будет рассмотрено подключение светодиодов к микроконтроллеру, работа с портами и написание программы на СИ. Статья, прежде всего, предназначена новичкам, которые лишь взялись за микроконтроллеры 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-битATmega85351
R1-R8
Резистор220 Ом — 1 кОм8
R9-R11
Резистор10 кОм3
V1-V8
Светодиод8
Тактовая кнопка3
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- LED_to_AVR.rar (58 Кб)