Atsevišķu bitu lasīšana un rakstīšana reģistrā. AVR mikrokontrolleru porti. Porta D ievades datu reģistrs – PIND

Viens no svarīgākajiem mikrokontrolleru programmēšanas aspektiem ir darbs ar reģistriem un portiem. AVR sērijas mikrokontrolleriem ir vairāki I/O reģistri un 32 vispārējas nozīmes darba reģistri. Programmētājs nevar tieši ierakstīt numuru I/O reģistrā. Tā vietā numurs ir jāieraksta vispārēja lietojuma reģistrā un pēc tam jākopē šī reģistra vērtība I/O reģistrā. Darba reģistri ir apzīmēti kā R1, R2, ..., R31.

Lai atvieglotu programmu rakstīšanu, ir ļoti ērti piešķirt reģistriem nosaukumus. Ieteicams dot nosaukumus, kas atbilst glabājamai informācijai. Piemēram, ja pagaidu informācijas glabāšanai tiek izmantots reģistrs R16, tad to var saukt par temp. Tas tiek darīts šādi:

Lai mikrokontrollera ievades/izvades reģistrus un galvenos reģistrus “nenosauktu”, pietiek pieslēgt programmas sākumā izmantotajam mikrokontrollerim atbilstošo galvenes failu. Tie. jums nebūs jādod nosaukumi ostu reģistriem, taimeriem / skaitītājiem utt. Piemēram, ja programma ir paredzēta mikrokontrollerim AT90s8515:

Iekļaut "8515def.inc"

AT90s1200 mikrokontrolleram - pašam pirmajam AVR mikrokontrollerim, ievades/izvades reģistros ir skaitļi no $0 līdz $3F (atkarībā no MK modeļa). Atsevišķi varam izcelt ievades/izvades reģistrus PortB, PinB, PortD, PinD (tiem pēc 1200def.inc pievienošanas ir burtu apzīmējumi, un to adreses ir $18, $16, $12, $10 - jāpiekrīt, ka to ir ļoti grūti saglabāt digitālās konstantes galvā, burtu nosaukumi ir vieglāki) . Jaunākajiem AVR mikrokontrolleriem ir daudz vairāk pieslēgvietu, tos sauc par A, B, C, D, E...

Apskatīsim populārā mikrokontrollera ATtiny2313 pinout izkārtojumu. Pins 2-9, 11, nosaukts PD0 - PD7, ir ports D, kas ir līdzīgs portam B. Ņemiet vērā, ka ports B ir astoņu bitu un ports D ir septiņu bitu.

Porti var darboties kā ieejas vai izejas. Ja ports darbojas kā ieeja, tad, lai nolasītu vērtības, ir jāpiekļūst PinB vai PinD reģistram - atkarībā no tā, no kura porta mēs lasām. Ja dažām tapām ir augsts līmenis, atbilstošo žurnālu. "1", tad attiecīgie biti lasīšanas vērtībās tiks iestatīti uz "1". Tapas var izturēt strāvu līdz 20 mA, taču neaizmirstiet par visu pieslēgvietu kopējo strāvu, jo ir ierobežojumi. Ja ports ir izeja, tad portu līniju vērtības tiek iestatītas, ierakstot atbilstošo vērtību porta reģistrā PortB vai PortD. Lai izveidotu žurnālu. "1" pie porta izejas, atbilstošais bits ir jāiestata PortB vai PortD reģistrā.

Vissvarīgākais punkts darbā ar portu ir darbs ar fiksatora reģistru, kas ir atbildīgs par porta līniju darbību kā ievadi vai izvadi. Šī reģistra nosaukums ir DDRx, kur x ir porta burts. Lai veiktu tapu izvadi, mums ir jāraksta “1” uz atbilstošajiem bitiem. Piemēram, mēs vēlamies, lai porta B PB7 tapu padarītu par ieeju, bet atlikušās tapas izvadītu, tad šim nolūkam mums DDRB reģistrā jāieraksta vērtība 0b01111111. Prefikss 0b nozīmē, ka skaitlis ir rakstīts binārā formā. Startējot, DDRx reģistri tiek notīrīti, t.i. visas kājas ir ievades. Neizmantotās kājas ierīcē ieteicams padarīt par ieejām.

Apskatīsim vienkāršu programmu, kas darbojas ar mikrokontrollera portu:

Iekļaut "8515def.inc" ; iekļausim failu ar reģistra aprakstiem.def temp =r16 rjmp RESET ; pārejas vektors, atiestatot RESET: ldi temp, 0b00000011 ; definējiet PC0 un PC1 kā izejas DDRC, temp ldi temp, 0b00000001; ieslēdziet LED uz PC0 kājas out PORTC, temp in temp, PinC; nolasīt līmeņus no porta C ... LOOP: ; galvenās programmas cilpa nop rjmp LOOP

Mikrokontrollera ierīce:
– mikrokontrollera ievades/izvades portu mērķis, dizains un programmēšana

Labdien, dārgie radio amatieri!
Laipni lūdzam vietnē ""

Nu cienījamie radioamatieri, šodien ar šo rakstu pabeigšu jūsu (un manas) smadzenes noslogot ar tīru teoriju. Tālāk būs vieglāk un patīkamāk: teorija ir savienojama ar praksi.
Nu, šodien mēs izskatīsim ļoti svarīgu un interesantu jautājumu - mikrokontrollera I/O porti.

AVR mikrokontrollera I/O porti

I/O porti(turpmāk es rakstīšu saīsinājumā - PVV) - P paredzēts saziņai starp mikrokontrolleri un ārējām ierīcēm. Ar viņu palīdzību mēs pārraidām informāciju uz citām ierīcēm un saņemam informāciju no tām. Atkarībā no veida, mikrokontrollerā var būt no viena līdz septiņām PVV. Katram I/O portam ir piešķirts burtu apzīmējums – A, B, C, D, E, F, G. Visi mikrokontrollera porti ir līdzvērtīgi, astoņu bitu(satur astoņas rindiņas, tie arī ir secinājumi, tie arī ir biti, tie arī ir biti) un divvirzienu– var gan pārraidīt, gan saņemt informāciju. Mikrokontrollerī esošās PVV apkalpo visas tā ierīces, ieskaitot perifērijas. Tāpēc atkarībā no tā, kura ierīce darbosies ar portu, tā var saņemt un pārsūtīt digitālo vai analogo informāciju.

Pavisam, porti tiek klasificēti pēc signāla veida:
digitālās pieslēgvietas– kas strādā ar digitālajiem signāliem – loģiskajām “nulles” un loģiskajām “vieniniekiem”
- analogie porti- kas darbojas ar analogajiem signāliem - vienmērīgi izmantojot visu ieejas spriegumu diapazonu no nulles voltiem līdz MK barošanas spriegumam
- jaukti porti - tie tiek izmantoti mūsu mikrokontrolleros, var ātri pārslēgties no “digitālā porta” režīma uz “analogā porta” režīmu un atpakaļ.

Tehniskajā literatūrā un diagrammās PVV apzīmē šādi:
– “R” – pirmais burts, kas nozīmē vārdu „osta”
– “A” (B, C, D, E, F, G) – otrais burts, kas norāda konkrētu portu
– “0 ” (1, 2, 3, 4, 5, 6, 7) – trešā rakstzīme ir cipars, kas norāda konkrētu porta tapu (reģistru, bitu).
Piemēram: "ports A" - RA, "porta A piektais cipars" — PA5.
Ja MK ir vairākas ostas, tad to nosaukumi var nebūt kārtībā - A, B, C. Var būt arī tā - B, C, D. Tāpēc nav jābaidās un traki jāmeklē, kur ports A ir.
Turklāt, lai arī pieslēgvietas ir astoņu bitu, pieslēgvietai nav obligāti jābūt 8 piniem, to var būt mazāk, piemēram, 3 - PA0, PA1, PA2. Šajā gadījumā portu sauc par nepilnīgu vai saīsinātu.
Apskatīsim konkrētu MK - ATmega8:

