RoboClub - Конструкции и компоненты

Where AI meet the real world

 
Главная страница
 

Новости
 

Статьи и обзоры
 

Алгоритмы и поведение
 

Проекты
 

Конструкции
 

Компоненты
- спецификации
- изготовление
- "спасенное имущество"
 

Микроконтроллеры AVR
- вводный курс
- программирование
- типовые решения
 

Личный опыт
 

Spybotics и другие роботы LEGO
 

Соревнования роботов
 

Коллекция ссылок
 

Форумы по робототехнике
 

Голосования
 

Доска объявлений ("Барахолка")
 

Книжная полка
 

Наша библиотека
 

Видеотека
 

FAQ
 

Контакты
 

Who is who?
 

Гостевая книга
 
Подписка на новости
RoboClub:
Е-Mail:
Формат писем:
Подписаться
Отказаться


Вводный курс по микроконтроллерам AVR от Михаила Клокова

Общие принципы
 
Чем хорошо семейство AVR, так это тем, что если вы хотите использовать контроллер этого семейства, единственное, что вам нужно - так это сам контроллер!
 
То есть Вы ставите контроллер на плату, подводите к нему питание, устанавливаете разъем для программатора и все, можете подключать внешние устройства!
 
Сделав все подключения, подсоединяете программатор и подаете на контроллер питание. Запускаете на своем компьютере "программирующую программу", убеждаетесь, что она "видит" ваш контроллер, и загружаете в память контроллера свою программу для контроллера. Сразу после загрузки (а в будущем - после включания контроллера или подачи сигнала RESET) ваша программа начнет работать!

О том, как писать программы для контроллеров AVR на языке С вы можете посмотреть во Введении в AVRGCC, а примеры программ найти в Типовых решениях.

Два слова о работе с внешними устройствами
 
Несколько слов о вещах базовых, которые настолько просты, что специалисты часто считают их само-собой разумеющимися и опускают даже в учебных курсах.
 
Каждый контроллер AVR имеет сколько-то линий ввода/вывода, объединенных в порты ввода/вывода. Порты обозначаются латинскими буквами A, B, C, D и т.д. Число линий (и, соответственно, портов) может быть разным: так, ATtiny12 имеет 6 линий ввода/вывода, представляющих порт В, а ATmega128 - 53 линии в портах с A по G.
 
Ко всем линиями ввода/вывода одного порта можно обратиться сразу, обратившись к соответствующему порту. Но можно обратиться к любой из линий и непосредственно, независимо от всех остальных.
 
Любую из линий (или весь порт сразу) можно по желанию программно и в любое время назначить на прием информации (на "вход"), либо на ее выдачу (на "выход"). Любая из линий обязательно может работать в режиме ТТЛ (по умолчанию), некоторые из линий можно (так же программно, и в любое время) назначить для исполнения других функций, к примеру, для получения или выдачи аналоговых сигналов.
 
Управление портом производится посредством двух регистров: регистра данных, обычно обозначаемого как PORTx (где "х" - обозначение порта, например регистр данных порта А - PORTА) и регистра направления данных DDRx. Управление отдельными линиями выполняется обращением к соответствующим битам регистров соответствующего порта.
 
Через регистр направления данных управляют тем, работают ли линии порта на вход или на выход: если какой-либо бит регистра DDRx установить в "1", то соответствующая линия будет сконфигурирована как выход, а если бит сброшен в "0" - то как вход.
 
Регистр данных PORTx управляет подключением внутренних резисторов к линиям данного порта. Установка в "1" бита регистра данных задаст высокий логический уровень на соответствующей линии, если линия сконфигурирована как выход, либо если она сконфигурирована как вход, но не подключена. Сброс того же бита устанавливает линию в логический "0" в режиме выхода, либо отключает "подтягивающий" резистор в режиме входа.
 
Одна полезная особенность семейства AVR: с портами связан еще один интересный адрес - вывод порта PINx. По этому адресу можно всегда прочитать фактическое состояние порта (или любой его линии). Эта возможность иногда оказывается крайне полезной. К примеру, вы выставили "1" на линии выхода; но если нагрузка емкостная, то как узнать, успело уже напряжение на линии достичь порога логической "1"? Прочитав соответствующий бит PINx!
 
PINx обычно используется для чтения данных и в том случае, если порт (или конкретная линия) сконфигурирован как вход.
 
Несколько предварительных замечаний к нижеследующему

  • Все нижеизложенное можно отнести ко всему семейству AVR, т.е. контроллерам типов AT90S, ATtiny и ATmega. Для начала можете считать, что они различаються только числом портов и объемом памяти.
  • При всех подключениях ориентируйтесь не на номера "ног", а на наименования выводов. К примеру, программатор подключается к выводам MOSI, MISO, SCK, RESET; на какие "ноги" они приходятся у вашего контроллера - посмотрите по спецификации (если спецификации нет на "Книжной полке", смотрите непосредственно на сайте ATMEL).
  • Некоторые типы контроллеров не требуют для работы внешнего "кварца", а некоторые требуют. Уточните это по спецификации, либо просто установите "кварц" "на всякий случай"; схема подключения дана в спецификации.
  • Если у вас небольшой опыт работы с компьютером, но вы хотели бы работать AVR GCC, установите себе AVREdit (можно взять здесь). AVREdit идет в виде одного самоустанавливающегося exe-файла; AVR GCC тоже входит в состав пакета и устанавливается автоматически при установке AVREdit.
     
    Настоятельно рекомендуется посмотреть примеры программ в каталоге /AVREDIT/DEMO, очень полезны! Не забывайте только, начав работу с программой, установить свой тип контроллера.
     
    К сожалению, AVREdit содержит не самую последнюю версию AVR GCC. Поэтому, если вам надо работать с новыми контроллерами семейств ATmega или ATtiny, либо у вас уже есть некоторый опыт программирования, советуем сразу воспользоваться пакетом WinAVR (можно взять здесь). В состав WinAVR входит самая "свежая" версия AVR GCC, кроме того программисты с опытом оценят удобство "программистского блокнота" (Programmers Notepad).
     
  • Некоторые компиляторы при работе с некоторыми программаторами позволяют сразу загружать вашу программу в память контроллера. Если это не так, то компилируете свою программу и получаете файл с расширением .hex (в AVREdit может потребоваться изменить формат выходного файла по умолчанию с rom на hex), а затем этот hex-файл "программой программатора" загружаете в память контроллера.
  • В прилагаемой тестовой программе подразумевается, что светодиод подключен к линии 7 порта D (т.е. PD7). Если вы хотите или вынуждены подключить диод к другой линии (к примеру, в микросхеме AT90S2313 линии PD7 нет), поменяйте в вызовах sbi и cbi (установить бит и сбросить бит, соответственно) обозначения портов и номера линий. В обозначениях портов DDRx и PORTx последняя буква - это наименование порта. Соответственно, если ваш светодиод подключен не к линии 7 порта D, а, к примеру, к линии 5 порта B (т.е. PD5), то во всех вызовах sbi и cbi надо поменять DDRD на DDRB, PORTD на PORTB, а "7" на "5".
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   От: Michael Klokov 
 Кому: roboclub 
======================================
Итак, что у нас (у Вас) есть:
- микроконтроллер ATmega16 

Надо:
- Скачать DataSheets про него с WWW.ATMEL.COM
  (хотя бы картинки посмотреть :))))
- Скачать AVRGCC (на WWW.AVRFREAKS.NET)
- Скачать PonyProg (на WWW.LANCOS.COM)

  Программатор:
  - метр десятижильного шлейфа.
  - DB25-папа (в принтеровский порт компа)
  - IDC-10-G мама врезная на шлейф

  Обвязка для контроллера:
  - Стабилизатор питания (если нужен) - КРЕН5А
    (кстати, вы знаете, что он потребляет ток - в два-три раза
    больший, чем контроллер? Я бы посоветовал взять что-нибудь
    нормальное - типа ADM663, но она стОит денег!
    И потом, вы же умудритесь движки сквозь нее запитать :))))
  - Пара конденсаторов вокруг (на всякий случай)
  - IDC-штырьки двухрядные (или однорядные) для программирования
  - Ну и я бы воткнул его (контроллер) в кровать...
    ...на всякий случай.
  - для проверки - светодиод с резистором...
  
  Собрать все это ( Схема приложена. Простая, правда? :)))).
  Проверить глазами :)))
  Выдрать проц из кровати :))
  Включить питание - померить пять вольт, на тех ли ногах...
  Выключить, вставить проц, включить.
  Убедиться, что:
  - проц не взорвался :))), не греется, питание на месте...

  Будем надеяться, все ОК... :))))

  Инсталлировать PonyProg.
  Воткнуть программатор в LPT
  Запустить PonyProg
  Выбрать в меню Setup-Calibration - on подумает и скажет "OK"
  Выбрать в меню Setup-Interface Setup...
  Появится окошко.
  У меня установки такие - смотри картинку (Win2000 - LPT1).
  Возможно для вашего компьютера надо выбирать другое -
  например не "AVR ISP I/O", а "AVR ISP API".
  Чтобы проверить, надо нажать "Probe"...
  Он должен сказать: "Test OK".

  Выбрать в меню Device-AVRmicro-ATmega16.

Включить программатор в плату с процом.

Меню Configuration and Security bits...
Появляется табличка:

Нажать "Read" - если все ОК, появятся какие-то флажки.
Значит программатор видит процессора и процессор запустился...

Теперь разворачиваем 
zip (приложен)
в какой-нибудь каталог...

Тыркаем в PonyProg в Commands-Program Options...
Ставим флажки Reload Files, Erase, Write Program memory (FLASH)... "ОК"
Тыркаем File-Open Program (FLASH) file.
Выбираем каталог, куда распакован zip.
Выбираем расширение *.hex.
Выбираем файл "main.hex"

Появляются байтики.

Тыркаем Command-Program (или желтую стрелочку)
Он сначала стирает... Некоторое время записывает...
Потом проверяет...
И по идее должен сказать "Successful", мол все хорошо...
Светодиод должен замигать...

Если моргает, то поздравляю,
контроллер уже выполняет нашу программу,
написанную на Си...
========================================================

Надеюсь, что помог "стартовать"...

Успехов.
Michael   

(c) RoboClub 2003