Собираем сами

 У вас есть идея насчет сайта? Вы хотите написать о своей самоделке нам? Тогда вам сюда или пришлите её нам на e-mail: admin@dari-pats.lv.

Новость должна быть уникальной. 

Программирование микроконтроллера Atmega 48

Автор 
Оцените материал
(4 голосов)

В этой статье мы бы хотели познакомить читателей с основами программирования бегущих огней на микроконтроллерах Atmega48, семейства AVR, используя комплект программирования STK500 и среду Atmel Studio (язык C++).

 

Для начала определимся, что же такое микроконтроллер Atmega48. Есть и другие микроконтроллеры, но мы рассмотрим именно этот. Это устройство, которое позволит вам создавать различные решения с бегущими огнями. К примеру, это может быть какой-то робот со светящимися глазами, украшение для новогодней елки, табло с расписанием прибытия поездов, светофор (грубо говоря) и тому подобное. Поддерживает программирование 8 кнопок (0—7), 8 светодиодов (тоже от 0—7). Имеются и другие возможности, такие как прерывания и т. д., но в данной программе они не понадобятся. Полная спецификация микроконтроллера Atmega48 доступна на официальном сайте Atmel: http://www.atmel.com/images/doc2545.pdf. Кому интересно, ниже несколько полезных изображений о микроконтроллере Atmega48.

 

interfejs atmega48vnesnij vid atmega48

sxema atmega48karta pamati atmega48

 

 

В начале определяемся с идеей. Предположим, что нужно сделать бегущую линию из светодиодов, которые будут менять свое направление в зависимости от количество пробегов. Такое решение может применяться на рекламных стендах, когда хочется привлечь внимание посетителей. На стенде светодиодов во много раз больше чем в нашей статье, но основы одни и те же. Для просторы определимся использовать один ряд из 8 светодиодов.

 

Когда определились с основной идеей программы в Atmega48, можем обозначить точно выполнение всех ее действий. Точное постановка задачи будет иметь следующий вид — Светодиоды загораются по очереди, создавая эффект бегущих огней слева направо. После каждых 5 повторений направление бегущих огней меняется на противоположное.

 

Теперь можем приступать к реализации программы. Для этого понадобится:

 

  • Среда программирования Atmel Studio http://www.atmel.com/tools/atmelstudio.aspx
  • Базовые знания C++ или любого другого похожего языка
  • Программатор STK500

 

Попробуем запрограммировать программу в Atmel Studio 6.2:

 

1. Подключаем библиотеки


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

 

2. Инициализируем переменные r (позиция) и d (направление)


unsigned char r, d;

 

3. Устанавливаем начальные значения на порты вывода (DDRB, PORTB), направление (переменная d) и счетчик (int counter)


DDRB = 0xFF;
PORTB = 0xFF;
d = 0;
a = 0b10101010;
int counter = 0;

 

4. Пока не пройден весь ряд светодиодов (когда r будет равно 0, это означает, что цикл закончился)


while (r != 0)

 

5. Просто выводим текущее состояние в порт PORTB и ставим задержку в 500 мсек


PORTB = r^0xFF;
_delay_ms(500);

 

6. Если направление (d) было вправо (т. е. было 0), двигаем светодиод на данном проходе на одну позицию вправо, если иначе — влево


if (d==0)
{

r>>=1;

}
else
{

r<<=1;

}

7. На последнем светодиоде увеличиваем счётчик на 1 для подсчёта пяти полных проходов


if (r == 0) { counter++; }

 

8. Далее, когда количество проходов уже достигло пяти, если направление было 0, то меняем на противоположное и обнуляем счетчик, если направление 1, то меняем опять же на противоположное и обнуляем счетчик


if(counter == 5)

{

if (d==1)
{

d = 0;
counter = 0;

}
else
{

d = 1;
counter = 0;

}

}

 

9. Далее программа продолжается сначала.

 

Полный код программы:

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

unsigned char r,d;

 

int main(void)

{

DDRB= 0xFF;

PORTB = 0xFF;

d=0;

a=0b10101010;

int counter = 0;

while (1)

{

// Присваивание r начального значения

if (d==0)

r=0b10000000; // слева направо

else

r=0b00000001; // справа налево

// цикл перемeщения "бегущего огня"

while (r != 0)

{

 

PORTB = r^0xFF; // Вывод значения r в порт В

// задержка для нормального восприятия эффекта "бегущих огней"

_delay_ms(500);

// сдвиг значения r вправо или влево

if (d==0)

{

r>>=1;

}

else

{

r<<=1;

}

if (r == 0)

{

counter++;

}

}

 

if(counter == 5)

{

if (d==1) //после одного прохода меняем направлоение

{

d = 0; // на противоположное

counter = 0; // обнуляем счётчик

}

else

{

d = 1;

counter = 0;

}

}

}

}

Результат работы программы:

 

Реклама

Наши группы

Поддержи проект

WebMoney Кошельки

wmE E360805809023

wmR R200307929169

wmZ Z127913139149

Три случайные новости