Kā redzat, šim MK nav pieslēgvietas ar nosaukumu “A” (trūkst kā klase;). PB ports un PD ports ir pilns, un katram ir astoņas tapas. Un ports C ir nepilnīgs (ierobežots, MK korpusā nav vietas tā izvadei), trūkst astotā cipara (reāli MK korpusa iekšpusē tas ir, bet mēs ar to nevaram strādāt).

Par ostas apsaimniekošanu to elektriskajā ķēdē ir divi slēdži, kurus mēs varam programmatiski “izsitīt”. īpašie I/O reģistri. Šie slēdži ir pieejami katrai tapai, kas nozīmē, ka var kontrolēt jebkuru pieslēgvietas tapu. Piemēram, vienu porta tapu var konfigurēt informācijas ievadei, viena un tā paša porta trīs ciparus izvadei, bet pārējos nevar konfigurēt vispār, atstājot tos “Z stāvoklī”.
Apskatīsim šo problēmu konkrētāk, kā piemēru izmantojot šo diagrammu:

Ievērojiet divus slēdžus - Grēks Un Sout, un pretestība Rup.
Izmantojot Grēks Porta izeja tiek pārslēgta, lai darbotos kā ieeja vai kā izeja. Šo slēdzi kontrolē, izmantojot I/O reģistru DDRx. Katrai ostai ir savs reģistrs. Katrs reģistra bits kontrolē atbilstošo porta bitu (nulle - nulle, pirmais - pirmais utt.). Porta nosaukumā simbolu “x” aizstāj ar atbilstošo porta nosaukumu: portam A – DDRA, portam C – DDRC. Kad DDRx reģistra bitam ir ierakstīts “viens”, porta atbilstošais bits pārslēdzas uz informācijas izvadi un, kad tiek ierakstīts “nulle”, uz informācijas ievadi. Apskatiet zemāk esošos attēlus, un jūs sapratīsit, kā strādāt ar DDRx reģistru.

1. Pārslēgt visas porta tapas uz informācijas izvadi:


2. Visu portu tapu pārslēgšana uz ievades informāciju:


3. Daļas porta tapu pārslēgšana uz ievadi un daļu uz izvades informāciju:

“Klasiskajā” Assembler portu tapu iestatīšana informācijas ievadei un izvadīšanai izskatās šādi (tikai 3. attēla piemērs):

Idi R20, 0b01100010 - ar šo komandu mēs ierakstām RON R20 bināro numuru 01100010, ar kuru mēs nosakām, kura porta izeja darbosies kā izeja (1), bet kura kā ievades (0) informācija. Šajā gadījumā porta B biti 1,5,6 ir konfigurēti informācijas izvadīšanai un 0,2,3,4,7 - informācijas ievadei.
Ārpus DDRB, R20 - ar šo komandu mēs pārsūtām RON R20 saturu uz porta B I/O reģistru.

Algorithm Builder ieraksts ir nedaudz atšķirīgs:
#b01100010 –> DDRB
Fakts ir tāds, ka Algorithm Builder ir nedaudz vairāk tendēts uz augsta līmeņa valodām, tāpēc mēs vienkārši ierakstām “mūsu vēlmi” vienā rindā, bet pēc kompilācijas (tulkojot mašīnkodos), pati programma pārvērš šo rindu kā “klasiskajā. ” apzīmējums.

Otrais slēdzis - Sout. Šim slēdzim ir divi mērķi, atkarībā no porta bitu konfigurācijas informācijas izvadīšanai vai ievadei.
Ja porta bits ir konfigurēts informācijas izvadīšanai, tad ar tā palīdzību iestatām izlādes izvadi vai loģiskais "1" vai loģiskais "0" .
Ja porta bits ir konfigurēts informācijas ievadīšanai
, tad ar tās palīdzību ir pieslēgts tā saucamais “uzvilkšanas rezistors” – Rup vai “iekšējās slodzes rezistors”
. Pateicoties šim rezistoram, tas vienkāršo ārējo pogu un slēdžu pievienošanu, jo Parasti tapām ir nepieciešams ārējs rezistors.
Tāpat kā grēka slēdzis, Sout ir I/O reģistrs ar nosaukumu PORTx, Kur “x” – ostas burtu apzīmējums(piemēram, portam D reģistrs izskatīsies šādi – PORTD).
MK Mega ģimenēm ir papildu slēdzis - PUD, - SFIOR I/O reģistra 2. bits(to sauc par “Īpašo funkciju reģistru”). Ar šo PUD tiek veikta vispārēja pievilkšanas rezistoru kontrole:
- rakstot šim bitam "1", visi pievilkšanas rezistori visiem portiem tiek atspējoti;
– rakstot šim bitam “0”, uzvilkšanas rezistoru stāvokli nosaka PORTx reģistrs.
Kāpēc mums ir nepieciešama vispārēja rezistoru atvienošana un vienlaikus šis PUD, mēs šodien neapsvērsim.
Porta bitu darbības režīmā izvadei PORTx reģistra uzdevums ir ļoti vienkāršs - tas, ko mēs tam ierakstīsim, būs izejā. Ja rakstīsim tikai “nulles”, izvadi būs loģiskās nulles, ja rakstīsim “vieniniekus”, izvade būs loģiskie “vieninieki”.
Piemēram:

Idi R20, 0b11111111
Ārpus DDRB, R20
Mēs izvadām loģisko nulli bitiem 0-3 un loģisko nulli bitiem 4-7:
Idi R20, 0b11110000
Ārpus PORTB, R20
Algoritmu veidotājā:
#b11111111 –> DDRB
#b11110000 –> PORTB
Ceru, ka pagaidām viss ir skaidrs.
Iepriekš minētie piemēri ļauj konfigurēt visu portu uzreiz un izvadīt vajadzīgās vērtības uz visiem porta tapām vienlaikus.
Ja vēlaties konfigurēt tikai vienu porta bitu ievadei vai izvadei, kā arī izvadīt “0” vai “1” tikai vienam porta bitam, neietekmējot šī porta pārējo bitu stāvokli un saturu, šādas komandas pastāv:
SBI A,b– iestatīt reģistra bitu
CBI A,b- atiestatīt reģistra bitu
Kur: " A” – reģistra numurs, „ b” – šī reģistra cipars.
Šīs komandas darbojas ne tikai ar RVV DDRx un PORTx, bet arī ar tām, kurām ir cipari no 0 līdz 31.


Piemērs:
- “klasiskais” montētājs:
Konfigurējiet portu B, lai izvadītu informāciju:
Idi R20, 0b11111111
Ārpus DDRB, R20
Lai ievadītu informāciju, mums ir jāpārslēdz porta 1. bits:
CBI 17,1 $(kur 17 ASV dolāri ir porta B — DDRB RBB numurs, bet 1 ir porta B cipars)
- Algoritmu veidotājs:
#b11111111 –> DDRB
0 –> PORTB.1

I/O portiem ir cits reģistrs: PINx , porta tapu reģistrs (“x” ir ostas burtu apzīmējums)
Šis reģistrs ir paredzēts informācijas nolasīšanai no porta izejas neatkarīgi no tā konfigurācijas – ievades vai izejas. Mēs nevaram neko ierakstīt šajā reģistrā, tas ir paredzēts tikai lasīšanai.

Porta tapu stāvoklis atkarībā no to konfigurācijas:

* PUD nav pieejams Tiny MK un ATMega161 MK modelī

Lielākajai daļai portu tapu ir papildu funkcijas, un tos izmanto perifērijas ierīces. Šajā gadījumā var būt divas situācijas: vienā gadījumā mums neatkarīgi jāiestata izvades konfigurācija, bet otrā gadījumā izvade tiek konfigurēta neatkarīgi, kad ir ieslēgta atbilstošā perifērijas ierīce.

Atiestatot vai ieslēdzot mikrokontrollera jaudu, visas visu portu tapas (ļoti, ļoti retos gadījumos) tiek pārsūtītas uz augstas pretestības stāvokli - “Z-state”. Šis punkts ir jāņem vērā reālajās shēmās. Ja tranzistora slēdzis kalpo kā izejas slodze, tad, lai tā pamatne (lauktranzistora vārti) nekarātos gaisā, ir jāuzstāda papildu ārējie rezistori ar pretestību 10-100 kOhm.

Ja neizmantojat pieslēgvietas tapas, tad nevajadzētu atstāt tās “peldošas gaisā” - tāpēc palielinās MK pašreizējais patēriņš (kāpēc tas nav tik svarīgi, bet tā ir taisnība). Visas neizmantotās izejas ķēdē ieteicams noslogot ar pretestībām 10-100 kOhm (var izmantot arī iekšējos uzvilkšanas rezistorus), vai pārslēgt izejas uz digitālās izvades režīmu.

Izmantojot analogo komparatoru, pārliecinieties, vai uzvilkšanas rezistori ir atspējoti - pretējā gadījumā tiks ietekmēti absolūtā signāla līmeņa rādījumi..

Pievilkšanas rezistori nav gluži "rezistori" - to lomu spēlē lauka efekta tranzistori, kuriem ir liela tehnoloģiskā izplatība - pievilkšanas pretestības vērtība var svārstīties no 30 līdz 100 kOhm. Spēcīgu traucējumu gadījumā un citos “kritiskos gadījumos” ir ieteicams (lai gan datu lapās šāda ieteikuma nav) pievienot papildu uzvilkšanas rezistorus ar nominālo vērtību 2-5 kOhm. Šādi rezistori jāuzstāda uz “Reset” tapas, uz ārējām pārtraukuma tapām, ja tie netiek izmantoti. Rezistori jāinstalē arī, darbinot MK izejas uz kopējās kopnes (I2C vai vienkārši savienojot MK izeju ar citas atvērtā kolektora ierīces izeju, pieslēdzot pie divu kontaktu pogām). Iebūvētā rezistora pretestība šādos gadījumos ir pārāk augsta, lai filtrētu elektromagnētiskos traucējumus.

Flasher programmas izveide

Tātad, dārgie lasītāji, mēs jau esam iepazinušies ar mikrokontrollera struktūru un analizējuši vienkāršas montāžas komandas. Tagad jūs varat sākt rakstīt vienkāršu programmu.

Lai to izdarītu, mums būs nepieciešama AVRStudio vide (kas tika minēts iepriekš) un vide mikrokontrollera simulēšanai - Proteus 7. Internetā ir daudz piemēru šo programmu instalēšanai, tāpēc mēs pie tā nekavēsimies.

Mūsu pirmā programma sastāvēs no:

Direktīvas faila pievienošana, MK inicializācija;

MK I/O porta iestatījumi;

Vienkāršākais portu pārslēgšanas cikls no loģiskā stāvokļa “0” uz “1”;

Vienkāršas aizkaves rutīnas, izmantojot vispārējas nozīmes reģistrus.

Programmas AVR Studio standarta instalēšanas laikā faili ar mikrokontrollera direktīvām atrodas šādā adresē: C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes.

Mūsu piemērā mēs izmantosim mikrokontrolleri Attiny2313. Tā inc faila nosaukums ir 2313def.

Vispirms atveram programmu AVR Studio 4 un izveidosim projektu.

Noklikšķiniet uz pogas, lai izveidotu jaunu projektu.

Pēdējā logā jums jāizvēlas simulators un mūsu MK veids. Pēc tam noklikšķiniet uz pogas “Pabeigt”, un jūs redzēsiet, kā tiks atvērts jauns mūsu projekta logs.

Mūsu projekts jau ir izveidots un to var aizpildīt ar programmas kodu. Kā minēts iepriekš, pirmā lieta, kas jums jādara, ir savienot šī mikrokontrollera direktīvas failu. Ja ir nepieciešams simulēt projektu AVR Studio 4 vidē, tad vēlams norādīt arī mūsu MK nosaukumu. Lai to izdarītu, jums jāraksta šāda rinda “.device ATtiny2313”.

Lai pievienotu inc failu, jums jāieraksta .include “tn2313def.inc”. Tādējādi mēs ļausim kompilatoram izmantot šīs MK direktīvas failu.

Šis fails ievērojami vienkāršo programmēšanas uzdevumu, jo mēs varam ievērot noteiktus standartus un norādīt dažādas MK adreses ar vārdiem, nevis cipariem.

Piemēram, nākamajā attēlā ir parādīta mūsu MK RAM vērtības līnija. Programmā mēs rakstām “spl”, lai gan mēs varam rakstīt arī “$3d”.

Abos gadījumos tas būs pareizi, un kompilators nesniegs jums kļūdas vai brīdinājumus. Bet tas apgrūtina komandu vizuālo uztveršanu.

Tā kā šīm adresēm dažādos mikrokontrolleros ir sava nozīme, tad atverot jaunu projektu nebūs līdz galam skaidrs, kas tur rakstīts. Un, kad mēs izmantojam direktīvas, mēs visas šīs adreses aizstājam ar vārdiem, kurus mēs saprotam. Ja vēlaties, varat mainīt visus nosaukumus direktīvu failā uz saviem. Bet šeit ir āķis: jūs nevarēsit atvērt un apkopot projektu no interneta, tāpat kā neviens nevarēs apkopot jūsu projektu un pārbaudīt kļūdas vai veikt izmaiņas. Lai to izdarītu, jums būs jāpārveido direktīvas faili.

Tātad 1. saraksts ir mūsu vienkāršās programmas piemērs.

Saraksts 1.

Ierīce Attiny2313 ; norādiet ierīces veidu

Iekļauts “tn2313def.inc” ; pievienojiet ATtiny2313 MK direktīvu failu

Def temp = r16 ; iestatiet nosaukumu mūsu vispārējam reģistram

Org 0x0000 ; programma sākas no adreses 0

ldi temp,ramen ; ielādējiet ramend vērtību temp reģistrā

ser temp; konfigurējiet visas B porta tapas izvadei

ārā DDRB, temp ;

sbi portb,5; iestatiet loģisko “1” uz PORTB5

Tātad, pa rindiņai sadalīsim to, ko mēs darījām.

Pirmkārt, katram gadījumam mēs norādījām ierīces veidu: ierīce Attiny2313.

Mēs iekļāvām direktīvas file.include “tn2313def.inc”.

Lai atvieglotu programmas rakstīšanu, reģistram R16 tika piešķirts nosaukums.def temp = r16. Šī darbība nākotnē ievērojami vienkāršos programmas rakstīšanu. Galu galā mums ir vieglāk atcerēties reģistra verbālo nosaukumu, nevis vienkārši ierakstīt R16. Tādējādi jūs varat piešķirt nosaukumu jebkuram reģistram, sākot no R0 un beidzot ar R31.

Ar komandu ser temp mēs ielādējam vērtību 255 temp reģistrā un izlādējam to ārā DDRB. Tādējādi mēs konfigurējam izvades portu. Vēlāk, simulējot programmu Proteus 7, mēs redzēsim, kā šie porti iegūs loģisku nulles stāvokli.

Mēs iestatījām PB5 izvades portu uz loģisku vienību, izmantojot komandu sbi portb,5.

Pašās beigās ir jāorganizē sava veida cilpa, lai mikrokontrolleris nesasaltu.

Kad mūsu programma ir uzrakstīta, mēs varam sastādīt projektu. Lai to izdarītu, nospiediet taustiņu F7. Ja programma ir uzrakstīta bez kļūdām, projekta apakšā parādīsies dialoglodziņš ar zaļu apli un atskaiti par atmiņas lietojumu un kļūdām.

Atveriet Proteus 7 modelēšanas vidi un apskatiet rezultātu.

Tagad nedaudz sarežģīsim uzdevumu un liksim izvades portam pārslēgties no loģiskās nulles uz vienu. Lai to izdarītu, mums ir nedaudz jāmaina mūsu programma, saraksts 2. Visas izmaiņas notiek tikai “galvenajā” cilpā, tāpēc mēs neatkārtosim visu kodu.

Mēs skatāmies uz simulācijas rezultātu Proteus 7 vidē, savienojot osciloskopu ar PB5 tapu.

Kā redzat, porta izejā ir parādījies signāls. Tomēr pārslēgšanas frekvence ir tuvu mikrokontrollera frekvencei.

Lai samazinātu pārslēgšanās ātrumu, mums ir jāizmanto vienkārša aizkave. 3. sarakstā parādīts vienkāršs aizkaves ieviešanas piemērs.

3. saraksts.

sbi portb,5; iestatiet loģisko “1” uz PORTB5

zvana aizkave; izsaukt aizkaves apakšprogrammu

cbi portb,5; iestatiet loģisko “0” uz PORTB5

clr r20; notīrīt reģistrus

ieskaitot r20; pievienot 1

cpi 20 200 ; salīdziniet, R20 = 200?

brne d_1; ja nav vienāds, dodieties uz iezīmi d_1, pretējā gadījumā izlaidiet

Pēc šīs programmas palaišanas portu pārslēgšanas ātrums samazinājās līdz 100 ms. Iestatot salīdzināšanas vērtības reģistros R20 un R21, jūs varat pielāgot šo intervālu. Nākamajā attēlā mēs redzam programmas rezultātu.

Beigsim šeit. Nākamajā daļā mēs analizēsim programmu piemērus ar savienojošām pogām un uzrakstīsim cilpu.

Iepriekšējie raksti:

♦Aritmētiski loģiskā vienība un atmiņas organizācija – programmu atmiņa, datu atmiņa, nepastāvīgā atmiņa

Šajā rakstā mēs uzrakstīsim pirmo programmu un uzzināsim, kā programmēt mikrokontrollera I/O portus.

Mūsu pirmā programma sākotnēji kontrolēs vienu no mikrokontrollera tapām. Lai programma darbotos, vadāmajai izejai caur strāvu ierobežojošu rezistoru pieslēdzam LED, kura anods ir pieslēgts pie MK izejas, bet katods pie mīnusa (kopējais vads).

Pēc noklusējuma spriegums uz visām neprogrammēta mikrokontrollera tapām ir tuvu nullei, tāpēc gaismas diode neiedegas. Mūsu uzdevums ir uzrakstīt programmu, ar kuras palīdzību MK izejā parādīsies spriegums (precīzāk, strāva) iedegs LED.

Mikrokontrollera I/O porti

ATmega8 mikrokontrolleram ir 28 tapas, katra no tām veic noteiktas funkcijas. LED var pieslēgt vairumam tapu, tomēr ne visiem, jo ​​vismaz pāris kontaktu tiek izmantoti jaudai. Lai skaidri zinātu katras MK tapas mērķi, izmantosit datu lapu. Datu lapā mēs atrodam visu tapu spraudni (apzīmējumu).

Gandrīz katrs tapa var veikt vairākas funkcijas. Funkciju nosaukumu saīsinājumi ir norādīti iekavās blakus izvadiem. Nākamajos rakstos mēs noteikti tos visus apsvērsim. Tagad mūs interesē daži no tiem.

Lai darbinātu mikrokontrolleru, tāpat kā jebkuru citu mikroshēmu, ir nepieciešams spriegums. Lai izvairītos no kļūdaini pozitīviem rezultātiem, MK jābaro tikai ar stabilu spriegumu no 4,5 V līdz 5,5 V. Šis sprieguma diapazons ir stingri regulēts un ir norādīts datu lapā.

Barošanas avota pluss (“+”) ir pievienots 7. kontaktam, kas apzīmēts ar VCC. Mīnuss (“-”) – līdz 8. vai 22. posmam, kas apzīmēts kā GND (GND ir saīsinājums no zemes).

Atlikušās kājas ļauj mikrokontrolleram sazināties ar ārējām ierīcēm. Tie ir apvienoti atsevišķās grupās un tiek saukti par mikrokontrollera I/O portiem. Izmantojot tos, var gan nosūtīt signālus uz MK ieeju, piemēram, no dažādiem sensoriem, gan izdot signālus citu ierīču vadīšanai vai informācijas attēlošanai dažādos indikatoros un displejos.

ATmega8 mikrokontrolleram ir trīs I/O porti: B, C un D. Porti var būt pilni vai nepilnīgi. Pilns ports sastāv no astoņiem bitiem, un attiecīgi tam ir tikpat daudz kontaktu ar tādu pašu nosaukumu. Nepabeigtam portam ir mazāk par 8 bitiem, tāpēc arī kontaktu skaits šādā portā ir mazāks par astoņiem.

Šim MK ir pilnas pieslēgvietas B un D. Un ports C ir nepilnīgs, un tajā ir septiņi biti. Vēlreiz ņemiet vērā, ka bitu numerācija sākas no nulles, piemēram, PB0, PB1, PB2...

Nebrīnieties, ka ATmega8 trūkst A porta. Citos mikrokontrolleros ar vairāk tapām var būt gan ports A, gan ports E. Mikrokontrolleriem ar mazāk tapu var būt tikai viens ports, un tas ir nepilnīgs.

Iepazīstieties ar Atmel Studio 7

Tagad pāriesim pie programmas koda rakstīšanas. Mūsu pirmā programma iestatīs +5V uz porta C PC0 nulles bitu, t.i. uz mikrokontrollera 23. tapas.

Palaidiet programmu Atmel Studio.

Vispirms jums ir jāizveido projekts. Lai to izdarītu, atvērtajā logā noklikšķiniet uz cilnes Jauns Projekts.

Varat arī izveidot projektu, noklikšķinot uz cilnes Fails. Nolaižamajā izvēlnē jums vajadzētu izvēlēties Jauns un uz priekšu Projekts. Vai arī nospiediet taustiņu kombināciju Ctrl+Shift+N.

Parādītajā logā atlasiet C/C++ programmēšanas valodu un noklikšķiniet uz cilnes.


