Категорије: Склопови микроконтролера
Број прегледа: 41940
Коментари на чланак: 5

Методе за читање и управљање Ардуино И / О портовима

 

За интеракцију са спољним светом, морате да конфигуришете излазе микроконтролера за пријем или пренос сигнала. Као резултат тога, сваки пин ће радити у режиму улаза и излаза. Постоје два начина да то учините на свакој Ардуино плочи коју волите, тачно онако како учите из овог чланка.

Методе за читање и управљање Ардуино И / О портовима

Први метод - стандардни језик за Ардуино ИДЕ

То сви знају Ардуино Програмиран је на Ц ++ са одређеним прилагођавањем и поједностављењима за почетнике. Зове се ожичење. У почетку су сви портови ардуиноа дефинисани као улази и нема потребе да се у коду то специфицира.

Портови се обично пишу у функцији иницијализације променљиве:

подешавање празнине ()
{
// код
}

За то се користи наредба пинМоде, има прилично једноставну синтаксу, прво је назначен број порта, а затим његова улога одвојена зарезима.

пинМоде (номер_порта, назнацхение)

Овом командом интерно колање микроконтролера конфигурише се на специфичан начин.

Постоје три мода у којима порт може да ради: ИНПУТ - улаз, у овом режиму се дешава читање података са сензора, статус тастера, аналогни и дигитални сигнал. Лука се налази у тзв стање високе импеданце, једноставним речима - улаз има висок отпор. Ова вредност је постављена, на пример, 13 пинова плоче, ако је потребно, на следећи начин:

пинМоде (13, УЛАЗ);

ОУТПУТ - излаз, зависно од наредбе прописане у коду, порт узима вриједност једнаку или нулу. Излаз постаје врста контролисаног извора напајања и производи максималну струју (у нашем случају 20 мА и 40 мА на врхунцу) спојену на оптерећење. Да бисте Ардуину додијелили порт као излаз, морате унијети:

пинМоде (13, ИЗЛАЗ);

ИНПУТ_ПУЛЛУП - порт функционише као улаз, али тзв. Отпорни отпорник од 20 кΩ.

Условно интерно колање порта у овом стању приказано је доле. Карактеристика овог улаза је да се улазни сигнал перципира као инвертиран ("јединица" на улазу микроконтролер доживљава као "нула"). У овом режиму не можете користити спољне отпорне отпорнике када радите са дугмићима.

пинМоде (13, ИНПУТ_ПУЛЛУП);

Улазни отпорник

Подаци се примају од портова и преносе им команде:

  • дигиталВрите (пин, валуе) - претвара излазни пин у логички 1 или 0, напон се појављује или нестаје на излазу 5В, на пример дигиталВрите (13, ХИГХ) - напаја 5 волти (логичка јединица) на 13 пинова, а дигиталВрите (13, низак ) - преводи 13 пинова у стање логичке нуле (0 волти);

  • дигиталРеад (пин) - чита вредност са улаза, на пример дигиталРеад (10), чита сигнал са 10 пина;

  • аналогРеад (пин) - чита аналогни сигнал са аналогног порта, добијате вредност у опсегу од 0 до 1023 (унутар 10-битног АДЦ-а), пример је аналогРеад (3).


Друга метода - управљање портовима преко Атмега регистара и убрзање кода

Таква контрола је наравно једноставна, али у овом случају постоје два недостатка - већа потрошња меморије и лошији рад током рада са портовима. Али запамтите шта је Ардуино, без обзира на плочу са опцијама (уно, микро, нано)? Пре свега, ово микроконтролер АВР породице АТМЕГА, недавно коришћена МК атмега328.

У Ардуино ИДЕ-у можете програмирати на матерњем језику за ову породицу Ц АВР, као да радите са засебним микроконтролером. Али прво ствари. Да бисте на овај начин управљали лукама Ардуино, прво морате пажљиво размотрити следећу илустрацију.

Портови за микроконтролере Атмега168

Можда ће неко јасније испитати портове у овом облику (исти на слици, али у другачијем дизајну):

Портови за микроконтролере Атмега328

Овде видите кореспонденцију закључака Ардуина и имена лука Атмега. Дакле, имамо 3 порта:

  • ПОРТБ;

  • ПОРТЦ;

  • ПОРТД.

На основу приказаних слика, саставио сам табелу преписке између лука Ардуино и Атмега, биће вам корисна у будућности.

Табела сагласности за луке Ардуино и Атмега

Атмега има три 8-битна регистра која контролирају стање портова, на пример, порт Б ће схватити њихову сврху цртањем аналогија са стандардним алатима за ожичење описаним на почетку овог чланка:

  • ПОРТБ - Управљање излазним статусом. Ако је пин у режиму "излаз", тада 1 и 0 одређују присуство истих сигнала на излазу. Ако је пин у режиму "Инпут", тада 1 повезује подизни отпорник (исто као што је горе описано ИНПУТ_ПУЛЛУП), ако је 0 стање високе импеданце (аналогно ИНПУТ-у);

  • ПИНБ је регистар за читање. У складу с тим, садржи информације о тренутном стању игле порта (логичка јединица или нула).

  • ДДРБ - регистар правца портова. Помоћу њега микроконтролеру показујете да ли је улаз улаз или излаз, са "1" излазом и "0" улазом.

Уместо слова „Б“, може постојати било која друга према именима портова, на пример, ПОРТД или ПОРТЦ остале команде раде слично.

Трепћемо ЛЕД, заменимо стандардну функцију дигиталВрите (). Прво, сетимо се како изгледа оригинални пример из Ардуино ИДЕ библиотеке.

Ардуино ЛЕД трепери код

