Моргаем портами контроллера AVR или программируем в Atmel AVR Studio

Эта статья подойдёт новичкам, которые только делают первые шаги.

Нам понадобится:
Atmel AVR Studio — для программирование
Proteus — для симуляции

Открываем студию. Видим привычное для пользователей Microsoft Visual Studio окно.

Жмём Файл — Новый проект

Создаём «C Executable Project». Задаём имя и жмём ок.
Теперь перед вами окно выбора контроллера:

Выбираем Atmega8 и жмём ОК.
После этого должно было появиться окно с кодом.

#include <avr/io.h>

int main(void){
    while(1)
    {
  // тут код программы
    }
}

Нам необходимо вставить код в бесконечный цикл внутри функции main.
Для начала договоримся, что будем просто моргать портами. Тоесть включать и выключать напряжение на портах. Точнее на порте B. Наш контроллер имеет 3 порта B,C и D. Работа с ними как вы понимаете аналогична.
Итак будем включать и выключать. Естественно между этими процедурами необходимо делать задержку. Для этого есть стандартная библиотека содержащая функцию задержки — _delay(ms);
Заинклудим её:

#include <avr/delay.h>

Теперь поговорим о портах. Вот так выглядит наш контроллер (на схеме конечно):

Есть несколько «методов» включить и выключить сигнал на порте. Если вы ещё помните мы работаем с портом B. Для управления им нам понадобится изменить значение в регистре PORTB. (для управления C — PORC и т.д.). В эту чудо переменную необходимо ввести 8ми битное двоичное число (для C — 7 битное. См. количество выводов с порта).

Не нужные биты можно не трогать. Изначально все биты нулевые.
Например:
Включим 0 вывод порта B.

PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
  1      0     0      0     0      0     0      0

Получается нам нужно присвоить PORTB значение 0b1 ну или 1 (это ведь одно и тоже).
Мы можем написать:

PORTB = 0b1;

Но таким образом мы обнулим другие выводы. А если у нас на них необходимые значение? Есть простое решение этой проблемы.

PORTB |= 0b1;

Таким образом мы не изменим значения кроме PB0.
Если же нужно изменить значение на 5 выводе, нет необходимости писать:

PORTB |= 0b100000;

Достаточно воспользоваться побитовым сдвигом:

PORTB |= (1<<5);

Как же выключить необходимый вывод?

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

PORTB = 0;

Выключит все выводы.
Если же один порт — используем побитовую инверсию и побитовое И:

PORTB &= ~(1<<5);

Набаловались? Отлично. Теперь моргаем по очереди.

Моргаем 5 выводм порта B. Раз в 100мс:

        PORTB |= (1<<5);  // включаем 
        _delay_ms(100);  // ждём 100мс
        PORTB &= ~(1<<5); // выключаем
        _delay_ms(100); // ждём 100мс

Вы можете использовать так же и обычные десятичные числа. Тоесть 0b10 = 2. Это будет соответствовать включенному PB1 и выключенному PB0.

О том как симулировать.

Открываем ISIS (он же proteus). Для добавления устройства жмём кнопку «p»:

В открывшемся окне вводим название контроллера и жмём «ок». После этого кликаем два раза в пространстве редактора и устанавливаем его на схему.
Отличием ISIS является то, что вам не понадобиться устанавливать стандартную обвязку контроллера (подключать питание, кварц и тп).
Установили?
Укажем прошивку. Её мы должны собрать из исходника (надеюсь стало понятно как) :

В папке с вашим проектом появится *,hex файл. Это и есть прошивка.
Кликаем дважды по контроллеру в ISIS и указываем путь к файлу.

… в строку Program File.Теперь запускаем симуляцию (кнопка в левом нижнем углу — |> ). Наслаждаемся.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий