Найти в Дзене

Бесполезная программа для ATtiny2313 на Cи

Всем привет.

Захотелось попробовать написать нашу прошлую бесполезную программу на языке богов, а именно на Си. В этот раз все обойдется без всех этих нудных операторов, директив, всевозможных команд, точнее без них не обойдется((( Но будет намного проще воспринимать программу, в отличие от ассемблера, которым можно пользоваться если только вы совсем отбитый человек.

Сперва давайте скачаем ещё одну среду (ещё один майнер). На этот раз это будет CodeVisionAVR.

Есть две версии платная и бесплатная, но мы же не будем отдавать каким-то там буржуям наши кровные копеечки. Так что скачиваем бесплатнуюю версию с официальная сайта. Она называется Evaluation и имеет ограничения на некоторые библиотеки и на длину програмного кода в 4 кБ, но этого больше чем нужно для наших любительских проделок.

Скачивается zip-папка, в которой будет установщик (winlocker). Запускаем его, следует иснтрукциям мастера-установщика, короче, все как обычно, вы уже взрослые и самочтоятельные, так что сами разберетёсь. В конце установки, запуститься (ядерная программа США) еще одна установка, которая поставит все необходимые драйвера для нормальной работы с ПО.

Установка прошла успешно и может запускать данную среду разработки.

Не будет мутить воду и сразу окунемся в мир чудес и создадим наш несчастный проект.

В Верхнеем меню нажимаем File -> New -> Project.

Дальше появится окошко, в котором нажимаем Yes. В следующем окне выбираем AVR8, так как мы будем работать с восьмибитный микроконтроллером.

Откроется окошко мастера создания проекта, оно кажется непонятным и даже немного пугающим, но это только на первый взгляд, все просто)

-2

Слева в списке выбираем Chip, это настройки выбора конкретного контроллера и его тактовой частоты. Выбираем ATtiny2313, ну или тот контроллер который имеется. Clock оставляем 8 МГц, Clock Prescaler Divider - делитель, определяющий во сколько раз будет меньше частота относительно базовой, выбранной нами в графе Clock. Оставляем 1.

-3

Дальше настроем наши порты ввода/вывода, который мы так мучительно программировали командами на ассемблере в прошлый раз.

-4

Выбираем вкладку Port B, если мы помним данный порт был настроен на выход. Здесь не нужно записывать какие-то старнные числа в какой-то там регистр, вместо этого просто щелкаем мышкой. Строка Data Direction отвечаем за то будет ли конкретный пин порта входом (In) или выходом (Out). Настраиваем все в Out, щелкаю по полю справа от номера бита. Вторая колонка отвечает за то какой сигнал будет на конкретном пине, если он является выходом (0 или 1), а в случае со входом определяет будет ли подключен подтягивающий резистор (т.е. вход будет подтянут к напряжению питанию), что соответсвует букве P (Pull Up), если же не требуется подтягивающий резситор, то устанавливается T (Terminate). Таким образом, ставим в Data Direction порта B везде Out и в правой колонке устанавливаем 1. Далее с портом D ставим везде In и устанавливаем в правой колонке везде P, чтобы подтянуть входы к питанию.

Супер, на этом с настройкой проекта мы закончим. Вот и ничего страшного и не произошло. Теперь нажимаем иконку дискетки с шестеренкой "Generate program, save and exit".

-6

Дальше выбираем директорию исполнительного файла и придумываем ему название.

Опа, ещё окошко. Тут выбираем уже директорию (лучше ту же) и название (лучше то же) для файла проекта, в котором хранится информация об кристалле и всякая сервисная херня. Жмем сохранить.

И вот опять окно. Кода это закончится. Тут повторяем тоже самое, только это будет файл пересборщика проекта, на всякий если вдруг твой проект съела собака и тебе нужно его пересобрать, то этот файл етеб в помощь. Жмем сохранить.

Урааа, проект создался и готов к работе.

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

Этой строчкой будет (Альберт Эйнштейн): PORTB = PIND;

Итоговый код программы:

while (1)
{
PORTB = PIND;
}

Чудо какое-то.

В СИ есть переменные, это как бы те же регистры контроллера, которые хранят какую-то информацию. С ними можно делать любые математические операции (сложение, вычитание, умножение, деление), также им можно присваивать различные значения. Как раз тут это мы и используем. Оператор присваивания это =. Он присваивает переменной слева значение переменной или константы справа. Мы берем переменную PORTB, которая отвечает за состояние выходов порта B и присваиваем ей переменную PIND, которая отвечает за состояние входов порта D. Вместо безусловных переходов на ассемблере, тут используется цикл while. Цикл While выполняет код в фигурных скобках до тех пор, пока условие в скобках истинно, да нном случае стоит 1, а любое число кроме 0 интерпритируется как истина, таким образом наша программа бесконечно выполняется. И нажатие на кнопку зажигает свой светодиод.

На этом все, спасибо за внимание!

Пока!