Одной кнопкой три команды AVR - №9

Одной кнопкой три команды AVR - №9

В этом материале будем одной кнопкой переключать цифры на семисегментном индикаторе.

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

1. При включении питания на индикаторе светится 0.

2. При первом нажатии на кнопку КН1 переключаем с 0 на 1 .

3. При втором нажатии на кнопку КН1 переключаем с 1 на 2 .

4. При третьем нажатии на кнопку КН1 переключаем с 2 на 3 .

5. При четвертом нажатии на кнопку КН1 переключаем с 3 на 0 , далее цикл повторяется.

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

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

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

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

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

Рисуем электрическую принципиальную схему:

И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, к порту PB через токоограничительные резисторы номиналом 300Ом подключен семисегментный индикатор, на порт PD2 кнопка, а также обозначены выводы для подключения программатора, вернемся к программе.

Настроим в программе ножки порта РB на выход, допишем в программе DDRB = 0b11111111;, командой DDRD &= ~(1 << 2);  настраиваем ножку порта PD2 на вход, а также строчкой PORTD |= (1 << 2);   подтягиваем порт PD2 внутренним резистором к +5в, на который мы подключили кнопку КН1.

С настройкой портов закончили, присвоим директиве #define имя S которое будет хранить данные о задержке на 0,05 секунды. Добавим в программу библиотеку задержек #include <util/delay.h>, для задержки будем использовать функцию _delay_ms(), а также добавим библиотеку прерываний #include <avr/interrupt.h>, далее с помощью оператора #define укажем программе, что наш контроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.

Добавим массив int puls [10] = {}; - с цифрами от 0 до 9 и переменную int clik=0; - присвоим ей значение 0.

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

Теперь займемся вызовом вектора прерывания и его настройкой , допишем в нашу программу вектор прерывания.

В прерывании будем переменную clik увеличивать на 1, после каждого нажатия на кнопку.

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

Допишем в программе

Режимы работы и настройка взяты из datasheet на ATmega8, разрешаем глобальное прерывание командой asm("sei"); - это обязательно, без этой команды работать не будет. В бесконечном цикле с помощью If будем проверять сработало или нет у нас прерывание, в соответствии с срабатываем прерывания будем выдергивать из массива int puls [10] = {}; с цифрами, нужную нам цифру и выводить на индикатор.

 

 

 

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

Статьи по теме