Mga kategorya: Mga circuit ng Microcontroller
Bilang ng mga tanawin: 41940
Mga puna sa artikulo: 5
Mga pamamaraan para sa pagbabasa at pamamahala ng mga port ng Arduino I / O
Upang makipag-ugnay sa mundo sa labas, kailangan mong i-configure ang mga output ng microcontroller upang makatanggap o magpadala ng isang signal. Bilang isang resulta, ang bawat pin ay gagana sa input at output mode. Mayroong dalawang mga paraan upang gawin ito sa bawat board na Arduino na gusto mo, eksakto kung paano mo natutunan mula sa artikulong ito.

Pamamaraan Isa - Ang Pamantayang Wika para sa Arduino IDE
Alam ng lahat iyon Arduino Ito ay na-program sa C ++ na may ilang pagbagay at pagpapagaan para sa mga nagsisimula. Ito ay tinatawag na Wiring. Sa una, ang lahat ng mga arduino port ay tinukoy bilang mga input, at hindi na kailangang tukuyin ito sa code.
Karaniwang nakasulat ang mga port sa variable na pag-andar ng variable:
walang pag-setup ()
{
// code
}
Ang utos ng PinMode ay ginagamit para sa mga ito, mayroon itong medyo simpleng syntax, una na ipinapahiwatig ang numero ng port, pagkatapos ang papel nito ay pinaghiwalay ng mga koma.
pinMode (numero_porta, naznachenie)
Sa utos na ito, ang panloob na circuitry ng microcontroller ay na-configure sa isang tiyak na paraan.
Mayroong tatlong mga mode kung saan maaaring gumana ang port: INPUT - input, sa mode na ito ay nangyayari pagbabasa ng data mula sa mga sensor, katayuan ng pindutan, analog at digital signal. Ang port ay matatagpuan sa tinatawag na estado ng mataas na impedance, sa mga simpleng salita - ang input ay may mataas na pagtutol. Itinakda ang halagang ito, halimbawa, 13 pin ng board, kung kinakailangan, tulad ng sumusunod:
pinMode (13, INPUT);
OUTPUT - output, depende sa utos na inireseta sa code, ang port ay tumatagal ng halaga ng isa o zero. Ang output ay nagiging isang uri ng kinokontrol na mapagkukunan ng kapangyarihan at gumagawa ng isang maximum na kasalukuyang (sa aming kaso, 20 mA at 40 mA sa rurok) sa pag-load na konektado dito. Upang magtalaga ng isang port bilang isang output sa Arduino kailangan mong ipasok:
pinMode (13, OUTPUT);
INPUT_PULLUP - ang port ay gumagana bilang isang input, ngunit ang tinaguriang kumokonekta dito. 20 kΩ pull-up risistor.
Ang kondisyong panloob na circuitry ng port sa estado na ito ay ipinapakita sa ibaba. Ang isang tampok ng input na ito ay ang signal ng input ay napansin bilang baligtad (ang "yunit" sa input ay napagtanto ng microcontroller bilang "zero"). Sa mode na ito, hindi ka maaaring gumamit ng panlabas na mga pull-up resistors kapag nagtatrabaho sa mga pindutan.
pinMode (13, INPUT_PULLUP);

