Достъп до порт I

Всички AVR портове (AVR обикновено се отнася до микроконтролери от популярните серииmegaAVR иtinyAVR от Atmel, например ATmega32A, използван в платката за разработка AVR-USB-MEGA16) имат функционалност за четене-модифициране-запис (четене-модифициране-запис ), когато работят с щифтовете на микроконтролера като нормални входно/изходни портове (портовеI/O с общо предназначение, GPIO). В този случай можете да промените посоката (да зададете дали е вход или изход) за всеки отделен GPIO пин (изход на AVR порта). Всеки щифт също има симетричен изходен буфер (два CMOS превключвателя, един за +, един за -), който може да извежда ток от захранването (VCC, обикновено +5V, източник на задвижване) или земя (GND, източник на мивка). Мощността на изходния драйвер е повече от достатъчна за директно управление на светодиода (LED). Също така, за всички щифтове на порта, конфигурирани като вход, можете избирателно да свържете вътрешен горен издърпващ резистор (издърпващ ), вграден директно в MCU чипа. Всички щифтове имат диоди за защита от пренапрежение, свързани към VCC и GND.

като

Опростена диаграма на AVR порт, конфигуриран като вход (състояние по подразбиране, DDRxn == 0).

достъп

Опростена диаграма на AVR порт, конфигуриран като изход (DDRxn == 1).

Бележки към чертежите:

Pxn - име на пина на порта на микроконтролера, където x е буквата на порта (A, B, C или D), n е номерът на бита на порта (7 .. 0).Cpin е паразитният капацитет на порта.VCC е захранващото напрежениеPINxn - бит n от регистъра PINx.DDRxn - бит n от регистъра DDRx.

Всеки порт на AVR микроконтролер (обикновено наречен A, B и понякога C или дори D) има 8цифри, всяка от които е свързана с определен крак на кутията. Всеки порт има три специални регистъраDDRx,PORTx иPINx (където x съответства на буквата A, B, C или D на порта). Предназначение на регистрите:

DDRxЗадайте битове на порт x за вход или изход.
ПОРТxКонтролиране на състоянието на изходите на порт x (ако съответният бит е конфигуриран като изход) или чрез свързване на вътрешен издърпващ резистор (ако съответният бит е конфигуриран като вход).
PINxПрочетете логическите битови нива на порт x.

Регистърът DDRx избира посоката на работа на всеки отделен щифт на порта. Ако се запише дневник в бита на регистъра DDRx. 1, съответният щифт ще бъде конфигуриран като изход. Нула означава, че портът е конфигуриран като вход (състояние по подразбиране след нулиране или включване). Ако 0 се запише в бита DDRx и 1 се запише в съответния бит PORTx, тогава портът не само е конфигуриран като вход, но и вътрешен издърпващ резистор (входнабиращ ) също е свързан към него. Ако 0 се запише в бита DDRx и 0 също се запише в съответния бит PORTx, тогава портът е конфигуриран като вход с високо входно съпротивление, което съответства на забранено изходно състояние (трето състояние), докато външни резистори за натоварване могат да бъдат свързани за изкуствено създаване на логически нива (издърпване отгоре към VCC или падащо отдолу към GND).

Ако регистрационният файл е записан в бита PORTx. 1 и в съответния DDRx бит се записва дневник. 1, тогава портът е конфигуриран като изход и изходът ще бъде дневник. 1. Ако регистрационният файл е записан в бита PORTx. 0 и се записва дневник в съответния бит DDRx. 1, тогава портът е конфигуриран катоизход и изходът ще бъде дневник. 0. Тоест битовете PORTx контролират състоянието на изходния порт, при условие че се записва дневник в бита DDRx, съответстващ на порта. 1.

порт

Логическата схема на организацията на входно-изходния порт (GPIO) на микроконтролера ATmega32A.

[Предварителна настройка на проекта за GPIO достъп ]

Името (модела) на AVR процесора може да бъде указано или директно във файлаMakefile чрез дефиниране на променливатаDEVICE, или просто в настройките на проекта (AVR Studio или Atmel Studio). Ето пример за част от Makefile, където е указан типът микроконтролер ATmega32:

Ето как се конфигурира типът микроконтролер в свойствата на проектаAVR Studio 4.19 (меню Проект -> Опции за конфигурация):

достъп

Ето как се конфигурира типът микроконтролер в свойствата на проектаAtmel Studio 6.0 (меню Проект -> Свойства):

порт

След като файлът io.h е свързан и типът на микроконтролера за проекта е зададен, можете да използвате имената на регистрите на AVR в програмния код на C. Имената на регистрите осигуряват достъп до GPIO портовете на микроконтролера.

[Как да третираме AVR портовете като изходи ]

Ако имаме 8-битова променлива i, тогава можем да присвоим нейната стойност на регистъра PORTx и по този начин да настроим щифтовете на микроконтролера в състояние, съответстващо на стойността на променливата i:

Тук е показан порт D, но можете да работите с портове A, B, C по същия начин, ако използвате подходящите имена на регистри (DDRA, PORTA, DDRB, PORTB и т.н.).

[Как да работите с AVR портове като входове ]

Ето как можете да четете логически нива от порт D в променлива i:

[Как да третирате отделните щифтове на AVR порт като изходи ]

Има възможност да се получидостъп до отделни щифтове на AVR порт. Това позволява битовете на порта да се използват гъвкаво за различни приложения.

Някои от 8-битовите щифтове на порта могат да бъдат конфигурирани да работят като изходи, докато останалите щифтове на порта могат да работят като входове. Тоест различните битове на един порт могат да изпълняват различни функции в зависимост от нуждите на потребителя.

Например, имаме нужда от порт D, за да имаме битове 0, 2, 4, 6 (PD0, PD2, PD4, PD6) да работят като входове (вход), а битове 1, 3, 5, 7 (PD1, PD3, PD5, PD7) да работят като изходи (изход). Тогава можем да използваме код като следния:

Сега можем да извеждаме произволна стойност към битове на щифта на порта (изходи) 1, 3, 5 и 7. Ето как да настроите тези битове на дневник. 1:

И така можете да нулирате тези крака към дневника. 0:

Можете също да използвате имена на битове, съответстващи на техните битови номера. Ето пример за това как можете да работите с битовете на порт D чрез имена:

Можете също така да зададете свои собствени мнемонични имена за битове и регистри за удобство. Ето как, например, можете да управлявате светодиода, свързан към бит 2 на порт D:

като

Тук макросите LED_ON и LED_OFF са зададени за удобно управление на един бит от порта D. Те ви позволяват да включвате и изключвате светодиода, свързан към щифта на порта PD2, и правят програмата ясна и проста.

Има и удобни макроси като_BV(n) за съставяне на маски.

[Прочетете отделни битове на AVR порта ]

Четенето на отделни битове на порта (краката на микроконтролера) AVR също е много просто. Например, задайте отделни пинове (битове 1 и 3) на порт D като входове и прочетете състоянието им в променлива:

Сега можете да разберете логическото състояние на отделните битове (1 или 3), като използватеизползване на битови маски, приложени към стойността на променлива.

По същия начин можете да разберете състоянието на крака PD1, като приложите маска към i (1DDxnPORTxnPUD(SFIOR)Вход/изходнабиранеОбяснение00хВходНеТрето състояние (забранено, Hi-Z).010ВходдаПортът Pxn ще пренася ток през крайния резистор, ако външна верига (товар) е свързана към земята.011ВходНеТрето състояние (забранено, Hi-Z).10хИзходНеИзходът е късо към маса (ключът на долния буфер е отворен, ключът на горния буфер е затворен).11хИзходНеИзходът е късо към положително VCC захранване (горен буферен ключ отворен, долен ключ затворен).

[Практически пример за GPIO портове на платка за разработка AVR-USB-MEGA16 ]

като

Пълен пример за кода main.c, който илюстрира работата с портовете на микроконтролера ATmega32A на платката за разработка AVR-USB-MEGA16:

[Как да управлявате портовете на микроконтролера чрез USB ]

Отговорът е очевиден - просто трябва да се научите как да установявате обмен на данни между микроконтролера и компютъра чрез USB. Ако такъв обмен бъде установен, тогава следващата стъпка е въпрос на технология - микроконтролерът ще може да интерпретира изпратения му байт като команда за извършване на определено действие (например включване или изключване на светодиода). Обратно, микроконтролерът ще може да прехвърля някои данни през USB, които компютърната програма ще получи и разпознае по определен начин.

И така, цялата уловка е как да се установи обмен между микроконтролера и компютъра чрез USB. Въпросът за избора на практическо решение на този проблем може да бъде много труден - поради факта, че на пазара има много различни микроконтролери и има много софтуерни библиотеки за обмен на данни между USB устройства. Но ако вече има някакви предпочитания или е избран модел на микроконтролер или макет, тогава вече е по-лесно да изберете. Тук ще обсъдя накратко възможните USB комуникационни решения за развойните платки AVR-USB-MEGA16 и AVR-USB162. По-долу, за простота, програмата за микроконтролера ще се наричафърмуер (тази програма ще работи катоUSB HID илиUSB CDC устройство), а програмата на компютъра, който комуникира с USB устройството, ще се наричахост софтуер.

AVR-USB-MEGA16 действа като USB устройство

Тази макетна платка съдържа микроконтролер ATmega32A. Той няма специален USB хардуерен контролер в чипа. Следователно USB протоколът се обработва от софтуер. В този случай фърмуерът на микроконтролера е изграден на базата на популярната библиотекаV-USB, тествана многократно в практиката.

Написването на фърмуера на USB HID устройство за V-USB базиран микроконтролер е доста лесно, тъй като има много добре документирани примери с отворен код за такива устройства (както в самата библиотека, така и в Интернет). За хост софтуер V-USB предоставя примери, написани с кръстосаната платформа (Windows, Mac, Lunux) библиотекаLibUSB.

[3] е устройство от клас USB HID, което не изисква драйвер. Въпреки това, поради факта, че LibUSB се използва за хост софтуер, е необходимо да се инсталира на компютъра по този начиннаречен филтърен драйвер - софтуерен слой между LibUSB и USB периферно устройство.

След като установите комуникация с AVR-USB-MEGA16 с помощта на [3, 4, 5], можете лесно да управлявате портовете на микроконтролера чрез USB.

AVR-USB162 действа като USB устройство

Развойната платка AVR-USB162 (или нейната компактна версия AVR-USB162MU) е базирана на микроконтролера AT90USB162. Този микроконтролер има специален хардуерен интерфейс за работа с USB, а други библиотеки вече се използват за фърмуер. Най-често срещаните са LUFA [6] и библиотеката Atmel за AVR USB Series2 устройства [7]. С тези библиотеки можете лесно сами да създадете свое собствено USB HID или USB CDC устройство.

За USB HID хост софтуер можете да използвате не само LibUSB, но и много други популярни библиотеки [8]. След като установите комуникация с AVR-USB162 с помощта на [7, 8], можете лесно да управлявате портовете на микроконтролера чрез USB.