Ištirti mikrokontrolerio pagrindai

Išbandykite Mūsų Instrumentą, Kaip Pašalinti Problemas





Vienas dalykas yra puikus mikrovaldiklių IC, kurie yra prieinami beveik visose pasaulio vietose ir elektroninių mažmenininkų.

Įvadas

Iš esmės mikrokontrolerio prietaisai yra populiariai naudojami programose, kuriose vertinama supanti aplinka, ir panašioje elektronikoje.



Šie prietaisai gali būti naudojami tam tikram parametrui rodyti, variklio valdymo programose, LED apšvietime, įvairių tipų jutikliuose, tokiuose kaip pakreipimo jutiklis, akselerometras, greičio matuoklis, duomenų kaupikliai, temperatūros valdikliai, klaviatūros ir kt.

Pirminį supratimą apie mikrovaldiklius galima gauti, remiantis AVR Amega32 mikrovaldikliu, kuris yra taip pažengęs, kad kartais jis vadinamas kompiuteriu luste.



Šis prietaisas yra priskirtas komandoms vykdyti, kad sudarytų programą.

Programos, kurią čia matytumėte, kalba yra C ++. Čia galėsite giliau išmokti šią kalbą.

Kalbant apie MCU, jūs turite galimybę valdyti ir konfigūruoti visus jos kištukus.

Jei šiek tiek pavargstate nuo to, tiesiog atsikratykite, nes tai nėra nieko sudėtinga, jums teks palengvinti visus aspektus tolygiai, bet tvirtai, kai eisime į priekį.

MCU mikroschemoje visi kaiščiai, išskyrus Vdd ir Vss, kurie yra mikroschemos maitinimo kaiščiai, gali būti priskirti išskirtiniais pavadinimais.

Išsami Pinout informacija

Pažvelgę ​​į lustą iš viršaus, rasite nedidelį trikampį įpjovą, kuris nurodo pradžios tašką, nuo kurio prasideda smeigtukai, skaičiuojant, kad lusto kaištis Nr. 1 prasideda tiesiai po šia išpjova.

Pradėdami nuo šio kaiščio, rasite 20 kaiščių iki apačios toje pusėje (kairėje), o dar 20 kaiščių kitoje pusėje (dešinėje), tęsdami iš apačios į viršų dešinėje pusėje.

Pirmieji 8 kaiščiai, pradedant nuo įpjovos, yra PBO-7, kurie sudaro IC indeksinius kaiščius, nes visa programa čia prasideda nuliu.

Pirmiau nurodyta pinouts serija vadinama PORT B, o yra ir kitų identiškų prievadų rinkinių, priskirtų A – D.

Šie prievadai gali būti priskirti priimti ir atpažinti tiekiamus duomenis, vadinamus INPUT, taip pat perduoti duomenis tam tikra nurodyta forma, vadinama OUTPUT.

Du iš bendrosios kategorijos kaiščių yra (+) / (-) kaiščiai, kurie taip pat vadinami Vdd ir GND.

Vieną „PORT D“ kaištį (SKVN-6) galima pamatyti kairėje lusto pusėje apačioje.

PD7, kuris yra D porto 7 kaištis Nr. 7, galima atsekti stovint atskirai ir pradedant dešiniojo šono seriją.

Dabar judėdamas iš dešinės žetono pusės, kur baigiasi PORT D, C portas pradeda skaičiuoti aukštyn tvarka.

Tai prisideda prie daugybės įdomių MCU kaiščių nuo analoginio iki skaitmeninio.

Šie kaiščiai yra naudojami kaip jutimo įėjimai daugeliui parametrų aptikti per išoriškai sukonfigūruotas analoginės grandinės pakopas.

Pirmiau minėti kaiščiai sudaro PORT A.

Analoginį ir skaitmeninį keitimą aukščiau minėtuose kaiščiuose galima suprasti naudojant pavyzdį, kai analoginis temperatūros lygis, nustatytas naudojant įprastą jutiklį, pvz., Termistrą, yra pritaikomas vienam iš PORT A kaiščių, kurį MCU lengvai priima ir konverterį sukurti skaitmeninį rodmenį nuo nulio iki 255 laipsnių F (8 bitų skaičius, kurį galima patobulinti, norint pasiekti 10 bitų išvestį).

Kitas bruožas, kurį galima pamatyti MCU, yra laisva programavimo erdvė arba atmintis, kuri nustato kintamųjų ir programos, nurodytos mikrovaldikliui, vietą.

Be to, MCU turi įmontuotą laikrodį, skirtą atitinkamiems parametrams skaičiuoti.

Laikrodžio funkcijos leidžia MCU taikyti daugelį skirtingų skaičiavimo procesų, kurie gali būti greiti mikrosekundžių diapazone, priklausomai nuo konkretaus įrenginio specifikacijos, taip pat gali būti lėtesni bet kokiu norimu mastu.

Dabar jau galite šiek tiek suprasti mikrovaldiklio koncepciją, atsižvelgiant į jo prievadus ir kaiščius.

Kaip sukurti SPI jungtį iš programuotojo į mikrovaldiklį

Dabar atėjo laikas šiek tiek gilintis į temą ir ištirti programavimo pasaulį.

Tai pasakę, prieš pradėdami programos įkėlimo procedūrą į lustą, turime rasti tinkamą būdą integruoti SPI (Serial Peripheral Interface) jungtį su MCU.