Ang data ay natanggap mula sa mga port at ipinadala sa kanila sa pamamagitan ng mga utos:
-
digitalWrite (pin, halaga) - pinapalitan ang output pin sa isang lohikal na 1 o 0, ayon sa pagkakabanggit, 5V boltahe ay lilitaw o mawala sa output, halimbawa digitalWrite (13, HIGH) - nagtustos ng 5 volts (lohikal na yunit) sa 13 pin, at digitalWrite (13, mababa ) - isinasalin ang 13 mga pin sa isang estado ng lohikal na zero (0 volts);
-
digitalRead (pin) - binabasa ang halaga mula sa input, halimbawa digitalRead (10), binabasa ang signal mula sa 10 mga pin;
-
Ang analogRead (pin) - nagbabasa ng isang signal ng analog mula sa isang analog port, nakakakuha ka ng isang halaga sa saklaw mula 0 hanggang 1023 (sa loob ng 10-bit ADC), isang halimbawa ay analogRead (3).
Paraan ng dalawa - pamahalaan ang mga port sa pamamagitan ng mga rehistro ng Atmega at pabilisin ang code
Ang ganitong kontrol ay siyempre simple, ngunit sa kasong ito mayroong dalawang mga sagabal - higit na pagkonsumo ng memorya at mahinang pagganap kapag nagtatrabaho sa mga port. Ngunit tandaan kung ano ang Arduino, anuman ang pagpipilian sa board (uno, micro, nano)? Una sa lahat, ito microcontroller AVR pamilya ATMEGA, kamakailan lamang ay ginamit ang MK atmega328.
Sa Arduino IDE, maaari mong i-program ang wikang C AVR na katutubo sa pamilyang ito, na parang nagtatrabaho ka sa isang hiwalay na microcontroller. Ngunit unang bagay muna. Upang pamahalaan ang mga port ng Arduino sa ganitong paraan, kailangan mong maingat na isaalang-alang ang sumusunod na paglalarawan.
Marahil ay mas malinaw na suriin ng isang tao ang mga port sa form na ito (pareho sa figure, ngunit sa ibang disenyo):

Dito makikita mo ang pagsusulat ng mga konklusyon ng Arduino at ang mga pangalan ng mga ports atmega. Kaya, mayroon kaming 3 port:
-
PORTB;
-
PORTC;
-
PORTD.
Batay sa mga imahe na ipinakita, naipon ko ang isang talahanayan ng sulat sa pagitan ng mga port ng Arduino at Atmega, magiging kapaki-pakinabang ito sa iyo sa hinaharap.

Ang Atmega ay may tatlong 8-bit na rehistro na kumokontrol sa estado ng mga port, halimbawa, malalaman ng port B ang kanilang layunin sa pamamagitan ng pagguhit ng mga analogies kasama ang mga karaniwang tool ng mga kable na inilarawan sa simula ng artikulong ito:
-
PORTB - Pamahalaan ang katayuan ng output. Kung ang pin ay nasa mode na "Output", pagkatapos ay matukoy ng 1 at 0 ang pagkakaroon ng parehong mga signal sa output. Kung ang pin ay nasa mode na "Input", pagkatapos ay nag-uugnay ang isang pull-up resistor (katulad ng INPUT_PULLUP na tinalakay sa itaas), kung ang 0 ay isang high-impedance state (analogue ng INPUT);
-
Ang PINB ay isang rehistro sa pagbasa. Alinsunod dito, naglalaman ito ng impormasyon tungkol sa kasalukuyang estado ng mga pin ng port (lohikal na yunit o zero).
-
DDRB - rehistro ng direksyon ng port. Gamit nito, ipinapahiwatig mo sa microcontroller kung ano ang port bilang isang input o output, na may "1" isang output at "0" isang input.
Sa halip ng liham na "B", maaaring mayroong iba pang ayon sa mga pangalan ng mga pantalan, halimbawa, ang iba pang mga utos ng PORTD o PORTC.
Sinisisi namin ang LED, palitan ang karaniwang digitalWrite () function. Una, alalahanin natin kung ano ang hitsura ng orihinal na halimbawa mula sa library ng Arduino IDE.

Ito ang code ng kilalang "blink", na nagpapakita ng kumikislap ng LED na binuo sa board.

Ipinapaliwanag ng mga komento ang code. Ang lohika ng gawaing ito ay ang mga sumusunod.
Ang utos ng PORTB B00100000 ay naglalagay ng PB5 sa estado ng isang lohikal na yunit, tingnan, at ang mga larawang iyon at talahanayan na matatagpuan sa ibaba at makita na ang PB5 ay tumutugma sa 13 pin ng Arduina.
Ang titik na "B" sa harap ng mga numero ay nagpapahiwatig na sinusulat namin ang mga halaga sa binary form. Ang pagbilang sa binary ay papunta mula kanan hanggang kaliwa, i.e. narito ang yunit ay nasa ikaanim na bit mula sa kanang gilid ng bit, na nagsasabi sa microcontroller tungkol sa pakikisalamuha sa estado ng ikaanim na piraso ng port B rehistro (PB5). Ipinapakita sa talahanayan sa ibaba ang istraktura ng port D, ito ay katulad at ibinibigay bilang isang halimbawa.

