Настраиваем ножки микроконтроллера на выход, мигаем светодиодами на микроконтроллере Atmega8 в среде программирования Atmel Studio .

В данном уроке мы будем мигать сразу 5 светодиодами. 
Светодиоды подключаются к ножкам порта D0-D5 и будут мигать по очереди. Так же добавим паузу, которая будет меняться случайным образом между циклами. Для реализации данной возможности воспользуемся генератором случайных чисел, несмотря на его примитивность в данном микроконтроллере — для наших целей он подойдет.

Номинал резисторов R1-R6 зависят от тока потребления светодиодов. При этом ток не должен превышать допустимый выходной ток ножки микроконтроллера. Обычно номинал резисторов лежит в диапазоне 470 Ом — 1кОм.

Для реализации генерации случайного числа мы воспользуемся функцией rand(). Это конечно псевдо случайное число — но все же.

Для настройки нужной ножки на выход, необходимо в регистре DDRx записать логическую 1, так для порта В, ножки 0 запись будет следующая: DDRB = 0b00000001; После того как данная ножка настроена на выход, в регистре PORTx мы указываем логический уровень на ее выходе: PORTB=0bxxxxxxx1; Таким образом на на ножке PB0 установили логическую 1. Так же можно отдельно указывать только необходимые биты с которыми мы хотим работать, что бы установить логическую 1, можно записать следующим образом: PORTB|=(1<<PB0), для установки логического 0, будет следующая запись: PORTB &=~(1<<PB0).

В программе мы будем использовать функцию rand() которая генерирует псевдо случайные числа. 

Сама программа:
 
 

ранд()

имя существительное: рант

#include <avr/io.h>
#include "led.h" // подключаем наш заголовочный файл
#include "stdlib.h" // Функция для генератора случайных чисел
#define F_CPU 1000000UL

unsigned int k;

int main(void){
/* Replace with your application code */
init ();
while (1){
k=1000*(unsigned int)rand();// генерируем задержку случайным образом
miganie(k);
}
}

void init (void){ // инициализация ножек порта D
DDRD =0b0011111; //ножки D0-D4 выход
PORTD =0b1100000;// ножки D0-D4 - настроены на 0
}

void delay (unsigned int y){// задержка
unsigned int i=0;
unsigned int w=0;
for (w=0;w<=4;w++){
for (i=0;i<=y;i++) {;}
}
}

void miganie (unsigned int t){// мигание светодиодами по очереди
HL1_on;HL2_off;HL3_off;HL4_off;HL5_off;
delay(t);
HL1_off;HL2_on;HL3_off;HL4_off;HL5_off;
delay(t);
HL1_off;HL2_off;HL3_on;HL4_off;HL5_off;
delay(t);
HL1_off;HL2_off;HL3_off;HL4_on;HL5_off;
delay(t);
HL1_off;HL2_off;HL3_off;HL4_off;HL5_on;
delay(t);
}
Заголовочный файл
#ifndef LED_H_
#define LED_H_

// макросы
#define HL1_on PORTD|=(1<<PD0)
#define HL1_off PORTD&=~(1<<PD0)
#define HL2_on PORTD|=(1<<PD1)
#define HL2_off PORTD&=~(1<<PD1)
#define HL3_on PORTD|=(1<<PD2)
#define HL3_off PORTD&=~(1<<PD2)
#define HL4_on PORTD|=(1<<PD3)
#define HL4_off PORTD&=~(1<<PD3)
#define HL5_on PORTD|=(1<<PD4)
#define HL5_off PORTD&=~(1<<PD4)
#endif /* LED_H_ */