Tālāk mums ir jāiestata mūsu projekta nosaukums un diska atrašanās vieta. Sauksim mūsu pirmo projektu ar nosaukumu 1 ievades rindā Vārds. Faila atrašanās vietu var mainīt, noklikšķinot uz pogas Pārlūkot, kas atrodas pretī līnijai Atrašanās vieta. Ja atstājat atzīmi blakus Izveidojiet risinājuma direktoriju, tad atlasītajā vietā automātiski tiks izveidota mape ar projekta nosaukumu. Papildus projektam šajā mapē tiks izveidoti arī citi palīgfaili, tāpēc iesaku atstāt izvēles rūtiņu neatzīmētu.

Kad ir atlasīts projekta nosaukums un tā atrašanās vieta, noklikšķiniet uz pogas labi. Atkal parādās logs. Tajā mums jāizvēlas mikrokontrollera veids. Mūsu gadījumā tas ir ATmega8. Noklikšķiniet uz cilnes Ierīču ģimene. Nolaižamajā izvēlnē atlasiet virkni mikrokontrolleru ATmega.

Ritiniet, lai atrastu un atlasītu mikrokontrolleri ATmega8 un nospiediet pogu labi.

Atvērtajā logā mēs redzam, ka Atmel Studio mums ir automātiski ģenerējis veidni vai programmas veidni.

Apskatīsim visu kārtībā.

Atmel Studio 7 | Pirmā programma

Zaļā krāsā iezīmētais teksts ir komentāri. Šajā gadījumā tiek norādīts projekta nosaukums un autors, kā arī projekta izveides laiks un datums. Komentāri nav programmas kods, tāpēc kompilators tos ignorē. Komentāri ļauj programmētājam uzlabot koda lasāmību, kas ir īpaši noderīgi kļūdu atrašanā un programmas atkļūdošanā.

Komentāru un citu programmas elementu krāsu var mainīt Atmel Studio iestatījumos.

* 1.c

* Izveidots: 08/07/2017 16:57:59

Komentāri var būt vienas rindiņas vai vairāku rindiņu. Šajā programmas veidnē tiek izmantoti vairāku rindiņu komentāri. Tie sākas ar slīpu līniju ar zvaigznīti un beidzas ar zvaigznīti un slīpu līniju.

/* - komentāra sākums

*/ - komentāra beigas

Visu tekstu, kas atrodas starp /* un */, kompilators pilnībā izlaiž.

Vienas rindiņas komentārs ir apzīmēts ar divām slīpsvītrām un ir derīgs vienas rindas robežās. Tekstu pirms divām slīpsvītrām kompilators atpazīst kā programmas kodu, bet tekstu pēc tā kā komentāru.

// Šeit ir rakstīts vienas rindiņas komentārs

Praksē komentāru izmantošana tiek uzskatīta par labu programmēšanas praksi. Tālāk mēs izmantosim abus veidus.

Priekšapstrādātāja direktīva

Nākamais programmas elements ir līnija

#iekļauts

Šī rinda norāda kompilatoram, ka šis fails ir jāsavieno ar citu failu ar nosaukumu io.h, kas atrodas mapē avr. Iekļautajā failā ir informācija par mikrokontrollera pamata iestatījumiem.

Faktiski varētu neiekļaut io.h failu, bet gan ierakstīt tā saturu manuāli, taču tas ir ļoti neērti.

Pierakstīties # nozīmē, ka šī komanda ir priekšprocesora direktīva. Fakts ir tāds, ka pirms faila apkopošanas kompilatoram ir jāveic iepriekšēja apstrāde. Tāpēc vispirms tiek veikta faila sagatavošana kompilācijai, pievienojot dažas instrukcijas, kas rakstītas failā io.h

io ir faila nosaukums, kas nāk no saīsinājuma input/output - input/output.

H – faila paplašinājums, tā nosaukums cēlies no vārda galvene – virsraksts.

Tagad mēs visi esam kopā. io.h ir galvenes fails, kurā tiek ierakstīta informācija par mikrokontrollera I/O iestatījumiem.

Galvenā funkcija galvenā

Zemāk mēs redzam šādu rindu:

int galvenais (neesošs)

Šī rinda deklarē funkciju, ko sauc par galveno. Ar to sākas programmas izpilde. Šī funkcija ir kā visas pašreizējā failā ierakstītās programmas sākumpunkts. Nosaukums galvenais ir rezervēts C valodā, tāpēc, lai izvairītos no konfliktiem, citu funkciju, kas atrodas šajā, nevar izsaukt ar šo nosaukumu. main ir tulkots galvenais, t.i., šī funkcija ir galvenā.

C sintaksē funkcijas identifikators ir iekavas.

Iekavās ir ievietots vārds spēkā neesošs (void). Tas nozīmē tukšumu. Tas norāda, ka galvenā funkcija neko nepieņem, t.i., tai nav argumentu. Rakstot sarežģītākas programmas, mēs pie šī punkta pievērsīsimies sīkāk.

starpt ir vesela skaitļa datu tips. Šajā gadījumā funkcija darbojas ar veseliem skaitļiem: gan pozitīviem, gan negatīviem. Ir arī citi datu tipi, piemēram, peldošā komata, rakstzīmes uc Datu tipus apskatīsim sīkāk pēc vajadzības vai atsevišķā rakstā. Tomēr ir ieteicams vienmēr izmantot int datu tipu galvenajai funkcijai, jo dizains int galvenais (neesošs) ko nosaka C valodas standarts un atzīst jebkurš kompilators.

Funkcijas apjomu nosaka cirtaini breketes

. → funkcionē ķermenis

Programmas kods, kas atrodas starp atvēršanas un aizvēršanas iekavām, attiecas uz funkcijas pamattekstu.

Kopumā jebkurai funkcijai ir šāda struktūra:

datu tipa funkcijas nosaukums (arguments)

funkcijas pamatteksts (kods)

kamēr funkcija

Galvenās funkcijas iekšpusē ir funkcija while:

kamēr (1)

Kamēr tulkots no angļu valodas kā "bye". Tas nozīmē, ka programma, kas atrodas šīs funkcijas pamattekstā, tiks izpildīta tik ilgi, kamēr nosacījums būs patiess. Iekavās esošais norāda, ka nosacījums ir patiess, tāpēc šajā funkcijā rakstītais programmas kods tiks atkārtots bezgalīgi daudz reižu, t.i. programma veiks cilpu. Kāpēc tas tiek darīts? Fakts ir tāds, ka mikrokontrolleram ir nepārtraukti jāizpilda ierakstītā programma. Tāpēc programma nevar vienkārši apstāties. Mikrokontrolleris vienmēr aptaujā I/O portus vai izdod tiem signālus pat gaidīšanas režīmā.

Tagad, kad esam apskatījuši programmas pamata dizaina elementus, apskatīsim pamata veidni kopumā. Bez komentāriem tas izskatās šādi:

#iekļauts

int galvenais (neesošs)

kamēr (1)

ATmega8 mikrokontrollera I/O portu programmēšana

Tagad mēs varam papildināt programmu ar mums nepieciešamo kodu. Pirmais solis ir iestatīt izvadei porta C PC0 nulles bitu.

Mēs jau zinām, ka MK var gan uztvert, gan izvadīt signālu, t.i. tās tapas (porti) var darboties kā ievades Un kā izejas. Tāpēc vispirms ir jākonfigurē MK izeja atbilstošā režīmā. Šim nolūkam mikrokontrolleram ir īpašs reģistrs, ko sauc DDR-d irekts d ata r egiste r – datu virzienu reģistrs.

Katrai ostai ir savs šāds reģistrs. Piemēram, tiek izsaukts porta C reģistrs DDRC , ports B – DDRB , ports D – DDRD .

Lai konfigurētu porta izvadi uz ieeja jāraksta DDR reģistrā nulle , un tālāk Izeja vienība .

Komanda, lai konfigurētu porta C nulles bitu, ir šāda

DDRC = 0b0000001;

Šī komanda DDRC reģistrā ieraksta bināro skaitli, kas ir vienāds ar decimāldaļu 1. Prefikss 0b identificē šo skaitli kā bināru.

Ierakstīšanas binārā forma ir ļoti veiksmīgi apvienota ar porta bitu skaitu, jo bitu skaits atbilst porta tapu skaitam, bet bita kārtas numurs atbilst porta iekšpusē esošo bitu skaitam. .

Reģistrā varat ierakstīt arī heksadecimālo skaitli:

DDRC = 0x1;

Tomēr binārā apzīmējuma forma ir vizuālāka, tāpēc mēs to izmantosim mikrokontrolleru programmēšanas sākumposmā.

Apskatīsim citu piemēru. Pieņemsim, ka mums ir jākonfigurē B porta nulles, trešais un septītais bits kā izeja un pārējie biti kā ievade. Šajā gadījumā kods izskatās šādi:

DDRB = 0b10001001;

Mikrokontrollera reģistrs PORT

Pēc tam, kad esam konfigurējuši porta C PC0 nulles bitu, mums joprojām ir jāveic pielāgojumi, lai uz šī kontakta parādītos spriegums +5 V. Lai to izdarītu, mums reģistrā jāiestata nulles bits OSTA . Ja bits ir iestatīts uz vienība , tad izvade būs +5 V (precīzāk, mikrokontrollera barošanas sprieguma vērtība, kas mikrokontrolleram ATmega8 var būt 4,5...5,5 V robežās). Ja bits ir iestatīts uz nulle , - tad izejā būs spriegums, kura vērtība ir tuvu nulle .

Katrai ostai ir savs reģistrs: ports A – PORTA , ports B – PORTB ,ports C–P ORTC .

Tātad, lai iegūtu +5 V spriegumu pie PC0 tapas, jums jāraksta šāda komanda:

PORTS = 0b0000001;

Ņemiet vērā, ka katra komanda beidzas ar semikolu.

Tādējādi, lai apgaismotu LED, mums ir vajadzīgas tikai divas komandas:

DDRC = 0b0000001;

PORTС = 0b0000001;

Ar pirmo komandu mēs definējam PC0 tapu kā ieeju, bet ar otro mēs iestatām spriegumu uz +5 V.

Pilns programmas kods izskatās šādi:

#iekļauts

int galvenais (neesošs)

DDRC = 0b0000001;

Kamēr (1)

PORTC = 0b0000001;

Šeit jāņem vērā: DDRC komanda = 0b0000001; tiks izpildīts tikai vienu reizi, un komanda PORTC = 0b0000001; tiks izpildīts visu laiku cilpas laikā, jo tas ir funkcijas while (1) pamattekstā. Bet pat ja mēs pārvietojam komandu ārpus funkcijas un ievietojam to pēc DDRC = 0b0000001; , arī šajā gadījumā gaismas diode degs visu laiku. Tomēr, ievietojot komandu PORTC = 0b0000001 ; Lietas (1) pamattekstā mēs skaidri norādījām, ka gaismas diodei ir jādeg visu laiku.

Faila kompilēšana

Tagad, kad kods ir pilnībā gatavs, tas ir jāapkopo. Lai to izdarītu, nospiediet taustiņu F7 vai noklikšķiniet uz pogas Būvēt un nolaižamajā izvēlnē atlasiet Veidot risinājumu.

Ja kodā nav kļūdu, fails tiks kompilēts, un ekrāna apakšā parādīsies ziņojums, kas norāda, ka projekts ir veiksmīgi kompilēts: Veidošana izdevās.

Tādā veidā tiek ieprogrammēti gandrīz jebkura veida mikrokontrollera I/O porti.Mūsu nākamais solis ir. Varat arī pārbaudīt koda pareizu darbību, izmantojot mikrokontrollera simulatora programmu -

Bitu operācijas ir balstītas uz loģiskajām operācijām, kuras mēs aplūkojām iepriekš. Viņiem ir galvenā loma AVR un citu veidu mikrokontrolleru programmēšanā. Gandrīz neviena programma nevar iztikt bez bitu operāciju izmantošanas. Pirms tam mēs apzināti izvairījāmies no tiem, lai atvieglotu MK programmēšanas apguves procesu.

Visos iepriekšējos rakstos mēs programmējām tikai I/O portus un neizmantojām papildu iebūvētos komponentus, piemēram, taimerus, analogo-digitālo pārveidotājus, pārtraukumus un citas iekšējās ierīces, bez kurām MK zaudē visu jaudu.

Pirms pāriet uz MK iebūvēto ierīču apgūšanu, jums jāiemācās kontrolēt vai pārbaudīt atsevišķus AVR MK reģistru bitus. Iepriekš mēs veicām pārbaudi vai iestatījām visa reģistra ciparus uzreiz. Noskaidrosim, kāda ir atšķirība, un tad turpināsim.

Bitu darbības

Visbiežāk, programmējot AVR mikrokontrollerus, mēs to izmantojām, jo ​​tas ir vizuālāks salīdzinājumā ar iesācēju MK programmētājiem un ir labi saprotams. Piemēram, mums ir jāiestata tikai D porta 3. bits. Lai to izdarītu, kā mēs jau zinām, mēs varam izmantot šādu bināro kodu:

PORTD = 0b00001000;

Tomēr ar šo komandu mēs iestatām 3. ciparu uz vienu, bet visus pārējos (0, 1, 2, 4, 5, 6 un 7) atiestatām uz nulli. Tagad iedomāsimies situāciju, kad 6. un 7. bits tiek izmantoti kā ADC ieejas, un šajā laikā signāls no kādas ierīces tiek saņemts uz atbilstošajiem MK tapām, un mēs izmantojam iepriekš minēto komandu, lai atiestatītu šos signālus. Rezultātā mikrokontrolleris tos neredz un uzskata, ka signāli nav ieradušies. Tāpēc šādas komandas vietā vajadzētu izmantot citu, kas iestatītu tikai 3. bitu uz vienu, neietekmējot atlikušos bitus. Lai to izdarītu, parasti tiek izmantota šāda bitu operācija:

PORTD |= (1<<3);

Tālāk mēs detalizēti apspriedīsim tās sintaksi. Un tagad vēl viens piemērs. Pieņemsim, ka mums ir jāpārbauda PIND reģistra 3. cipara stāvoklis, tādējādi pārbaudot pogas stāvokli. Ja šis bits tiek atiestatīts uz nulli, tad mēs zinām, ka tiek nospiesta poga un pēc tam tiek izpildīts komandas kods, kas atbilst nospiestās pogas stāvoklim. Iepriekš mēs būtu izmantojuši šādu apzīmējumu:

ja (PIND == 0b00000000)

(jebkurš kods)

Taču ar tās palīdzību mēs pārbaudām ne tikai 3. bitu, bet visus PIND reģistra bitus uzreiz. Tāpēc, pat ja poga tiek nospiesta un vajadzīgais bits tiek atiestatīts, bet šajā laikā tiek saņemts signāls kādā citā porta D tapā, atbilstošā vērtība tiks iestatīta uz vienu, un nosacījums iekavās būs nepatiess. Rezultātā kods, kas atrodas cirtainajās lencēs, netiks izpildīts pat tad, ja tiek nospiesta poga. Tāpēc, lai pārbaudītu atsevišķa PIND reģistra 3. bita stāvokli, jāizmanto bitu darbība:

if (~PIND & (1<<3))

(jebkurš kods)

Lai strādātu ar atsevišķiem mikrokontrollera bitiem, C programmēšanas valodā ir rīki, ar kuriem var mainīt vai pārbaudīt viena vai vairāku atsevišķu bitu stāvokli vienlaikus.

Viena bita iestatīšana

Lai iestatītu vienu bitu, piemēram, portu D, tiek izmantota bitu VAI darbība. Tas ir tas, ko mēs izmantojām raksta sākumā.

PORTD = 0b00011100; // sākotnējā vērtība

PORTD = PORTD | (1<<0); применяем побитовую ИЛИ

PORTD |= (1<<0); // сокращенная форма записи

PORTD == 0b00011101; // rezultāts

Šī komanda iestata nulles bitu, bet pārējo atstāj nemainīgu.

Piemēram, instalēsim vēl vienu porta D 6. bitu.

PORTD = 0b00011100; // sākotnējais porta stāvoklis

PORTD |= (1<<6); //

PORTD == 0b01011100; // rezultāts

Lai rakstītu no viena līdz vairākiem atsevišķiem bitiem vienlaikus, piemēram, nulles, sesto un septīto portu B attiecas šāds ieraksts.

PORTB = 0b00011100; // sākotnējā vērtība

PORTB |= (1<<0) | (1<<6) | (1<<7); //

PORTB == 0b1011101; // rezultāts

Atsevišķu bitu atiestatīšana (nulles iestatīšana).

Lai atiestatītu vienu bitu, vienlaikus tiek izmantotas trīs iepriekš apspriestās komandas: .

Atiestatīsim PORTC reģistra 3. bitu un pārējo atstāsim nemainītu.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

Veiksim līdzīgas darbības ar 2. un 4. cipariem:

PORTC = 0b00111110;

PORTC &= ~((1<<2) | (1<<4));

PORTC == 0b00101010;

Bitu pārslēgšana

Papildus iestatīšanai un atiestatīšanai tiek izmantota arī noderīga komanda, kas pārslēdz vienu bitu pretējā stāvoklī: viens uz nulli un otrādi. Šo loģisko darbību plaši izmanto dažādu apgaismojuma efektu, piemēram, Jaungada vītnes, veidošanā. Apskatīsim PORTA piemēru

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

Mainīsim nulles, otrā un sestā bita stāvokli:

PORTA = 0b00011111;

PORTA ^= (1<<0) | (1<<2) | (1<<6);

PORTA == 0b01011010;

Atsevišķa bita stāvokļa pārbaude. Atgādināšu, ka I/O porta pārbaude (pretēji rakstīšanai) tiek veikta, nolasot datus no PIN reģistra.

Visbiežāk testēšanu veic, izmantojot vienu no diviem cilpas paziņojumiem: if un while. Mēs jau esam pazīstami ar šiem operatoriem agrāk.

Pārbauda bitu, vai nav loģiskās nulles (atiestatīšana) ar ja

if (0==(PIND & (1<<3)))

Ja porta D trešais bits ir notīrīts, tiek izpildīts kods1. Pretējā gadījumā tiek izpildīts kods2.

Līdzīgas darbības tiek veiktas ar šo ierakstīšanas veidu:

if (~PIND & (1<<3))

Pārbauda bitu loģiskās vienības esamībai (iestatījums) ar ja

if (0 != (PIND & (1<<3)))

if (PIND & (1<<3))

Iepriekš minētās divas cilpas darbojas līdzīgi, taču C programmēšanas valodas elastības dēļ tām var būt atšķirīga apzīmējuma forma. Operators != nozīmē, ka nav vienāds. Ja ir iestatīts trešais PD I/O porta bits, tad tiek izpildīts Code1, ja nē, tiek izpildīts Code2.

Gaida bitu atiestatīšanu kamēr

kamēr (PIND & (1<<5))

Kods1 tiks izpildīts tik ilgi, kamēr ir iestatīts PIND reģistra 5. bits. Kad to atiestatīsit, Code2 sāks izpildīt.

Gaida, līdz tiks iestatīts bits kamēr

Šeit C sintakse ļauj rakstīt kodu divos no visizplatītākajiem veidiem. Praksē tiek izmantoti abi ierakstīšanas veidi.

Ostas pārvaldība AVR GCC. DDRx un PORTx reģistri.
Skaitļu attēlojums. Bitu operācijas.
Aizkaves funkcija. Beznosacījumu pāreja programmā.

Mikrokontrollera porti ir ievades/izvades ierīces, kas ļauj mikrokontrolleram nosūtīt vai saņemt datus. Standarta AVR mikrokontrollera portam ir astoņi datu biti, kurus var nosūtīt vai saņemt paralēli. Katrs cipars (vai bits) atbilst mikrokontrollera tapai (pin). Mikrokontrollera tapas sauc arī par tapām. Lai apzīmētu portus, tiek izmantoti latīņu burti A, B, C utt. I/O portu skaits atšķiras atkarībā no mikrokontrollera modeļa.

Jebkuru mikrokontrollera portu var konfigurēt kā ieeju vai izeju. Lai to izdarītu, jāraksta portam atbilstošajā reģistrā DDRx nepieciešamo vērtību. Turklāt jebkuru porta tapu var konfigurēt atsevišķi kā ieeju vai izvadi. Jebkurā gadījumā neatkarīgi no tā, vai vēlaties konfigurēt visu portu vai vienu tapu, jums būs jāstrādā ar DDRx reģistriem.

DDRx - datu pārraides virzienu reģistrs. Šis reģistrs nosaka, vai konkrēta porta tapa ir ieeja vai izeja. Ja noteikts DDRx reģistra bits satur loģisko, tad atbilstošā porta tapa tiek konfigurēta kā izeja, pretējā gadījumā - kā ieeja. Burtam x šajā gadījumā jānorāda porta nosaukums, ar kuru strādājat. Tādējādi portam A tas būs DDRA reģistrs, portam B tas būs DDRB reģistrs utt.

Izmantojot AVR GCC, varat ierakstīt to vai citu vērtību vajadzīgajā reģistrā vienā no tālāk norādītajiem veidiem.

Visai ostai uzreiz.

DDRD = 0xff;

Visas D porta tapas tiks konfigurētas kā izejas.

0xff ir skaitļa ff heksadecimālais attēlojums, kur 0x ir prefikss, ko izmanto heksadecimālo skaitļu rakstīšanai. Decimāldaļās tas būs skaitlis 255, un binārajā formā tas izskatīsies kā 11111111. Tas ir, visi DDRD reģistra biti tiks ierakstīti loģiskajos.

IN AVR GCC prefiksu 0b izmanto, lai attēlotu bināros skaitļus. Tādējādi skaitlim 11111111 programmā jābūt attēlotam kā 0b11111111. Iepriekšējo komandu varam uzrakstīt lasāmākā formā.

DDRD = 0b11111111;

Lai gan šis apzīmējums izskatās vizuālāks, konfigurējot portus, parasti tiek izmantots skaitļu heksadecimālais attēlojums.

Lai konfigurētu visus porta D kontaktus kā ievades, visiem DDRD reģistrā esošajiem bitiem jābūt iestatītiem uz loģiskajām nullēm.

DDRD = 0x00;

DDRD reģistrā var ierakstīt citus numurus. Piemēram:

DDRD = 0xb3;

0xb3- skaitļa 179 heksadecimālais attēlojums. Binārā formā tas izskatīsies kā 10110011. Tas ir, daži porta D kontakti tiks konfigurēti kā izejas, bet daži kā ieejas.