Tačiau net ir po to mes negalime tiesiog įstumti SPI į MCU kontaktus, ar ne? Taip pat negalime leisti, kad išplėsti laidai iš SPI būtų tiesiogiai įkišti į duonos lentą. Tai taip pat gali sukelti neteisingą laidų nustatymą, susietą su neteisingais kaiščiais, kurie blogai jungiasi.

Todėl, kad viskas būtų visiškai nepriekaištinga, mes atliekame procedūras per mažą verandos lentą, kurioje gauname reikiamus jungiamuosius metalinius kaiščius, dar vadinamus „antraštėmis“. Šie antraštės kaiščiai dabar gali būti naudojami jungiantis su SPI jungtimi. Jungtys iš šios antraštės gali būti nutrauktos su kitais lygiagrečiais antraštės kaiščiais, kurie gali būti naudojami duonos lentos jungtims.

Taigi aukščiau pateiktas mazgas dabar sudaro tvirtą ir patikimą tarpinę SPI ir MCU jungiamąją platformą.

Dabar „Uptil“ viskas atrodo gražiai ir puikiai, todėl eikime uždirbti dėl programuotojo, kurio reikia tarp jūsų kompiuterio ir MCU.

Gali būti daugybė bendrovių, kurios gamina ir parduoda šiuos programuotojų blokus, todėl jų įsigijimas neturėtų kelti jums problemų, pvz., „Adafruit Industries“, „USBtinyISP“ ar „Sparkfun“.

Keletas iš jų gali atrodyti visiškai skirtingi nei įprasti tipai, tačiau iš esmės viskas yra identiška ir atitinka standartines programavimo taisykles ir gali būti naudojami kaip sąsaja tarp jūsų kompiuterio ir AVR mikrovaldiklio.

Tačiau įsitikinkite, kad pagalvojote, jei naudojate kitą MCU, o ne „AVR Atmega32“, gali tekti patikrinti, ar yra atitinkamai suderinamas programuotojas konkrečiam MCU lustui.

Galima pastebėti, kad nemažai šių programuotojų naudoja identiškus tvarkykles, reikia pasirūpinti kažkuo, ką sužinosime, ir mes apie tai sužinosime tolesniuose skyriuose.

Kompiuterio prijungimas prie mikrovaldiklio lusto yra tikrai paprastas dalykas, ir jums būtų malonu žinoti, kaip paprasta tam reikalinga procedūra. Taigi iš karto paspauskite mygtukąJ

Padaryti aukščiau paaiškintą SPI sąsajos plokštę nėra sunku, visa tai yra tai, kad jūsų litavimo lygintuvas veiktų per visas jungtis per visas parodytas dvi antraštės eilutes kaiščių ant mažos bendrosios paskirties plokštės.

Aukščiau pateiktame paveikslėlyje parodyta ryšio informacija, kurios turėtumėte laikytis sujungdami laidus tarp antraščių.

Kad viskas būtų dar paprasčiau, peržvelkime šią išsamią ryšio informaciją, remdamiesi aukščiau esančiu vaizdu:

SPI kaištis pradedant nuo viršutinio kairiojo krašto patenka į „Master IN, Slave OUT“ (MISO)

SPI kaištis iš centro kairės jungiasi su laikrodžio kaiščiu (SCK)

SPI kaištis apatiniame kairiajame kampe sujungiamas su „Reset“. (Apie šį smeigtuką išsamiai sužinosime šiose pamokose)

SPI, susijęs su apatiniu dešiniuoju kampu, pritvirtinamas prie MCU GND kaiščio, GND reiškia kaištį, kuris sudaro nulio tiekimo liniją arba neigiamą (santykinį) tiekimo bėgį.

SPI, baigiantis dešiniąja vidurine antrašte, susiejamas su MCU „Master Out, Slave IN“ (MOSI) kaiščiu.

SPI, išeinantis iš viršutinės dešinės antraštės, yra prijungtas prie MCU (+), kuris akivaizdžiai yra Vdd arba teigiamas MCU tiekimo kaištis.

Viskas.

Prijunkite dvi jungtis, kaip paaiškinta, ir jūsų SPI sąsajos plokštė yra paruošta reikalingiems veiksmams atlikti.

Norėdami gauti daugiau pagalbos, galite peržiūrėti paveikslėlį, kuris parodyta aukščiau, jūsų galutinė sąsajos plokštė turėtų atrodyti taip, kai visi laidų sujungimai bus tinkamai atlikti naudojant aukščiau pateiktą diskusiją.

Tikiuosi, kad jūs jau sukūrėte SPI sąsają, kaip paaiškinta ankstesnėje mokymo programoje, ir dabar atėjo laikas užtikrinti, kad mūsų kompiuteris priims programuotoją, kurį turime integruoti tarp asmeninio kompiuterio ir MCU.

Paprasto programavimo kodo sukūrimas MCU

Paimame USBTinyISP įrenginį, kurį galite įsigyti iš „Sparkfun“, kad susietumėte kompiuterį su mikrovaldikliu.

Mes žinome, kad bet kuriai kompiuterio operacinei sistemai, tokiai kaip „Windows“, reikės tvarkyklių, be kurių būtų nenaudinga ką nors įkelti į kompiuterį, todėl mūsų programuotojui reikės tvarkyklių, kad būtų galima įkelti į jūsų kompiuterį.

