Мигаем светодиодом
Напишем программу мигания светодиодом. Допустим, что светодиод подключен как штатный светодиод Arduino на выводе Digital 13 -- к выводу PB5, то есть шестой разряд порта B.
Добавим функцию delay_ms, в качестве параметра принимающую число миллисекунд для выполнения задержки:
void delay_ms(uint16_t ms)
{
while (ms) {
_delay_ms(1);
--ms;
}
}
Как видно из кода функции, в ней используется функция библиотеки avr-libc _delay_ms(), выполняющая задержку длительностью в 1 мс. Теперь можно написать код основной программы мигания светодиодом:
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_BIT _BV(5)
int main()
{
LED_DDR |= LED_BIT;
while (1) {
LED_PORT |= LED_BIT;
delay_ms(150);
LED_PORT &= ~LED_BIT;
delay_ms(350);
}
}
Добавим в шапку файла инклюды библиотечных заголовков:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
Сохраним файл с названием blink.c.
Скомпилируем файл, добавив необходимые для функции _delay_ms() параметры -- макроопределение F_CPU, равное рабочей частоте микроконтроллера в Гц, и ключ -O3, указывающий компилятору использовать оптимизацию третьего уровня:
avr-gcc -o blink.elf -mmcu=atmega16 -DF_CPU=16000000L -O3 blink.c
Автор: Андрей Шаройко <vanyamboe@gmail.com>