Опубликовано 2010-01-24 11:11:02 автором MRS С чего начать программировать AVR микроконтроллеры. Урок AVR 1
В этом учебном курсе по avr я постарался описать все самое основное для начинающих программировать микроконтроллеры avr. Все примеры построены на микроконтроллере atmega8. Это значит, что для повторения всех уроков вам понадобится всего один МК. В качестве эмулятора электронных схем используется Proteus - на мой взгляд, - лучший вариант для начинающих. Программы во всех примерах написаны на компиляторе C для avr CodeVision AVR. Почему не на каком-нибудь ассемблере? Потому что начинающий и так загружен информацией, а программа, которая умножает два числа, на ассемблере занимает около ста строк, да и в сложных жирных проектах используют С. Компилятор CodeVision AVR заточен под микроконтроллеры atmel, имеет удобный генератор кода, неплохой интерфейс и прямо с него можно прошить микроконтроллер.
В этом учебном курсе будет рассказано и показано на простых примерах как:
- Начать программировать микроконтроллеры, с чего начать, что для этого нужно.
- Какие программы использовать для написания прошивки для avr, для симуляции и отладки кода на ПК,
- Какие периферийные устройства находятся внутри МК, как ими управлять с помощью вашей программы
- Как записать готовую прошивку в микроконтроллер и как ее отладить
- Как сделать печатную плату для вашего устройства
Для того, чтобы сделать первые шаги на пути программирования МК, вам потребуются всего две программы:
- Proteus - программа-эмулятор (в ней можно разработать схему, не прибегая к реальной пайке и потом на этой схеме протестировать нашу программу). Мы все проекты сначала будем запускать в протеусе, а потом уже можно и паять реальное устройство. Скачать можно здесь
- CodeVisionAVR - компилятор языка программирования С для AVR. В нем мы будем разрабатывать программы для микроконтроллера, и прямо с него же можно будет прошить реальный МК. Скачать можно здесь
После установки Proteus, запускаем его Он нам предлагает посмотреть проекты которые идут с ним, мы вежливо отказываемся. Теперь давайте создадим в ней самую простую схему. Для этого кликнем на значок визуально ничего не происходит. Теперь нужно нажать на маленькую букву Р (выбрать из библиотеки) в панели списка компонентов, откроется окно выбора компонентов в поле маска вводим название компонента, который мы хотим найти в библиотеке. Например, нам нужно добавить микроконтроллер mega8 в списке результатов тыкаем на mega8 и нажимаем кнопку ОК. У нас в списке компонентов появляется микроконтроллер mega8
Таким образом добавляем в список компонентов еще резистор, введя в поле маска слово res и светодиод led
Чтобы разместить детали на схеме, кликаем на деталь, далее кликаем по полю схемы, выбираем место расположения компонента и еще раз кликаем. Для добавления земли или общего минуса на схему слева кликаем "Терминал" и выбираем Ground. Таким образом, добавив все компоненты и соединив их, получаем вот такую простенькую схемку
Все, теперь наша первая схема готова! Но вы, наверное, спросите, а что она может делать? А ничего. Ничего, потому что для того, чтобы микроконтроллер заработал, для него нужно написать программу. Программа - это список команд, которые будет выполнять микроконтроллер. Нам нужно, чтобы микроконтроллер устанавливал на ножке PC0 логический 0 (0 вольт) и логическую 1 (5 вольт).
Написание программы для микроконтроллера
Программу мы будем писать на языке С в компиляторе CodeVisionAVR. После запуска CV, он спрашивает нас, что мы хотим создать: Source или Project
Мы выбираем последнее и нажимаем кнопку ОК. Далее нам будет предложено запустить мастер CVAVR CodeWizard (это бесценный инструмент для начинающего, потому как в нем можно генерировать основной скелет программы) выбираем Yes
Мастер запускается с активной вкладкой Chip, здесь мы можем выбрать модель нашего МК - это mega8, и частоту, на которой будет работать МК (по умолчанию mega8 выставлена на частоту 1 мегагерц), поэтому выставляем все, как показано на скриншоте выше.
Переходим во вкладку Ports
У микроконтроллера atmega8 3 порта: Port C, Port D, Port B. У каждого порта 8 ножек. Ножки портов могут находиться в двух состояниях: С помощью регистра DDRx.y мы можем устанавливать ножку входом или выходом. Если в - DDRx.y = 0 — вывод работает как ВХОД
- DDRx.y = 1 вывод работает на ВЫХОД
Когда ножка сконфигурирована как выход, мы можем выставлять на ней лог 1 (+5 вольт) и логический 0 (0 вольт). Это делается записью в регистр PORTx.y. Далее будет подробно рассказано про порты ввода-вывода. А сейчас выставляем все, как показано на скриншоте, и кликаем File->Generate, Save and Exit. Дальше CodeWizard предложит нам сохранить проект, мы его сохраняем и смотрим на код:
#include <mega8.h> //библиотека для работы с микроконтроллером mega8
#include <delay.h> //библиотека для создания временных задержек
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x01; // делаем ножку PC0 выходом
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;
while (1)
{
};
}
Здесь вам может показаться все страшным и незнакомым, но на самом деле все не так. Код можно упростить, выкинув инициализацию неиспользуемых нами периферийных устройств МК. После упрощения он выглядит так:
#include <mega8.h> //библиотека для работы с микроконтроллером mega8
#include <delay.h> //библиотека для создания временных задержек
void main(void)
{
DDRC=0x01; /* делаем ножку PC0 выходом запись 0x01 может показаться вам незнакомой, а это всего лишь число 1 в шестнадцатиричной форме,
эта строка будет эквивалентна 0b00000001 в двоичной, далее я буду писать именно так.*/
while (1)
{
};
}
Всё хорошо. Но для того, чтобы светодиод замигал, нам нужно менять логический уровень на ножке PC0. Для этого в главный цикл нужно добавить несколько строк:
#include <mega8.h> //библиотека для работы с микроконтроллером mega8
#include <delay.h> //библиотека для создания временных задержек
void main(void)
{
DDRC=0x01; /* делаем ножку PC0 выходом запись 0x01 может показаться вам незнакомой, а это всего лишь число 1 в шестнадцатиричной форме,
эта строка будет эквивалентна 0b00000001 в двоичной, далее я буду писать именно так.*/
while (1)//главный цикл программы
{// открывается операторная скобка главного цикла программы
PORTC.0=1; //выставляем на ножку 0 порта С 1
delay_ms(500); //делаем задержку в 500 милисекунд
PORTC.0=0; //выставляем на ножку 0 порта С 0
delay_ms(500); //делаем задержку в 500 милисекунд
};// закрывается операторная скобка главного цикла программы
}
Все, теперь код готов. Кликаем на пиктограму Build all Project files, чтобы скомпилировать (перевести в инструкции процессора МК) нашу программу. В папке Exe, которая находится в нашем проекте, должен появиться файл с расширением hex, это и есть наш файл прошивки для МК. Для того, чтобы нашу прошивку скормить виртуальному микроконтроллеру в Proteus, нужно два раза кликнуть на изображении микроконтроллера в протеусе. Появится вот такое окошко
кликаем на пиктограму папки в поле Program File, выбераем hex - файл нашей прошивки и нажимаем кнопку ОК.
Теперь можно запустить симуляцию нашей схемы. Для этого нажимаем кнопку "Воспроизвести" в нижнем левом углу окна Протеус. Комментарии - (6) yu говорит: Здравствуйте! Вот прочитал Вашу статью и решил проверить, но разочаровался…. Сделал все как написано, но ничего не заработало. При этом никаких ошибок обе программы не выдали. В чем может быть проблема? Возможно, такое, что Вы допустили ошибку? Прошу проверьте, пожалуйста, код или еще лучше залейте файлы работоспособного проекта. Спасибо за внимание! Admin говорит: Здравствуйте. У меня все правильно проверил. Андрей говорит: Здравствуйте сделал все как у Вас после запуска программы сигнал доходит до резистора а дальше не поступает на светодиод. Объясните почему? Admin говорит: Здравствуйте. На ножке микроконтроллера 5в устанавливается? Филипп говорит: У меня тоже не мигает.
Ошибка в том, что сопротивление резистора устанавливается как 10к по умолчанию.
На вашем примере просто 10.
Когда я у себя убрал букву "К" то диод замигал :) Admin говорит: Все правильно, от 10к ему не хватает тока чтобы засветится, у меня стоит просто 10, это 10 ом
Добавить комментарийДля отправки комментария вы должны авторизоваться.
|