Pažvelkime į procedūras, reikalingas tvarkyklėms įdiegti į kompiuterio OS, čia imkime „Windows 7 OS“ pavyzdį su 32 bitų arba 64 bitų specifikacijomis.

Atidarykite sparkfun.com ir spustelėkite „pocket AVR programmer page“. Nuorodą galima lengvai vizualizuoti puslapyje.

Tada po dokumentais raskite „Windows tvarkyklę“ ir tiesiog spustelėkite ją.

Tai suteiks jums failą pocketprog-driver.zip jūsų kompiuteryje.

Eikite į savo kompiuterį, raskite atsisiuntimo vietą ir tiesiog išpakuokite atsisiųstą failą į aplanką.

Jei jūsų kompiuteryje yra 64 bitų OS, turite atlikti dar keletą žingsnių, kaip nurodyta toliau, naudodami 32 bitų OS, galite tiesiogiai pradėti diegimą iš neišpakuoto failo.

Jei naudojate 64 bitų, tiesiog ignoruokite:

„Google“ „libusb sourceforge“ ir spustelėkite šią nuorodą naujausia versija.

Jūs rastumėte keletą papildomų failų, tačiau jums būtų įdomu rasti antkaklio failą, tai yra: libusb-win32-bin - #. #. #. #. Zip

Dabar eikite ir raskite šią atsisiuntimo vietą savo kompiuteryje, išpakuokite ją ir išsaugokite viename iš aplankų.

Šiame aplanke eikite per šiukšliadėžės aplanką ir pereikite prie aplanko „amd64“.

Čia pamatysite keletą aplankų: ghcalled libusb0.dll ir libusb0.sys.

Norėtumėte juos pervadinti taip: libusb0_x64.dll ir libusb0_x64.sys.

Dabar turėsite nukopijuoti aukščiau nurodytus failus į „pocketprog-driver“ aplanką, tiesiog perrašykite esamos versijos failus.

Norėdami įdiegti aukščiau nurodytas tvarkykles, jus domintų šis būdas, kuris yra gana netradicinis:

Tai režimas „pridėti seną aparatinę įrangą“.

Spustelėkite „Pradėti meniu“

Tada tęskite dešiniuoju pelės mygtuku spustelėdami „kompiuteris“

Spustelėkite „Tvarkyti“ ir galiausiai spustelėkite „Įtaisų tvarkyklė“

Tada meniu viduje pasirinkite „Pridėti seną aparatinę įrangą“

Toliau spauskite „kitas“, kol vedlys bus įterptas

Vykdydami instrukcijas, spustelėkite „Įdiekite aparatinę įrangą, kurią turėtumėte pasirinkti iš išplėstinio sąrašo“, tai paragins radijo mygtuko piktogramą į tą pasirinkimą. Iš tikrųjų tai yra „Windows“ valdymo mygtukas, kuris dabar atrodo kaip mažas apskritimas, kurio viduje yra apvaliai mėlyna padanga.

Dabar tiesiog spustelėkite „Kitas“

Tai parodys meniu „Rodyti visus įrenginius“, kurį turėsite spustelėti.

Po to spustelėkite piktogramą „Turi diską“.

Naudodamiesi piktograma „Naršyti“, eikite į „pocketprog-driver“ aplanko vietą. Jei pasirinkimą atlikote teisingai, vizualizuotumėte pocketprog.inf failą, įdėtą į tą konkretų aplanką.

Dukart spustelėkite šį failą ir tikrai matysite, kaip tvarkyklė įdiegiama į jūsų kompiuterį.

Per ir iš!! Tęskime kitą mūsų pamoką kitame puslapyje.

Dabar galbūt jau esate įdiegę reikiamą programinę įrangą ir sukūrę SPI sąsają.

Kaip perkelti programą į mikrovaldiklio lustą

Kitame etape reikės kelių komponentų, tokių kaip duonos lenta, šviesos diodas ir apskaičiuotas rezistorius numatytai programai.

Šiame skyriuje sužinosime programuotojo testavimo metodą ir patvirtinsime atitinkamų tvarkyklių ir programinės įrangos įdiegimą.

Norėdami patikrinti, ar tvarkyklės ir programinė įranga įdiegta teisingai, įdiegsime paprastą programą, vadinamą „avrdude“.

„AVRdude“ yra programa, susieta su naujausia „WinAVR“ instaliacija, be kurios faktinis failo perkėlimas į MCU negali būti įmanomas.

Ši programa yra .hex failo formatas, kuris iš esmės tampa suprantamas MCU reikalingoms vykdymo operacijoms atlikti.

Jei patvirtinti nepavyks, programuotojas negalės perduoti failo.

Greitai pažiūrėkime, kaip mes galime įgyvendinti testavimo procedūrą, naudodamiesi šiomis instrukcijomis:

Atidarykite DOS (Disk operacinės sistemos) eilutę spustelėdami „meniu Pradėti“ ir nurodytame paieškos laukelyje įrašydami cmd.exe.

Dabar AVRdude galima atlikti tiesiog per DOS eilutę įvedus avrdude –c usbtiny –p m32. Kai tik tai bus įgyvendinta, DOS akimirksniu pripažins, ar ryšys buvo sėkmingas.

