Микроконтроллеры

Мой первый проект на микроконтроллере Atmega 8

Мигаем светодиодом

Первым проектом на микроконтроллере AVR у нас будет мигание светодиодом. Писать программы в этой статье и во всех последующих мы будем с помощью среды разработки Atmel Studio на языке «СИ». Как известно микроконтроллеры AVR могут иметь разное количество портов ввода/вывода. Все они настраиваются одинаково. Не будем приводить схему, нужно просто к нулевому порту подключить светодиод.

Итак, для того чтобы помигать светодиодом, сначала нам необходимо настроить определенный бит регистра на выход. Для этого в бит регистра DDRX необходимо записать логическую единицу. К примеру, для порта B микроконтроллера Atmega 8 установим первый бит регистра DDRB на выход. Запись осуществляется следующей конструкцией DDRB |=(1<<0); Эта запись означает, что первый бит порта B настроен на выход.

Для записи определенного значения на этот выход нужно использовать регистр PORDB. В него мы можем записать логическую единицу, либо логический ноль. Для того чтобы помигать светодиодом нужно в определенный бит этого регистра разные значения с определенным интервалом получаем. Сначала записываем единицу PORTB |=(1<<0),выдерживаем определенную паузу, а затем устанавливаем в ноль PORTB &=~(1<<0).

Для выдерживания паузы используется стандартная библиотека <avr/delay.h>

с помощью метода _delay_ms(value).

Исходный код программы

#include <avr/io.h>
#include <avr/delay.h>
int main(void)
{
//Настраиваем пин 0 на выход;
DDRB |=(1<<0);  
while(1)
{ 
//Устанавливаем логическую единицу;
  PORTB |=(1<<0);
 _delay_ms(1000);
//Устанавливаем логический ноль;
 PORTB &=~(1<<0);
 _delay_ms(1000);
}
}

Используя метод _delay_ms() программа «заходит» в него и там остается – выдерживает заданную паузу. Это не рациональное использование ресурсов и возможностей процессора. Правильнее будет использование таймеров и прерываний. Когда мы настраиваем таймер на определенную частоту. Когда происходит прерывание мы инвентируем значение порта. В этом случае программа не «зависает» в методе _delay_ms() и может выполнять другие действия. В следующей статье рассмотрим это подробнее.

Комментарии  

 
#1 Никитка 19.04.2016 14:08
"Для записи определенного значения на этот выход нужно использовать регистр PORDB." ----- ОШИБКА, Вы, наверное, имели ввиду PORTB. Второе замечание, Вы уверены, что PORTB - это регистр?
Цитировать
 
 
#2 Михаил 19.04.2016 20:17
Для управления каждым из портов ВВ имеются три 8-разрядных регистра ВВ, а именно DDRx, PORTx и PINx. Регистр PORTx в режиме вывода задает выходные
сигналы на выводах порта.
Цитировать
 

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


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа