Приветствую Вас, Гость! Регистрация RSS

Среда, 04.12.2024
Главная » Статьи » Cтатьи

Что такое микроконтроллер AVR. Программирование микроконтроллера


Микроконтроллеры AVR – семейство универсальных, 8-битных микроконтроллеров RISC-архитектуры с различными встроенными периферийными устройствами. Микроконтроллеры ликвидируют разрыв между аппаратным и программным обеспечением – они выполняют программу как обычный компьютер, являясь в тоже время дискретными элементами, которые могут взаимодействовать с другими компонентами схемы.
Среди микроконтроллеров AVR есть огромное количество различных моделей, начиная от небольших до средних устройств в 8 - 40-выводных и заканчивая микросхемами в TQFP и PLCC корпусах.

Основная особенность, которая объединяет все модели микроконтроллеров AVR – это общее ядро. Это означает, что, написав программу для одной модели, можно с небольшой переделкой адаптировать ее под другую.
 
Микроконтроллер имеет помимо логических портов ввода\вывода еще и функциональную периферию (АЦП, приемо-передатчик, модуль TWI, счетчики, SPI и т.д.). Различие в составе периферии проявляется с определенным типом модели.

Архитектура микроконтроллера – это система управления, состоящая из счетчика команд и схемы декодирования, выполняет считывание и декодирование команд из памяти программ,

а операционное устройство (АЛУ) отвечает за выполнение арифметических и логических операций; интерфейс ввода\вывода позволяет обмениваться с внешними периферийными устройствами.

Суть программирования состоит в том, чтобы заставить микроконтроллер производить работу по перемещению чисел и операций над ними. Значит, микроконтроллеру для функционирования требуется управляющая программа. Без программы микроконтроллер, по сути, кусок пластмассового корпуса с выводами и фирменной маркировкой названия типа.





Запрограммированный микроконтроллер имеет широкие функциональные возможности:
   • Может управляться кнопками
   • Зажигает светодиоды
   • Обеспечивает обмен данными с компьютером
   • Можно подключить внешнюю память
   • Управляет полупроводниковыми элементами ( транзисторы, тиристоры, дискретные логические элементы (И, ИЛИ, дешифраторы,          счетчики и т.д. ) и т.д. )
   • Можно организовать аппаратно – программную связку с точно таким же микроконтроллером посредством модуля TWI или портами          ввода\вывода ( некоторые модели модели имеют в своем составе по нескольку приемо-передатчиков ).

  • и т.д.


В этой статье выясним, как начать работать с микроконтроллером, как его запрограммировать, одним словом заставить этот кусок фирменного пластмасса работать на нас.

Для примера возьмем всеми известный микроконтроллер Atmega8535. По-крайней мере я эту микросхему мучаю уже давно ( пару лет ). Микроконтроллер имеет 32 линии ввода\вывода, при том, что 80% выводов имеют функциональный характер, т.е. соединены с внутренней периферией ( АЦП, приемо-передатчик и т.д. )

Микроконтроллер Atmega8535 существует в нескольких корпусных исполнениях – DIP40, PLCC44, TQFP44. Какой тип корпуса использовать, зависит от конструктивно-топологического решения.

Микроконтроллер, являющийся многофункциональной, вычислительной микросхемой (микро-ЭВМ), не обходится без внешней, электронной «обвязки». Для того, чтобы начать работать с микроконтроллером, к нему необходимо подключить кварцевый резонатор к выводам XTAL1, XTAL2, RC-цепь сброса к выводу RESET, 5в стабилизированного питания к выводам VCC, GND, разъем для программирования по каналу SPI к выводам SS, MOSI, MISO, SCK, RESET и плюс к этому всему макетная плата с контактными площадками для распайки деталей. Это только минимум, для того, чтобы «запустить» микросхему. Далее, подключение светодиодных индикаторов, кнопок, микросхемы интерфейса COM( MAX232 ), USB и ЖК-дисплея к портам ввода\вывода.

Как видно из схемы, разъем Х1 используется для программирования микроконтроллера через интерфейс SPI. Резистор R1 и конденсатор C1 образуют цепь сброса микроконтроллера – это важный этап первоначального запуска. К выводам 12, 13 подключен кварцевый резонатор Q1 с подтянутыми к его выводам конденсаторами C2 и C3, посаженными на корпус. В только, что купленном микроконтроллере конфигурационные ячейки установлены для работы от внутреннего генератора с RC – цепочкой( по-крайней мере я с этим столкнулся в Atmegа8535 ). Для "прошивания" микроконтроллера, я использовал программатор, сделанный прямо в корпусе DP-25C с разъемом DB-25M ( LPT ) на микросхеме 74HC244. Схема очень простая и найти её в инет сети очень легко. Вот внешний вид программатора:

Корявая надпись на корпусе программатора совершенно не влияет на процесс оживления микроконтроллеров и они работают четко, и исправно...

Что касается софта, то программировать можно прямо из среды CodeVisionAVR. Выбираем Settings -> Programmer: появляется окно Programmer settings в котором из перечня списка AVR Chip Programmer Type выбираем тип Kanda Systems STK200+\300 и порт LPT1 ( смотря к какому подключён программатор ):

Жмём OK и в тулбаре среды щелкаем по значку , потом в появившемся окне кнопочку  и на наблюдаем результат в виде работающего микроконтроллера, так как было задумано. . .

