Начнем с алгоритма работы нашей программы!

1. Если нажать кнопку КН1 подключенную к порту PB1, то на ножке микроконтроллера №15 появится минус источника питания и включится бегущий огонек.

2. Написать программу бегущего огонька с использованием циклы for.

Перейдем к написанию программы и рисованию электрической схемы!

1. Создаем новый проект в Atmel Studio 7 по пути File > New > Projec..., выбираем C/C++ и тип проекта GCC C Executable Project, вводим название проекта (Name: и Solution name:).

2. Выбираем тип микроконтроллера с которым будем работать, в нашем случае Atmega8.

Программа нам выдает код в файле main.c*

Приводим его к читабельному виду, удаляем лишние комментарии.

Добавим в электрическую схему из статьи Бегущие огни Atmega8 программа на СИ кнопку включения: 

И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, 7 резисторов, 7 светодиодов, к порту PB1  ножки микроконтроллера №15 подключена кнопка КН1, а также обозначены выводы для подключения программатора, вернемся к программе.

Светодиоды у нас подключены к порту РD, настроим в программе ножки порта РD на выход, допишем в программе DDRD = 0b11111111;, так как кнопка у нас подключена к порту В настроим его ножки на вход DDRB = 0b00000000;, затем выключим порт D командой PORTD = 0b00000000;, по алгоритму наш микроконтроллер должен понимать, что когда мы подали минус - замкнув кнопку, для этого подтянем ножки порта В к +5в через внутренние резисторы микроконтроллера PORTB = 0b11111111;, можно использовать внешние подтягивающие резисторы, но об этом поговорим в другой раз когда будем бороться с дребезгом контактов. С настройкой портов закончили, добавим переменную char r; для работы нашего бегущего огонька, присвоим директиве #define имя S которое будет хранить данные о задержке на 0,2 секунды. Чтобы наши светодиоды замигали, добавим в программу библиотеку задержек #include <util/delay.h>, а для мигания будем использовать функцию _delay_ms(), далее с помощью оператора #define укажем программе, что наш контроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.

Вот получился код:

Запишем в наш бесконечный цикл while код опроса порта на котором подключена кнопка и цикл мигания светодиодов:

Для опроса кнопки воспользуемся операторами if и else, строка if (PINB == 0b11111101) означает, если ножка порта PB1 равна минусу, то выполним код выделенный красным на рисунке ниже, иными словами запустим мигание светодиодов:

 В противном случае else, выключим порт D:

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

 

 

Исходный код программы Скачать архив