Pirmiau pateiktoje komandoje „-c“ yra pranešimo vėliava, į kurią įeina „usbtiny“ programuotojo parametro specifikacija, o žyma „-p“ identifikuoja mikrovaldiklio įrenginį („m32 žymi„ Atmega32 “).

Jei naudojote kitą MCU, turėsite įtraukti atitinkamus įgyvendinimo prefiksus.

Baigę aukščiau aprašytą procedūrą, per DOS eilutę galite įvesti „exit“ ir tai jus išves iš lango.

Jei rimtai domitės faktinėmis programavimo detalėmis, tai pirmiausia turėtume lituoti ir sukonstruoti išorinę analoginę LED grandinę, per kurią būtų galima įgyvendinti programą, nes jei nėra sistemos, kuri patvirtintų MCU atsakymą, programavimas o mikrovaldiklio veikimas būtų visai beprasmis.

Šviesos diodų plokštės gamyba yra labai paprasta, viskas susiję su dviejų šviesos diodų laidų litavimu ant lentos gabalo ir prijunkite rezistorių su vienu iš šviesos diodo laidų. Šio šviesos diodo vaidmuo yra tik apriboti šviesos diodo srovę, kad jis nesudegtų dėl perteklinės įtampos ir srovės iš MCU išėjimo.

Rezistoriaus vertę galima apskaičiuoti naudojant šią paprastą formulę:

R = (Ub - LEDfwd) / Aš

Kur „Ub“ yra maitinimo įtampa, „LEDfwd“ yra optimali naudojamo šviesos diodo darbinė įtampa, o aš - optimali jo stiprintuvas.

Tarkime, kad mes naudojame raudoną šviesos diodą, kurio šviesos diodo priekinė įtampa = 2,5 V, o srovė I = 20 mA, aukščiau pateiktą lygtį galima išspręsti taip:

Kadangi įtampa iš MCU būtų 5V, ji gali būti išreikšta:

R = (5 - 2,5) /. 02 = 125 omai, ¼ vatas, tiks artimiausia vertė - 120 omų.

Dabar mes turime šviesos diodą, 120 omų rezistorių ir verbalą, paprasčiausiai sujunkite pirmiau nurodytus komponentus, kaip parodyta diagramoje, su mikrovaldikliu.

Kai tai bus padaryta, MCU gali būti užprogramuotas numatytam atsakymui pagal anksčiau pateiktą šviesos diodą.

Toliau - MCU programavimas.

Kad mikrovaldiklis galėtų atlikti prasmingus diegimus, būtina į MCU įrašyti atitinkamas instrukcijas.

Kaip įdiegti programavimo aplinką ir ištirti WinAVR

Tam tikriausiai galėtume naudoti savo „teksto rengyklę“ savo kompiuteryje, nors galbūt ir mes norėtume vertinti profesionalesnės „programavimo aplinkos“, o ne įprasto teksto rengyklės, naudojimą, nes šis metodas leis jums mėgautis kai kuriais šiame „programavimo aplinkos“ pakete įdiegtos įdomios funkcijos.

Tai padėtų kurti ir redaguoti programas įvairiomis kalbomis, taip pat sukompiliuoti jas į pristatymo režimą, kurį lengvai supranta ir priima mikrovaldiklio lustas.

Galiausiai tai palaikys „WinAVR“ ir perkels į atitinkamą MCU lustą.

„WinAVR“ taip pat gali būti įrengtas atlikti daugybę kitų operacijų, tokių kaip programų trikčių šalinimas ir įspėjimas apie galimą sintaksę bei klaidų ir klaidų kompiliavimas. Aptarsime tai aš savo vėlesnėse pamokose.

Norėtumėte, kad „WinAVR“ diegimo eiga būtų labai greita ir greita. Pasinerkime į detales su šiais punktais:

Turėsite atsisiųsti naujausias versijas iš „WinAVR source forge files“ aplanko. Iš jo oficialios svetainės galite rasti naudingos informacijos, susijusios su šiuo atsisiuntimu.

Jums bus pasiūlyta atlikti saugos užklausą, kad galėtumėte atsakyti, jei norite, kad atsisiuntimas būtų vykdomas, klausiama, ar atsisiunčiamas failas yra vykdomasis failas.

Atsisiųskite failą ir pradėkite vykdymo procesą spustelėdami jį. Tegul prasideda diegimas.

Procesas padės jums pateikti kelis atsakomus klausimus, kad galėtumėte supaprastinti diegimą pagal savo patogumą. Norėtumėte ignoruoti daugelį iš jų numatytosiose formose. Viskas būtų jūsų pasirinkta, kurios, jūsų manymu, geriausiai tinka veiksmams.

Iki šiol jums viskas atrodė gana įprasta ir lengva, o jūs galite rasti keletą variantų, kuriuos pateikiu pradžios meniu. Nesijaudinkite, tik kai kurie iš jų iš tikrųjų naudos tik vieną iš pavadinimų „programuotojų bloknotas“.

Spustelėjus šią piktogramą, bus sukurta vartotojo sąsaja, kad galėtumėte pritaikyti programų rašymą (pvz., Kurti ir redaguoti). Jūs taip pat matysite programą, susidedančią iš meniu komandų, padedančių jums surinkti kodus ir įterpti juos į mikrovaldiklį.