Maaari mong itakda ang halaga hindi sa binary, ngunit sa hexadecimal form, halimbawa, para dito binuksan namin ang windows calculator at sa "VIEW" mode, piliin ang opsyon na "Programmer".

Ipasok ang nais na numero:

At mag-click sa HEX:

Sa kasong ito, inilipat namin ang lahat ng ito sa Arduino IDE, ngunit sa halip na ang prefix na "B" ay magiging "0x" ito.

Ngunit sa input na ito mayroong isang problema. Kung mayroon kang anumang konektado sa iba pang mga pin, pagkatapos ay pagpasok ng isang utos tulad ng B00010000 - i-reset mo ang lahat ng mga pin maliban sa 13 (PB5). Maaari kang magpasok ng data para sa bawat pin nang paisa-isa. Mukhang ganito:

Ang nasabing tala ay maaaring mukhang hindi maintindihan, alamin natin ito.

Ito ay isang lohikal na operasyon ng karagdagan, | = ay nangangahulugang pagdaragdag ng isang bagay sa mga nilalaman ng port.

Nangangahulugan ito na kailangan mong magdagdag ng isang salita ng 8 bits sa rehistro na may isang yunit na inilipat ng 5 bits - bilang isang resulta, kung ang 11000010 ay naging 110,110,010. Ang estado ng mga pin ng microcontroller ay nanatiling hindi nagbabago.
Ngunit sa makatuwirang karagdagan, lumitaw ang isang problema - hindi mo maaaring gawing zero ang yunit, sapagkat:
0+0=1
1+0=1
0+1=1
Ang lohikal na pagpaparami at pagbabalik-loob ay makakatulong sa amin:

& = nangangahulugan na dumami ang mga nilalaman ng port sa pamamagitan ng isang tiyak na numero.

At ito ang bilang kung saan tayo dumarami. Ang tanda na "~" ay nagpapahiwatig ng pag-iikot. Sa aming kaso, zero ang inverted unit. Iyon ay, pinarami namin ang mga nilalaman ng port sa pamamagitan ng zero, inilipat ng 5 bits. Halimbawa, ito ay 10110001, naging 10100001. Ang natitirang mga piraso ay nanatiling hindi nagbabago.

Ang parehong ay maaaring gawin gamit ang invert operation (^):
Ang pagbabasa mula sa mga port, ang analog ng digitalRead () ay isinasagawa gamit ang PIN rehistro, sa pagsasagawa ay ganito ang hitsura:

Narito suriin namin kung ang expression sa mga panaklong ay pantay sa totoong estado ng mga port, i.e. katulad din kung sumulat tayo kung (digitalRead (12) == 1).
Konklusyon
Bakit may mga ganitong paghihirap sa pamamahala ng port kung maaari mong gamitin ang mga karaniwang maginhawang pag-andar? Lahat ito ay tungkol sa bilis at laki ng code. Kapag ginagamit ang pangalawang pamamaraan, tinalakay sa artikulo, ang laki ng code ay makabuluhang nabawasan, at ang bilis ay nagdaragdag ng maraming mga order ng magnitude. Ang karaniwang digitalWrite () ay ginanap noong 1800 μ, at direktang nagre-record sa daungan sa 0.2 μs, at digitalRead () noong 1900,, at naging 0.2 μ. Ang pamamaraan ng kontrol na ito ay natagpuan sa bukas na mga puwang ng network at madalas na matatagpuan sa code. tapos na mga proyekto.
Tingnan din sa electro-tl.tomathouse.com
: