Мигаем светодиодами на AVR без Arduino

в 11:33, , рубрики: Песочница, метки: , , , ,

image

События в статье происходили год назад, поэтому что-то могло устареть, а что-то я мог упустить. Начну с того, что я не программист, не разбираюсь в цифровой электронике, и всю свою жизнь интересуюсь аналоговой электроникой. Я не знал что такое микроконтроллеры ибо не читал Habr. Признаюсь честно, если бы знал тогда про ардуино то сделал бы на ардуино. Итак начнем.

Возникла потребность в устройстве генерирующем псевдослучайные числа. Почему не случайные а псевдослучайные, так это потому, что невозможно генерировать случайные числа программно: когда-нибудь цикл повторится, к примеру, после очередного включения устройства. Чтобы генерировать случайные числа нужно задействовать внешнее воздействие, вариантов много, давайте обсудим в комментариях. Это было бы сложнее, поэтому вернемся к псевдослучайной генерации. Также в качестве индикаторов чисел будут сетодиоды, ибо так легче.

После длительного гугления, чтения статей, форумов, изучая даташиты и не найдя готового решения решил делать сам. Как мигать светодиодом есть везде, а как мигать случайно — нет. Неужели никто не делал гирлянду? Надеюсь моя инструкция будет интересна начинающему.

Первым делом чертим схему. Схема не моя, свою потерял, поэтому исходника для протеус не будет.

image

Для тек кто не знает что это за программа, очень советую, очень удобно наблюдать как все работает без пайки и прошивки контроллера. Микроконтроллер фирмы Atmel Atmega8. Почему именно атмел, предлагаю обсудить в комментариях.

Далее пишем программу. Существует среда программирования AVR Studio. Она мне не понравилась, и в итоге я выбрал CodeVisionAVR. Вы можете посмотреть обе, на вкус и цвет, как говорится.

Собственно сам код:

#include <mega8.h> //Включаем библиотеку для работы с микроконтроллером ATMega8 
#include <delay.h> //Включаем библиотеку для организации задержек
#include <stdlib.h> //Включаем библиотеку для генерации псевдослучайных чисел (rand)

void main(void) //Обязательный заголовок (тело)
{ 

char i; //Объявляем переменную (i)

PORTD=0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D 
DDRD=0xFF;  //Делаем порт D, как выход, чтобы на выходах порта было напряжение 5В
PORTC=0x00; //Выставляем все выходы порта C на 0, то есть, выключаем весь порт C 
DDRC=0xFF;  //Делаем порт C, как выход, чтобы на выходах порта было напряжение 5В
PORTB=0x00; //Выставляем все выходы порта B на 0, то есть, выключаем весь порт B 
DDRB=0xFF;  //Делаем порт B, как выход, чтобы на выходах порта было напряжение 5В

while (1) //Добавляем бессконечный цикл, код ниже выполняется в цикле
{

i = rand() % 22 + 1; /*Присваеваем переменной функцию, которая принимает значения от 0 до 32767. 
                               (В нашем случае делим по модулю)*/

delay_ms(5); //Исполюзуем задержку 5мс

if (i==1){PORTD.0=1;} else PORTD.0=0; //Если переменная (i) равна (1) то 0-вой бит порта (D) равен (1), 
if (i==2){PORTD.1=1;} else PORTD.1=0; //  если иначе, то 0-лю
if (i==3){PORTD.2=1;} else PORTD.2=0; //Во всех остальных ниже условиях по аналогии
if (i==4){PORTD.3=1;} else PORTD.3=0;
if (i==5){PORTD.4=1;} else PORTD.4=0;
if (i==6){PORTD.5=1;} else PORTD.5=0;
if (i==7){PORTD.6=1;} else PORTD.6=0;
if (i==8){PORTD.7=1;} else PORTD.7=0;
if (i==9){PORTC.0=1;} else PORTC.0=0;
if (i==10){PORTC.1=1;} else PORTC.1=0;
if (i==11){PORTC.2=1;} else PORTC.2=0;
if (i==12){PORTC.3=1;} else PORTC.3=0;
if (i==13){PORTC.4=1;} else PORTC.4=0;
if (i==14){PORTC.5=1;} else PORTC.5=0;
if (i==15){PORTB.0=1;} else PORTB.0=0;
if (i==16){PORTB.1=1;} else PORTB.1=0;
if (i==17){PORTB.2=1;} else PORTB.2=0;
if (i==18){PORTB.3=1;} else PORTB.3=0;
if (i==19){PORTB.4=1;} else PORTB.4=0;
if (i==20){PORTB.5=1;} else PORTB.5=0;
if (i==21){PORTB.6=1;} else PORTB.6=0;
if (i==22){PORTB.7=1;} else PORTB.7=0;

};
}

Код писал 2 дня, пока понял что к чему. Опишу кратко. Подключаем необходимые библиотеки, в цикле с помощью функции rand() генерируем числа, условия открывают закрывают порты в зависимости от значения переменной «i». А как бы сделали вы? Можно ли сократить код?

Для проверки работоспособности кода перед заливкой в микроконтроллер рекомендую запустить в протеусе и посмотреть что происходит.

После необходимо прошить сам микроконтроллер. Тут такая же ситуация. Существует всеми хвалимая программа AVRDUDE, но мне понравилась KhazamaAVRProgrammer. В качестве программатора выступал обычный USBASP:

image

На протяжении всей статьи я пропускал очень важные моменты. Я не показывал скриншоты програм, что и куда нажимать. Напоследок хочется сказать: если вы сами разберетесь тогда вы будете это уметь.

Печатную плату в формате lay можете скачать здесь.

Автор: шаутбенахт

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js