И так продолжим наш рассказ про МК. Сегодня начнем изучать программу CodeVisionAVR. Данная программа является хорошим компилятором. а так же легко прошивает МК.
Если у Вас еще нет данной программы, то ее можно скачать с официального сайта HP Info Tech или вот отсюда но правда версия по старее. Программа распространяется на коммерческой основе, но для проектов не более 4 кб компилит бесплатно. Я буду рассматривать все примеры на версии 2.04.4а. Если у Вас будет новая версия, то отличия могут быть не значительными. И так начнем. Я думаю что Вы уже скачали и установили программу. Делается это довольно просто. Теперь находим ярлык программы на рабочем столе и запускаем ее. При первой загрузке окно программы будет завалено кучей окон. Я обычно все их закрываю и Вам советую. В общем закройте окна так чтобы основное окно выглядело как на рисунке ниже.
Если все сделали правильно, то программа должна выглядеть как на картинке. Если да, то идем дальше, а если нет, то смотрите ошибки. Что-то сделали не так. Первая программа которую мы напишем, будет моргание светодиодом. Схему подключения смотрим ниже.
Питание я не рисовал, но для изготовления реальной модели требуется подключения питания. Теперь давайте рассмотрим схему. Х1 - это кварц. Давайте возьмем частоту в 4 МГц. Кварц нужен для тактирования МК. С1 и С2 нужны для старта кварца. Мы уже про данную схему подключения говорили впрошлой статье
. А вот новенькое добавилось к нулевому порту "В". R1 - это токоограничивающий резистор. Его рассчитать не сложно. Берем напряжение которое будет протекать через светодиод и делим на допускаемый ток светодиода. Далее берем ближайший резистор по номиналу выше расчетной и ву-а-ля. Ток ограничивать надо для того чтобы не сгорел светодиод. Конечно сопротивление порта может на себя перетянуть ток, но можно еще до кучи спалить и порт. Так что лучше поставить резюк. Ну со схемой все впоряде, давайте теперь программить.Как я уже говорил, что рассматривать будем все подробно. Поехали. Для того чтобы начать писать программу нам необходимо создать новый проект. Делается это так. File->Newи перед нами появляется окошко.
Выбираем Projectи давим ОК. И смотрим на новое появившееся окошко.
Здесь написано о том что Вы создали новый проект и программа спрашивает: создать проект с помощью генератора CodeWizardAVR? Если нажать нет, то созданный проект будет с чистого листа, а вот если нажать да... Мы естественно давим ДА.И перед нами появится вот такое окно.
Все сразу рассматривать не будем. Давайте пока только по нашему проекту. Первое что нужно это выбрать наш МК из списка и выставить частоту кварца во вкладке Chip.
Теперь поговорим немного о портах. У МК AVR перед работой с портами требуется их настройка. А именно объяснить МК какой порт будет работать на вход, а какой на выход. Для этих целей у МК есть регистр под названием DDRx где х имя порта. Если в какой-то бит этого порта записать 1, то соответствующий вывод порта будет работать как выход. А если 0, то как вход. Например нам нужно чтобы наш вывод под названием PB0 работал как выход, ведь на него мы будем выводить 0 и 1, то нам нужно в регисть DDRBзаписать значение 0х01 0х - это указатель того, что число после него записано в шеснадцатиричном формате. Если тяжело с шеснадцатеричным форматом, то можно написать его эквивалент в бинаре, а именно так 0b00000001. 0b - это указатель того, что число после него записано в бинаре(двоичном формате). Как видно 0-й бит (биты в байтах считаются от 0 до 7 справа налево) выставлен в 1, а остальные в 0. Поэтому PB0 будет работать как выход, а остальные выводы как вход. Чтобы настроить порт, мы просто открываем вкладку в конфигураторе с названием Ports.
Выбираем порт В нажимаем напротив Bit 0 кнопку In пока не появится Out(выход). В колонке напротив выставляется значение бита 0 или 1 которое будет выведено по умолчанию. То есть после начала выполнения программы, при настройке порта на выход, будет сразу же выведено значение по умолчанию. Мы поставили 1 значит при старте программы после настройки порта на выход на выводе PB0будет логическая единица, то есть +5в и наш светодиод загорится. Теперь нам надо сохранить проект и сгенерировать начальный код. Для этого жмем на иконку дискетки в конфигураторе кода.
Даем имя например led и жмем Сохранить.Затем нажимаем на иконку Шестеренка и даем такое же имя.
Жмем Сохранить, появится еще раз окно, запишем еще раз тоже имя и снова Сохранить.После этого программа сохранит проект и создаст начальный код. Весь код сразу рассматривать не будем, а лишь отведем время двум моментам. Первый это самое начало кода который расположен в блоке обрамленным знаками /* и */. Эти знаки означают многострочный комментарий. Все что написано между ними компилятор игнорирует. Все комментарии программа выделяет синим цветом для упрощения чтения кода. Так вот в этом блоке расположено описание МК, частоты кварца, величину стека и еще чего-то. В общем информацию о проекте. Второй момент это наш регистр настройки порта.
Как мы видим конфигуратор нам все настроил как надо. DDRB=0x01; PORTB=0x01;что тут к чему. Для того чтобы записать в регистр значение нам нужно написать DDRB=0x01; DDRB-это название регистра. Знак равенства это оператор присвоения. 0х01 - это значение которое мы присваиваем DDRB. А чтобы компилятор понял что выражение закончено мы должны в конце поставить точку с запятой. Короче мы регистру DDRB присвоили значение 0х01. PORTB=0x01;тут Вы должны сами догадаться что к чему.PORTB- это выходной регистр порта В. Все что в него запишем будет выведено непосредственно на выводы порта В МК. Помните при настройке мы сказали чтоб по умолчанию МК вывел на выводе РВ0значение 1? Вот он это и сделал. Ну вроде все настроили, теперь давайте писать основную программу. Задача: моргать светодиодом с интервалом в 1 секунду. Сказано сделано. Начнем с 1 секунды. Можно воспользоваться прерыванием таймера счетчика, но так как мы начинаем с нуля, то давайте воспользуемся библиотекой. Что это такое. Авторы данного компилятора написали за нас набор библиотек. Это нужно чтобы нам облегчить жизнь. К нашим баранам. Зачем нам сочинять свои временные задержки? Так как ими часто пользуются, то разработчики учли это и сделали все за нас. Нам остается только подключить нужную библиотеку и пользоваться ей как нашей душе угодно. Вот мы это сейчас и сделаем. Для этого в языке С есть такая запись: #include<delay.h>Эта фраза означает что мы хотим подключить файл с названием delay.hк нашей программе. Если Вы заметили, то файл имеет только имя и расширение, а полный адрес не написан. Это не ошибка, так как #includeесли не видит полного адреса, то ломится в папку по умолчанию, а находится она C:\cvavr\incесли конечно Вы не изменили директорию установки при инсталяции программы. Что значит подключить файл к нашей программе? А значит что код написанный в этом файле при компиляции будет записан на место #include<delay.h>.То есть тот код что писали разработчики программы нам стал доступен. Давайте теперь запишем эту строчку после строчки#include<mega8.h>.
Теперь нам доступны временные задержки. Спускаемся в самый низ к циклу while.И напишем тело нашей программы.
Давайте разберем ее по строкам.
1. while(1) { } - это цикл с предусловием. Это значит что пока в скобках значение истинно(больше нуля или true(истина)), то цикл будет выполнять команды записанные в фигурные скобки. Как только значение сменится на не истину(меньше или равно нулю либо false(лож)), то цикл прекращает выполняться и передает выполнение следующему оператору идущему за ним. У нас значение всегда 1, значит всегда истина. Поэтому цикл будет выполнятся бесконечно. Для изменение значения цикла пользуются либо каким-то выражением, либо переменной. Об этом мы поговорим позже.
2. PORTB.0=0; - это выражение нам уже знакомо за некоторыми но. После названия регистра вывода порта, стоит точка и ноль. Это означает что мы хотим выполнить вывод значения не всего байта(8бит), а только одного бита. А именно нулевого бита порта "В". То есть ври выполнении этого выражения на выходе РВ0 появится логический 0 и светодиод погаснет.
3. delay_ms(1000); Это наша подключенная библиотека. Тут все просто. Мы вызываем функцию задержки. Имя функции delay_ms ms в имени функции означает что аргумент будет задан в миллисекундах. Аргумент функции задается в скобках сразу после имени функции. О функциях мы поговорим позже. Так как в 1 с содержится 1000 мс, то мы так и написали.
4. PORTB.0=1; подождав секунду зажигаем светодиод.
5. delay_ms(1000); ждем секунду.
6. Так как больше выражений в теле цикла нет, то цикл проверяет условие, а оно у нас всегда истинно, значит он начинает выполнять выражения внутри своего тела сначала.
Теперь осталось за малым. Скомпилить и залить. Скомпилить просто, жмем на значек с квадратиками справа)
Ну вот и все. Ошибок нет. Программа занимает Program size: 101 words (202 bytes), 2,5% of FLASH.Ошибок нетNo errors.
Ну вот и все. В следующей статье мы уже будем заливать все это в МК и радостно наблюдать за миганием светодиода.