Вообще это староватый на сегодняший день способ "прошивания" микроконтроллеров, т.к. уже современные компьютеры не имеют данного порта ( это касается и COM портов ). Поэтому желательно  и даже нужно осваивать "прошивание" микроконтроллеров используя USB порт.


Неотъемлемой частью любого микроконтроллера ( хоть PIC фирмы Microchip, хоть Z8 фирмы Zilog, хоть другие ) являются порты ввода\вывода. Посредством портов, архитектура микроконтроллера имеет возможность взаимодействовать с внешним "миром" периферии, системной шиной, линиями обмена c ЭВМ и другими устройствами. Порты микроконтроллера являются, помимо логическими линиями ввода\вывода, но и еще функциональными выводами. Какой именно вывод микроконтроллера будет являться линией I\0 или функциональным значением, зависит от программного решения. 
Определяющим элементом линии I\0, которая может быть входом или выходом, является регистр направления данных порта ( DDRn ). Логическое состояние линии порта определяет регистр данных порта ( PORTn ). Логическая "1" устанавливается путем подключения внутреннего, подтягивающего резистора (нагрузочный MOS резистор). Инициализация порта:
 

 PORTn=0x00. . .0xff; ( 0. . .255 ).
Или
 PORTn.n=0( 1 ); //В среде CodeVisionAVR – PORTD.0=1 или 0;


Если, например, проинициализировали как:

  DDRD=0xf0;
  PORTD=0xff;

Первые четыре старших разряда PD7, PD6, PD5, PD4 определены как выходы с подключенными, подтягивающими резисторами. Четыре младших разряда PD3, PD2, PD1, PD0 определены как входы с подключенными, подтягивающими резисторами. 
PINn является выводом входа или выхода. Если вывод PD0 определили входом с "подтяжкой”, то проверка PIND выглядит так:

 /* инициализация вывода PD0 порта D на вход с подтяжкой */
 DDRD=0xfe;
 PORTD=0x01;
 /* проверяем вывод PD0 на наличие нулевого состояния */
 While( 1 ){
 If( PIND.0==0 ){ /* программная инструкция (операторы, функции, и т.д. */ }
 }

Если линии порта нужно определить как функциональные, то это выполняется во время инициализации. PORTD с выводами PD0 и PD1 являются, как линиями ввода\вывода, так и линиями RXD ( прием данных ) и TXD ( передача данных ) приемо-передатчика USART. При инициализации приемо-передатчика, т.е. как только разрешили работу приемника UCSRB=( 1<<RXEN ); или/и передатчика UCSRB=( 1<<TXEN ); USART, то линия приемо-передатчика подключается к выводам PD0, PD1. Любая инициализация порта (ввод или вывод), касательно выводов PD0, PD1 результата не даст. Если это изобразить ввиде схематического рисунка, то примерно выглядит так:

Таким же не "хитрым" способом происходит и инициализация других выводов разных портов в функциональные значения:

 interrupt [EXT_INT0] void ext_int0_isr( void )
 {
     /* программный код обработчика прерывания */

 }

 void main( void )
 {
   
// Инициализация линии внешнего прерывания
    // INT0: линия активна. Вывод PD2
    // Режим Any change: Любое изменение

    GICR
|=0b01000000;
    MCUCR=0b00000001
;
    MCUCSR=0x00;
    GIFR=0b01000000;
    // Разрешение глобального прерываниия
    #asm( "sei" )

    While( 1 );

 }

Категория: Cтатьи | Добавил: Автор (02.05.2010)
Просмотров: 35229 | Комментарии: 2 | Теги: Микроконтроллер AVR, LPT программатор, ядро, RISC-архитектура, программирование микроконтроллера, порты, Atmega8535, линии ввода-вывода | Рейтинг: 5.0/1
Всего комментариев: 2
1 Squanto  
0
Очень важная статья я думаю.
Я начинающий радиолюбитель, умею только паять и ничего больше! Но это не помешало мне починить ТВ Тюнер в комнате, там перегорел конденсатор, я перепаял, подобрал, значит мозг есть. Хочу освоить микроконтроллерную индустрию, а потом делать роботов и на базе полноценного ПК, управлением через Wifi модули.Слушай, я очень хочу начать заниматься роботехникой, и начну.
Я недавно приобрёл микроконтроллер ATmega16-16au в корпусе TQFP44.
Хочу попробовать сделать нечто похожее на ArDuino, но программатор будет отдельно(по задумке).
Я мало разбираюсь, но очень хочу мне 18 лет, думаю ума хватит.
Цель первого моего проекта - получение данных от ИК-датчика, и управление 2 приводами в шасси. Датчик вращается головой на сервоприводе. ОООЧЕНЬ НУЖНЕН HELP! wacko wacko
Свяжись со мной умоляю, я в скайпе- squanto_number_one
Vkontakte - vk.com/squanto
Умоляю!!!
Если мне никто не поможет я долго буду разбираться. НО я добьюсь этого!!!
Цель моих последующих проектов-андроид на сервоприводах с акселерометром, ик датчиками, микрофоном, датчиками света, ультразвуковым резонатором и голосовыми командами. biggrin biggrin biggrin
Но начну с элементарного!

2 Алексей  
1
Когда я начинал, то тоже столько всего хотел. )))) Начни сначало просто с моргания светодиодом. Это классика. А там видно будет.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]