Pagrindinis pirmiau minėto programuotojo bloknoto uždavinys yra perskaityti žmogaus suprantamą kodą, kurį rašote, į instrukcijų seriją, suprantamą tik MCU.

Kitoje pamokoje bus aptartas aukščiau nurodyto programuotojo testavimas, kad galėtume būti tikri dėl jo suderinamumo su „Windows“ ir ar jis puikiai „paspaus ranką“ su jūsų mikrovaldiklio IC.

Kaip užprogramuoti MCU LED įjungti

Kai tai bus patvirtinta, mes toliau sukursime nedidelį „nieko nedaryti“ kodą, kad įsitikintume, jog kodo perkėlimo procedūroje nėra klaidų.

Žinoma, dabar mes esame pasirengę įdiegti savo pirmąją programą MCU, tačiau prieš tai būtų įdomu greitai apibendrinti tai, ką padarėme atlikdami ankstesnes pamokas:

Įsigijome „AVR Atmel“ mikrovaldiklį pagal mūsų reikalaujamą specifikaciją, iliustracijoms naudojome „ATMega32“. Toliau sužinojome apie mikrovaldiklio pagrindus ir programuotojo bloką, kuris yra atsakingas už programos perkėlimą į MCU lustą.

Toliau mes sukūrėme SP sąsajos jungtį, kuri yra būtina, kad jūsų kompiuterį būtų galima susieti su mikrovaldikliu programavimo veiksmams atlikti.

Po to mes patvirtinome, ar tvarkyklės buvo tinkamai įdiegtos kompiuteryje 32 ir 64, bet 64 operacinei sistemai.

Tada mes įdiegėme programavimo aplinką, vadinamą „Win AVR“, kad būtų lengviau rašyti skelbimus, perduodant kodus į mikrovaldiklį, o po to įdiegėme „avrdude“, kad patikrintumėte programuotoją su savo kompiuteriu ir tarpusavyje sujungtu mikrovaldikliu.

Galiausiai ankstesniame skyriuje baigėme kurti LED / rezistoriaus grandinę ir prijungėme ją prie atitinkamų MCU išėjimų.

Tai tikrai daug darbo, vis dėlto atėjo laikas iškart pradėti tikrus programavimo dalykus!

Pirmiausia norėtume padalinti mikrovaldiklį į tris kategorijas, tai labai supaprastintų mūsų supratimą:

Valdymas, aptikimas ir ryšys

Būtų įdomu žinoti, kad pirmiau nurodytas funkcijas galima programuoti įvairiai.

Pirmojoje programoje mes bandytume įsakyti mikrovaldikliui „valdyti“ išorinį parametrą, taip, jūs teisus, tai būtų neseniai pastatytas šviesos diodas.

Tiksliau sakant, liepsime MCU įjungti prijungtą šviesos diodą, taip, aš žinau, kad tai atrodo gana primityviai, bet pradinis etapas visada turi būti lengvas.

Einant dabartinį darbą, priversti MCU valdyti LED iš tikrųjų yra gana paprasta:

Tam mes nurodome PORT B ​​kaištį Nr. 0 pagaminti reikiamą 5 V šviesos diodui.

Prisiminkite iš ankstesnės pamokos, mes prijungėme LED anodą prie pirmiau minėto MCU kaiščio.

Šiam MCU kaiščiui reikia skirti du esminius dalykus: 1) išėjimas ir 2) 5 voltai

Išmoksime būdą, kaip nurodysime konkrečiam kaiščiui tapti MCU išvestimi.

Nustačius, kad lustas yra išvestis, galime nurodyti, kad tai būtų „aukštas“ (5 V) arba „mažas“ (0 V), kaip norima programai.

Kadangi bet kuri loginė grandinė, pvz., MCU, kaiščiai gali nudžiūti išėjimu arba įėjimu ir gali būti sukonfigūruoti taip, kad būtų sukurta aukšta logika arba maža logika, kaiščiai turi būti priskirti tik tam, kad jie būtų logiškai aukšti arba logiškai žemi , nėra jokių tarpinių ar neapibrėžtų būsenų, išskyrus šias porą mikrovaldiklių arba bet kokių skaitmeninių IC būsenų. Taip pat tas pats galioja kiekvienam MCU kaiščiui.

Kalbant apie įvesties ir išvesties kaiščių priskyrimą, įėjimai būtų išdėstyti taip, kad priimtų signalus iš išorinių analoginių etapų, o išėjimai būtų atsakingi už jų interpretavimą į nurodytas logines būsenas arba dažnį.

Nors pirmiau nurodytas užduotis galima atlikti daugeliu skirtingų metodų, paprastumo sumetimais aptarsime vieną iš jų. Tačiau reikia pažymėti, kad nors dabar pateiktas atrodo lengvai ir įdomiai, jis nėra toks perspektyvus ir nerekomenduojamas visų MCU programų tipas, dėl tos pačios priežasties vėliau kurse būsite supažindinti su populiaresniais programavimo metodais . Šios programos leis priskirti tik norimus kaiščius pagal specifikacijas, nepaveikiant kitų gretimų, kurie galbūt jau būtų priskirti atlikti kai kurias kitas funkcijas.

Tačiau šiuo metu mes daugiau nesijaudinsime dėl kitų kaiščių ir naudosime tik atitinkamus dominančius kaiščius, išvengdami tam tikrų komplikacijų.

Norėdami priskirti kaištį kaip išvestį, turime naudoti duomenų krypties registrą (DDR). Jei įdomu, ką čia reiškia registras, tai tiesiog MCU vieta, leidžianti mikrovaldikliui reaguoti tam tikru būdu.

Naudodamiesi DDR, mes galime nustatyti kaištį siųsti duomenis, panašius į „išvestį“, arba priimti duomenis, kurie yra „įvesties“ formos.

Nepaisant to, jūs galite būti supainiotas dėl žodžio, ką tai reiškia? Duomenys prideda trečią matmenį kaiščiams, kurie gali būti priskirti nuolat esant loginiam nuliui (0 V) arba loginiam aukščiui (5 V), bet ką apie signalus, kurie gali greitai skirtis, pavyzdžiui, impulsų dažnis. Kartu su dažniu būtų naudojama aukšta ir žema logika (5 V ir 0 V), svyruojanti tam tikrais nurodytais intervalais ar periodais, todėl jis tampa orientuotas į laiką ir gali būti koreguojamas atsižvelgiant į laiką, todėl mes identifikuojame kaip „duomenis“, reiškiantį parametrą, kuris rodo funkcija, palyginti su kita funkcija (loginės būsenos ir laikas).

Vienas iš būdų priskirti pin0 kaip išvestį yra parašyti šį kodą:

DDRB = 0b00000001

Pirmiau pateiktoje programoje DDRB reiškia duomenų nukreipimo registrą PORT B ​​0b nurodo kompiliatoriui dėl šios dvejetainės skaičiaus išraiškos, o „1“ išraiškos pabaigoje nurodo pin0 padėtį, tai yra jo vieta formoje pirmojo PORT B ​​kaiščio.

Jei prisimenate, mes sužinojome, kad PORT B ​​susieja su juo 8 kaiščius (nuo 0 iki PIN7), o jei pastebite, kad aukščiau pateiktame kode taip pat yra 8 skaitmenys, o tai reiškia, kad kiekvienas skaitmuo reiškia šiuos 8 PORT B ​​kaiščius.

Dabar kita procedūra būtų 5V priskyrimas šiam kaiščiui (pin0). Vėlgi, veikimo principas yra identiškas DDR, kaip nurodyta aukščiau, nurodant šį dvejetainį kodą:

PORTB = 0b00000001

Kaip matyti, vienintelis skirtumas tarp pirmiau minėto kodo ir ankstesnio yra tas, kad šiame kode mes pasinaudojome PORT registru. Šis registras specialiai tvarko konkretaus prievado, kuriam jis buvo skirtas MCU, kaiščių priskyrimus. Taigi tai leidžia mums priskirti tikrąją tų logotipų duomenų logiką (0 arba 1).

Dabar mums gali būti įdomu aptarti apytikslę mūsų programos informaciją. Kadangi žinome, kad visoms programoms pradėti reikia vykdyti tam tikrą vietą, tai galima palyginti su virėju, kuris žino visus tam tikro recepto ingredientus, tačiau nėra nurodytas nuo ko pradėti.

Pagrindinė funkcija yra vieta, kurioje kiekviena C / C ++ programa inicijuoja vykdymą. Todėl pagrindinis gali būti sukurtas taip:

int main (negaliojantis)
{
}

Tačiau norint, kad programa galėtų interpretuoti DDR ir PORT registro duomenis ir jų veikimą MCU luste, reikia įtraukti papildomą pareiškimą, kurį gali sudaryti visi duomenys apie AVR MCU. Galbūt norėtume įtraukti šį įtraukimą į visas savo programas.

# įtraukti
int main (negaliojantis)
{
}

Kai tik pradedama kompiliacija, kompiliatoriaus išankstinio procesoriaus skyrius sutelkia dėmesį į AVR katalogą, kad nustatytų „io.h“ failą. Plėtinys „.h“ čia nurodo, kad tai yra antraštės failas ir kad šis failo kodas būtų įvestas kuriamo šaltinio failo pradžioje (galvoje), taigi ir pavadinimas „antraštė“.

Čia mes galime įvesti DDR ir PORT sakinius į savo kodą, nes pridedant io.h antraštės failą kompiliatorius būtų nukreiptas į juos.

# įtraukti

int main (negaliojantis)

{

DDRB = 0b00000001 // Duomenų krypties registras nustatantis PIN kodą išvesties ir likusius kaiščius kaip įvestį

PORTB = 0b00000001 // Nustatykite 0 kaištį į 5 voltus

}

Tai, kas išdėstyta pirmiau, nustato 0 kaičio, kaip išėjimo, orientaciją, kurios dydis yra 5 V. Tačiau vis dar yra viena problema, kuri nėra nustatyta šiam kaiščiui, ty šiam kaiščiui dar reikia nurodyti įjungti neribotą laiką, kol maitinamas MCU. Ši begalinė grįžtamojo ryšio linija užtikrintų, kad šis kaištis iš MCU neišsijungtų, o tęsiasi su 5 V išvestimi neribotą laiką.

Nors yra daug įvairių būdų, kaip pritaikyti kilpos instrukciją kaiščiui, čia bandytume naudoti kilpą „o“. Kaip rodo pavadinimas, „while“ kilpa sako mikrovaldikliui, kad „kol“ yra energijos, turite likti suaktyvintas priskirtam 5 V įtampai.

# įtraukti

int main (negaliojantis)

{

DDRB = 0b00000001 // Duomenų krypties registras nustatantis PIN kodą išvesties ir likusius kaiščius kaip įvestį

PORTB = 0b00000001 // Nustatykite 0 kaištį į 5 voltus

o (1)

{

// Kodas būtų čia, jei jį reiktų vykdyti dar ir dar ir dar ... be galo

}

}

Galbūt norėtumėte atkreipti dėmesį į tai, kad čia „1“ naudojome argumento forma „while“ kilpai, nes viskas, išskyrus „0“, gali būti laikoma logiška „tiesa“.

Tai reiškia, kad „nors“ ciklo svarstymas niekada nebus atsakingas už nieką, išskyrus loginį „tiesa“, o tai reiškia, kad konkretus kaištis neribotą laiką laikysis nurodytoje būsenoje.

Šviesos diodas gali būti įjungtas visam priskirtam kaiščiui visam laikui, kol MCU gauna maitinimą per savo Vdd ir Vss.

Štai ir viskas, dabar mes turime rezultatą, kurio norėjome gauti ir pagaliau galime pamatyti, kaip tai vyksta po tiek sunkaus darbo, tačiau, nepaisant to, saldus mūsų sunkaus darbo rezultatas yra toks patenkintas.

Kitose pamokose sužinosime, kaip pridėti „laiko“ matmenį prie aukščiau esančio šviesos diodo, tai yra, kaip priversti jį mirksėti tam tikru nurodytu greičiu.

Tiesą sakant, įgyvendinant aukščiau pateiktą variantą, šviesos diodas iš tikrųjų mirksi, tačiau ciklo dažnis yra toks greitas, kad jis yra beveik kaip nuolatinis LED apšvietimo įjungimas.

Pažiūrėsime, kaip šią kilpą galima pridėti su norimu vėlavimu, kad šviesos diodas mirksėtų tokiu vėlavimo greičiu.

Kaip priversti mirksėti šviesos diodą naudojant AVR mikrovaldiklį

Paskutinės diskusijos metu mes sužinojome, kaip įjungti LED jungiklį per mikrovaldiklį, ar ne? Gali būti ne tiek jau daug!

Čia sužinosime, kaip pagreitinti aukščiau nurodytą šviesos diodų apšvietimą priskiriant dvikryptę funkciją, tai yra, pabandysime priversti jį mirksėti ar mirksėti tam tikru nurodytu dažniu ar greičiu. Taip pat pamatysime, kaip galima padidinti ar sumažinti šį rodiklį, kaip to pageidauja vartotojas.

Pažvelkime į tai:

# įtraukti

# įtraukti

int main (negaliojantis)