PD0 — 1 (izeja)
PD1 — 1 (izeja)
PD2 — 0 (ievade)
PD3 — 0 (ievade)
PD4 — 1 (izeja)
PD5 — 1 (izeja)
PD6 — 0 (ievade)
PD7 — 1 (izeja)

Lai atsevišķi konfigurētu PD2 tapu kā ievadi, DDRD reģistra atbilstošajam bitam ir jāieraksta 0. Lai to izdarītu, izmantojiet šādu konstrukciju.

DDRD &= ~(1
Šajā gadījumā rezultāts, pārbīdot vienu divas pozīcijas pa kreisi, tiek apgriezts, izmantojot bitu inversijas darbību, ko apzīmē ar " ~ ".

Ar inversiju nulles vietā iegūstam vieniniekus un vieninieku vietā nulles. Šo loģisko darbību citādi sauc par operāciju NAV(angļu nosaukums NAV).

Tādējādi, bitu virzienā apgriežot 00000100, mēs iegūstam 11111011. (Papildinformāciju par darbu ar cipariem mikrokontrollerī skatiet tālāk esošajā lodziņā.)

Iegūtais skaitlis tiek reizināts ar bitu loģiskās reizināšanas operāciju & ar DDRD reģistrā saglabāto skaitli, un rezultāts tiek ierakstīts DDRD reģistrā.

Loģiskai reizināšanai 0*0=0, 0*1=0, 1*1=1 . Loģiskās reizināšanas operāciju citādi sauc par operāciju UN(angļu nosaukums UN).

Tas ir, tas, ko mēs pārvietojām pa kreisi par divām pozīcijām, apgriežot pārvēršas par nulli un tiek reizināts ar atbilstošo bitu, kas saglabāts DDRD reģistrā. Reizinot ar nulli, mēs iegūstam nulli. Tādējādi PD2 bits kļūst par nulli.

Kad porta datu virziens ir konfigurēts, portam var piešķirt vērtību, kas tiks saglabāta attiecīgajā reģistrā. PORTx.
PORTx ir portu reģistrs, kur x apzīmē porta nosaukumu.

Ja kontaktdakša ir konfigurēta kā izeja, viens attiecīgajā PORTx reģistra bitā ģenerē augsta līmeņa signālu kontaktā, bet nulle ģenerē zema līmeņa signālu.

Ja tapa ir konfigurēta kā ieeja, tad atbilstošajā PORTx reģistra bitā pie kontakta tiek pievienots iekšējais vilkšanas rezistoru, kas nodrošina augstu līmeni ieejā, ja nav ārēja signāla.

Varat iestatīt "1" uz visiem porta D tapām šādi.

PORTD = 0xff;

Un jūs varat iestatīt “0” uz visiem porta D tapām šādi.

PORTD = 0x00;

Katram PORTx reģistra bitam var piekļūt arī atsevišķi tāpat kā ar DDRx reģistriem.

Piemēram, komanda

PORTD |= 1
iestatīs "1" (augsta līmeņa signālu) pie tapas PD3.

PORTD &= ~(1
iestatīs "0" (zema līmeņa signālu) uz tapas PD4.

IN AVR GCC maiņu var veikt arī, izmantojot funkciju _BV(), kas veic bitu nobīdi un ievieto rezultātu apkopotajā kodā.

Ja izmantojat funkciju _BV(), iepriekšējās divas komandas izskatīsies šādi.

PORTD |= _BV(PD3); // iestatiet "1" porta D 3. rindā

PORTD &= ~_BV(PD4); // iestatiet "0" porta D 4. rindā

Atkarībā no savienojuma metodes gaismas diode iedegsies vai nu no augsta līmeņa signāla, kas tiek piegādāts uz mikrokontrollera PD1 tapu, kā tas ir pirmajā gadījumā, vai no zema līmeņa signāla, ja savienojums ir parādīts otrajā attēlā.

/**************************************************** * ********************** PIEMĒRS PAR LED IESLĒGŠANU AR AUGSTA LĪMEŅA SIGNĀLU Savienojuma piemērs 1. attēlā *********** ****************************************************** **/#iekļauts $WinAVR = ($_GET["avr"]); if($WinAVR) include($WinAVR);?> starpt galvenais ( nederīgs) { // galvenās programmas sākums DDRD = 0xff; PORTD |= _BV(PD1); // iestatiet "1" (augsts līmenis) uz tapas PD1 }

Tagad mēģināsim mirgot LED, kas savienots, kā parādīts kreisajā attēlā. Lai to izdarītu, mēs izmantojam aizkaves funkciju _delay_ms().

Funkcija _delay_ms() ģenerē aizkavi atkarībā no tai nosūtītā argumenta, kas izteikts milisekundēs (vienā sekundē ir 1000 milisekundes). Maksimālā aizkave var sasniegt 262,14 milisekundes. Ja lietotājs funkcijai nodod vērtību, kas lielāka par 262,14, izšķirtspēja tiks automātiski samazināta līdz 1/10 milisekundes, kā rezultātā rodas aizkave līdz 6,5535 sekundēm. (Par ilgāku kavējumu veidošanos varat lasīt rakstā.)

Funkcija _delay_ms() ir ietverta failā delay.h, tāpēc mums šis fails būs jāsavieno ar programmu. Turklāt, lai šī funkcija darbotos pareizi, jums ir jānorāda frekvence, ar kādu mikrokontrolleris darbojas, izsakot hercos.

/**************************************** LED MIRGOŠANAS PIEMĒRS Savienojuma piemērs 1. attēlā ** ******************************************/#define F_CPU 1000000UL #include #iekļauts starpt galvenais ( nederīgs) { // galvenās programmas sākums DDRD = 0xff; // konfigurēt visas porta D tapas kā izejas PORTD |= _BV(PD1); _delay_ms(500); // pagaidiet 0,5 sek. PORTD |= _BV(PD1); // iestatiet "1" (augsts līmenis) pie tapas PD1, // iedegas LED _delay_ms(500); // pagaidiet 0,5 sek. PORTD &= ~_BV(PD1); // iestatiet "0" (zems līmenis) kontaktā PD1, // izslēdziet LED } // galvenās programmas noslēdzošās iekavas

LED zibšņu sērija būs ļoti īsa. Lai mirgotu nepārtraukti, varat izveidot bezgalīgu cilpu, izmantojot beznosacījuma lēciena operatoru "goto". Paziņojums goto pārlec uz etiķetes norādīto programmas punktu. Iezīmes nosaukumā nedrīkst būt atstarpes. Etiķetes nosaukumam seko kols. Starp etiķetes nosaukumu un kolu nedrīkst būt atstarpēm.
/**************************************************** * ***** PIEMĒRS BEZGALĪGI MIRGOŠAM LED Savienojuma piemērs 1. attēlā ************************************** * **********************************/#define F_CPU 1000000UL // norāda frekvenci hercos#iekļauts #iekļauts starpt galvenais ( nederīgs) { // galvenās programmas sākums DDRD = 0xff; // konfigurēt visas porta D tapas kā izejas sākt: // etiķete komandai goto start PORTD |= _BV(PD1); // iestatiet "1" (augsts līmenis) pie tapas PD1, // iedegas LED _delay_ms(250); // pagaidiet 0,25 sek. PORTD &= ~_BV(PD1); // iestatiet "0" (zems līmenis) kontaktā PD1, // izslēdziet LED _delay_ms(250); // pagaidiet 0,25 sek. iet uz sākt; // dodieties uz sākuma etiķeti } // galvenās programmas noslēdzošās iekavas