Эта статья подойдёт новичкам, которые только делают первые шаги.
Нам понадобится:
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.Теперь запускаем симуляцию (кнопка в левом нижнем углу — |> ). Наслаждаемся.