Ово је шифра познатог „трептаја“, која показује трептање ЛЕД уграђене у плочу.

Пин управљање

У коментарима се објашњава код. Логика овог рада је следећа.

Наредба ПОРТБ Б00100000 ставља ПБ5 у стање логичке јединице, погледајте, и оне слике и табелу која се налази испод и видите да ПБ5 одговара 13 пин Ардуина.

Слово "Б" испред бројева означава да вредности пишемо у бинарном облику. Нумерирање у бинарном формату иде с десна на лијево, тј. овде је јединица у шестом биту са десне ивице бита, који микроконтролеру говори о интеракцији са стањем шестог бита регистра Б (ПБ5). У табели испод приказана је структура порта Д, слична је и дата је као пример.

Структура порта Д

Можете да поставите вредност не у бинарном, већ у шеснаестом облику, на пример, за то отварамо Виндовс калкулатор и у режиму „ВИЕВ“ бирамо опцију „Программер“.

Виндовс калкулатор

Унесите жељени број:

Начин програмирања калкулатора

И кликните на ХЕКС:

Превод бројева на калкулатор

У овом случају, све то преносимо на Ардуино ИДЕ, али уместо префикса "Б" биће "0к".

Пренос броја у Ардуино ИДЕ

Али са овим улазом постоји проблем. Ако имате било шта повезано са другим пиновима, тада уносите наредбу као што је Б00010000 - ресетићете све иглице осим 13 (ПБ5). Можете унети податке за сваки пин појединачно. Изгледаће овако:

Унос података у сваки пин

Такав запис се може чинити неразумљивим, схватимо то.

Представљање записа

Ово је логична операција додавања, | = значи додавање нечега у садржај порта.

Логично додавање

То значи да морате да додате реч од 8 бита у регистар са јединицом помереном за 5 бита - као резултат, ако се 11000010 покаже да је 110,110,010. У овом примеру се види да се само ПБ5 променио, остали битови овог регистра су остали непромењени, као и Стање пинова микроконтролера остало је непромењено.

Али са логичким додавањем, настаје проблем - не можете уређај претворити у нулу, јер:

0+0=1

1+0=1

0+1=1

Логично множење и инверзија ће нам помоћи:

Логичко умножавање и претварање

& = значи да множи садржај порта на одређени број.

 

Умножавање садржаја порта на број

А ово је број са којим се множимо. Знак "~" означава инверзију. У нашем случају, обрнута јединица је нула. Односно, множимо садржај порта на нулу, помакнут за 5 бита. На пример, био је 10110001, постао је 10100001. Преостали битови остали су непромењени.

Помножите садржај порта за нулу помјерен за 5 бита

Исто се може учинити и операцијом инверзије (^):

Читање из портова, аналогни дигиталРеад () се изводи помоћу ПИН регистра, у пракси изгледа овако:

Читајте из портова

Овдје провјеравамо да ли је израз у заградама једнак стварном стању портова, тј. слично ако смо написали иф (дигиталРеад (12) == 1).


Закључак

Зашто постоје такве потешкоће са управљањем портом ако можете користити стандардне практичне функције? Све је у брзини и величини кода. Када се користи друга метода о којој је реч у чланку, величина кода се значајно смањује, а брзина се повећава за неколико реда величине. Стандардни дигиталВрите () је изведен у 1800 µс, и снимање директно у порт у 0,2 µс, а дигиталРеад () у 1900 µс, а такође је постао у 0,2 µс. Ова метода управљања пронађена је на отвореним просторима мреже и често се налази у коду. готови пројекти.

Погледајте и на електрохомепро.цом:

  • Повезивање и програмирање Ардуино-а за почетнике
  • Како спојити инкрементални давач на Ардуино
  • ПИЦ микроконтролери за почетнике
  • Даљински управљач микроконтролера: ИР даљинац, Ардуино, ЕСП8266, 433 ...
  • Мерење температуре и влажности на Ардуину - избор метода

  •  
     
    Коментари:

    # 1 написао: Киповетс | [цитат]

     
     

    „Али са логичким додавањем, настаје проблем - не можете уређај претворити у нулу, јер:

    0 + 0 = 1 "(ц)

    Мали надзор: 0 + 0 = 0.

     
    Коментари:

    # 2 написао: цхугоу | [цитат]

     
     

    Киповетс, вероватно је желео да каже:

    1 + 1 = 1

     
    Коментари:

    # 3 написао: | [цитат]

     
     

    Киповетс,
    Банална погрешка! Видите колико је добро што на нашем порталу седе стручњаци! Морате да направите само погодан садржај!

     
    Коментари:

    # 4 је написао / ла: Серг | [цитат]

     
     

    У завршном делу пише ПОРТБ | = 1 << 5 ... иф (дигиталРеад (12) == 1). Али 5 пин лука Б, то је 13 пин ардуино-а. Или се варам ?!

     
    Коментари:

    # 5 написао: п-а-х-а | [цитат]

     
     

    Ако (ПИНБ == Б00010000) {} нијеслично као ако смо написали иф (дигиталРеад (12) == 1)
    радије аналогни
    (дигитално читање (12) == 1) &&(дигитално читање (13) == 1) &&(дигитално читање (14) == 1) &&(дигитално читање (15) == 1) &&(дигитално читање (11) == 1) ... и тако 8 пинова

    Овде вам треба било ово:
    ако (
    ! (~ ПОРТБ & (1 << ПБ4))) {} //враћа0 или 1
    било овако:
    ако (ПОРТБ & (1 << ПБ4)) {} // враћа померену јединицу = 16, ДЕЦ
    било овако:
    ако (
    бит_ис_сет (ПОРТБ, 4)) {}// враћа померену јединицу = 16, ДЕЦ