{

DDRB | = 1<< PINB0

o (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Jei jaučiatės suglumęs tais keistais simboliais (&, ^, | ir tt), naudojamais aukščiau pateiktoje išraiškoje (& nėra, bet gali būti naudojamas kituose panašiuose koduose), pateikite susijusią informaciją, kurią norėtumėte sužinoti apie šiuos :

Tai apima daug standartinių loginių algoritmų, tokių kaip AND, OR, NOT ir XOR, kurie paprastai naudojami su aukščiau nurodytu kodu.

Šios loginės funkcijos lygina du bitus „1“ ir „0“ pagal jiems priskirtas tiesos lenteles.

Idėjos gausime išanalizavę šį bitų išdėstymą:

01001011 &
10001101
lygu
00001001

Pirmiau pateiktame kode & nurodo AND, naudojamą C programavimui.

Skaitydami eiles vertikaliai, tai rodo, kad 0 ir 1 yra lygūs 0, 1 ir 0 taip pat lygūs 0, 0 ir 0 yra lygūs 0, 1 ir 1 yra lygus 1. Perskaityti tai taip paprasta. Tai yra pagal AND operatoriaus tiesos lentelę.

Jei įvertintume šią lentelę, tai rodo simbolį „|“ žymi „OR“ funkcijų naudojimą, „|“ kompiuterio klaviatūroje galite rasti kairėje „atgalinio klavišo“ pusėje:

01001011 |
10001101
lygu
11001111

Taip pat ši ARBA logikos funkcijų tiesos lentelė rodo, kad bitai 0 arba 1 yra lygūs 1, 1 arba 0 taip pat lygūs 1, 0 arba 0 yra lygūs 0, o 1 arba 1 yra lygūs 1.

Šis bitų derinys skirtas XOR logikos operatoriui, žymimam ^, ir gali būti tiriamas taip, kaip mes darėme su AND, OR tiesos lentelėmis:

01001011 ^
10001101
lygu
11000110

Dabar tęskime pirmąją programą ir sužinokime, ką reiškia ši eilutė joje:

# įtraukti

Per ankstesnes mokomąsias programas žinome, kaip išraiška veikia, todėl jos nekartosime, tačiau atrodo, kad jos yra naujas „įtraukimas“, išreikštas #include, kurį reikia ištirti.

Į šį „įtraukite“ atidėjimą.h leidžia mums naudotis keliais lengvais įgyvendinimo metodais.

Kaip rodo pavadinimas, delay.h leidžia mums sukelti konkrečios programos vėlavimą.

Kitas posakis int main (void) gali būti praleistas vykstančiose diskusijose, nes tai jau aptarėme savo ankstesniuose pranešimuose.

Toliau ateina pakeistas DDRB.

Toliau parodyta ankstesnė forma, kuri nėra geresnis būdas priskirti kaiščius, nes visi kaiščiai nuo 0 iki 7 buvo perjungti, kad sudarytų įvestis. Bet tik įsivaizduokite, kokia būtų situacija, jei norėtume sukurti ilgesnę programą, kuriai reikalingi kaiščiai kitai funkcijai? Pavyzdžiui, kaištis 2 gali būti reikalingas nuotoliniam prietaiso perjungimui taikyti. Tokiu atveju nevertintume to paties kaip įvesties priskyrimo tik bandant ir per klaidą. Tai gali reikšti neteisingą nuotolinio siųstuvo atsakymą į prietaiso imtuvą.

DDRB = 0b00000001

Mes labiau norime paveikti tik vieną bitą, hat pin 0 bitą, žvilgtelėdami į „OR“ funkcionalumą, kurį būtų galima atlikti naudojant dvejetainį maskavimą.

DDRB = DDRB | 0b00000001

Čia jis užmaskuotas „OR“ kauke: 0b00000001, nors atrodo, kad tai autentiškas dvejetainis skaičius, jei ankstesnis DDRB, pavyzdžiui: 0b01001010, tada taikant OR tam naudojant maskavimą, galima gauti: 0b01001010 | 0b00000001 = 0b01001011.

Gautas skirtumas, kurį galima pamatyti, yra tik su pin0, kurio bitai pasikeitė!

Dar labiau suglaudinant aukščiau pateiktą teiginį per C ++, gaunama:

DDRB | = 0b00000001

Tačiau pastebime, kad pateiktoje programoje yra dar daugiau. Nors tai gali atrodyti gana teisėta ir akivaizdu, mes turėtume pasinaudoti kai kuriais teiginiais iš io.h antraštės failo, ypač kai tai iš esmės sukurta mūsų patogumui?

Taigi, jei „DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Taigi mes pradedame nuo 0b00000000 ir dedame „1“, kad gautume 0b0000001, tada perkeliame jį į kairę 0 pozicijas, o tai suteikia visiškai identišką 0b00000001, kaip nurodyta aukščiau.

Jei manytume, kad tai PINB4, teiginį galima išreikšti kaip 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Saugokitės, kad mes naudojame nulinį indeksą, o tai reiškia, kad po „1“ yra keturi nuliai.

Dabar pereikite prie „kol“ kilpos, kurią anksčiau pastebėjome per „begalinę kilpą“. Bet galbūt dabar mes norime, kad mikrovaldiklis įgyvendintų kai kurias norimas egzekucijas. Tai gali būti įmanoma tik duotoje linijoje. Tai kilpa, kurioje tam tikra seka kartojama vėl ir vėl.

Jei vykdymas būtų atliktas prieš kilpą, jis būtų įgyvendintas tik vieną kartą.

Tačiau norint, kad šviesos diodas mirksėtų neribotą laiką, reikia pakaitomis įjungti / išjungti PINB0. Čia taip pat randame įvedamus vėlavimus, be kurių mirksi šviesos diodas būtų neįmanomas. Bet tai priverstų šviesos diodą mirksėti labai greitai, sunkiai atpažįstamą plika akimi, jis turėtų šiek tiek sulėtėti, kad taptų atpažįstamas mūsų akimis.

Mes žinome tam tikro dvejetainio skaičiaus bitų nustatymo procedūrą, tačiau dar nežinome, kaip pritaikyti konkretų bitą „0“, jei tai dar „1“.

Galima pastebėti, kad tai daro ši programa, tačiau taip pat pastebėsime, kad ji gali būti nematoma programoje.

Pradiniai du teiginiai pakeičia bitą į „1“ (5 V, LED lemputės), tada 100 ms pauzė įvedama.

Kitos poros eilučių PINB0 bitą paverčia „0“ (nulinė įtampa, šviesos diodas išjungtas), tačiau apgailestaujame, kad IR palyginimas negalės įvykdyti „0“ iš bitų, bet jei naudosime NE „~“ dvejetainei kaukei ji galėjo visus 0 pakeisti į 1 ir atvirkščiai.

Tai leis mums paveikti tik PINB0 bitą ir apversti jį į „0“. Skliaustai buvo įtraukti siekiant užmaskuoti vykdymą taip, kad NOT operaciją būtų galima taikyti visoms kaukėms, o ne paprasčiausiai per „1“ prieš kairįjį poslinkį.<<”.

Uostas | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

Norėdami sukurti ON OFF vėlavimus arba vienodos trukmės laikotarpius, mes galime sutrumpinti ankstesnes keturias eilutes dviem ir pritaikyti savo naudai XOR funkciją. Reikia pažymėti, kad XOR vykdymas priskiria PIN kodą 1, jei jis yra 0 ir atvirkščiai. Šis vykdymas turėtų įtakos tik PINB0. Kaip kartais gali būti taikoma komanda, ji tiesiog pavers bitą priešingu esamai logikai.

PORTB ^ = 1<< PINB0
_delay_ms (100)

PADARYTA! Jūsų šviesos diodas mirksi pagal nustatytą greitį ... Paprasta, ar ne?




Pora: Kelių prietaisų nuotolinio valdymo grandinė Kitas: kintamosios srovės fazė, neutrali, žemės gedimo indikatoriaus grandinė