Опубликовано 2010-01-24 11:11:02 автором MRS

С чего начать программировать AVR микроконтроллеры. Урок AVR 1


В этом учебном курсе по avr я постарался описать все самое основное для начинающих программировать микроконтроллеры avr. Все примеры построены на микроконтроллере atmega8. Это значит, что для повторения всех уроков вам понадобится всего один МК.микроконтроллер atmega8 В качестве эмулятора электронных схем используется Proteus - на мой взгляд, - лучший вариант для начинающих. Программы во всех примерах написаны на компиляторе C для avr CodeVision AVR. Почему не на каком-нибудь ассемблере? Потому что начинающий и так загружен информацией, а программа, которая умножает два числа, на ассемблере занимает около ста строк, да и в сложных жирных проектах используют С. Компилятор CodeVision AVR заточен под микроконтроллеры atmel, имеет удобный генератор кода, неплохой интерфейс и прямо с него можно прошить микроконтроллер.

В этом учебном курсе будет рассказано и показано на простых примерах как:

  • Начать программировать микроконтроллеры, с чего начать, что для этого нужно.
  • Какие программы использовать для написания прошивки для avr, для симуляции и отладки кода на ПК,
  • Какие периферийные устройства находятся внутри МК, как ими управлять с помощью вашей программы
  • Как записать готовую прошивку в микроконтроллер и как ее отладить
  • Как сделать печатную плату для вашего устройства
Для того, чтобы сделать первые шаги на пути программирования МК, вам потребуются всего две программы:
  • Proteus - программа-эмулятор (в ней можно разработать схему, не прибегая к реальной пайке и потом на этой схеме протестировать нашу программу). Мы все проекты сначала будем запускать в протеусе, а потом уже можно и паять реальное устройство. Скачать можно здесь
  • CodeVisionAVR - компилятор языка программирования С для AVR. В нем мы будем разрабатывать программы для микроконтроллера, и прямо с него же можно будет прошить реальный МК. Скачать можно здесь
После установки Proteus, запускаем егопервые шаги в ProteusОн нам предлагает посмотреть проекты которые идут с ним, мы вежливо отказываемся. Теперь давайте создадим в ней самую простую схему. Для этого кликнем на значок первый проект Proteus визуально ничего не происходит. Теперь нужно нажать на маленькую букву Р (выбрать из библиотеки) в панели списка компонентов, откроется окно выбора компонентов выбор устройства в Proteus в поле маска вводим название компонента, который мы хотим найти в библиотеке. Например, нам нужно добавить микроконтроллер mega8 выбор mega8 в Proteus в списке результатов тыкаем на mega8 и нажимаем кнопку ОК. У нас в списке компонентов появляется микроконтроллер mega8добавить mega8 в Proteus Таким образом добавляем в список компонентов еще резистор, введя в поле маска слово res и светодиод led добавление резистора в Proteus выбор светодиода в Proteus Чтобы разместить детали на схеме, кликаем на деталь, далее кликаем по полю схемы, выбираем место расположения компонента и еще раз кликаем. Для добавления земли или общего минуса на схему слева кликаем "Терминал" и выбираем Ground. Таким образом, добавив все компоненты и соединив их, получаем вот такую простенькую схемку схема Hello World в Proteus Все, теперь наша первая схема готова! Но вы, наверное, спросите, а что она может делать? А ничего. Ничего, потому что для того, чтобы микроконтроллер заработал, для него нужно написать программу. Программа - это список команд, которые будет выполнять микроконтроллер. Нам нужно, чтобы микроконтроллер устанавливал на ножке PC0 логический 0 (0 вольт) и логическую 1 (5 вольт).

Написание программы для микроконтроллера

Программу мы будем писать на языке С в компиляторе CodeVisionAVR. После запуска CV, он спрашивает нас, что мы хотим создать: Source или Project Выбор проекта в CodeVisionAVR Мы выбираем последнее и нажимаем кнопку ОК. Далее нам будет предложено запустить мастер CVAVR CodeWizard (это бесценный инструмент для начинающего, потому как в нем можно генерировать основной скелет программы) запуск мастера кода CVAVR CodeWizard выбираем Yes выбор чипа CVAVR CodeWizard Мастер запускается с активной вкладкой Chip, здесь мы можем выбрать модель нашего МК - это mega8, и частоту, на которой будет работать МК (по умолчанию mega8 выставлена на частоту 1 мегагерц), поэтому выставляем все, как показано на скриншоте выше. Переходим во вкладку Ports выбор чипа CVAVR CodeWizard У микроконтроллера 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, нужно два раза кликнуть на изображении микроконтроллера в протеусе. Появится вот такое окошко выбор прошивки МК в Proteus кликаем на пиктограму папки в поле Program File, выбераем hex - файл нашей прошивки и нажимаем кнопку ОК. Теперь можно запустить симуляцию нашей схемы. Для этого нажимаем кнопку "Воспроизвести" в нижнем левом углу окна Протеус.добавление резистора в Proteus

Комментарии - (6)

  • yu говорит:
    Здравствуйте! Вот прочитал Вашу статью и решил проверить, но разочаровался…. Сделал все как написано, но ничего не заработало. При этом никаких ошибок обе программы не выдали. В чем может быть проблема? Возможно, такое, что Вы допустили ошибку? Прошу проверьте, пожалуйста, код или еще лучше залейте файлы работоспособного проекта. Спасибо за внимание!
  • AdminRu говорит:
    Здравствуйте. У меня все правильно проверил.
  • Андрей говорит:
    Здравствуйте сделал все как у Вас после запуска программы сигнал доходит до резистора а дальше не поступает на светодиод. Объясните почему?
  • AdminRu говорит:
    Здравствуйте. На ножке микроконтроллера 5в устанавливается?
  • Филипп говорит:
    У меня тоже не мигает. Ошибка в том, что сопротивление резистора устанавливается как 10к по умолчанию. На вашем примере просто 10. Когда я у себя убрал букву "К" то диод замигал :)
  • AdminRu говорит:
    Все правильно, от 10к ему не хватает тока чтобы засветится, у меня стоит просто 10, это 10 ом

Добавить комментарий

Для отправки комментария вы должны авторизоваться.