Первым проектом на микроконтроллере 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() и может выполнять другие действия. В следующей статье рассмотрим это подробнее.
Комментарии
сигналы на выводах порта.