Raziskane osnove mikrokrmilnika

Preizkusite Naš Instrument Za Odpravo Težav





Pri mikrokontrolerjih je ena stvar odlična, saj so na voljo skoraj v vseh delih sveta in elektronskih prodajalcih.

Uvod

V bistvu se mikrokrmilne naprave pogosto uporabljajo v aplikacijah, ki vključujejo ocene okolja in v podobni elektroniki.



Te naprave lahko uporabljate za prikaz določenega parametra v aplikacijah za nadzor motorja, LED osvetlitvi, senzorjih različnih vrst, kot so senzor nagiba, merilnik pospeška, merilnik hitrosti, zapisovalniki podatkov, regulatorji temperature, tipkovnice itd.

Primarno razumevanje mikrokrmilnikov bi lahko dobili s sklicevanjem na mikrokrmilnik AVR Amega32, ki je tako napreden, da ga včasih imenujejo računalnik v čipu.



Ta naprava je dodeljena za izvajanje vrste ukazov za oblikovanje programa.

Jezik programa, ki bi ga videli tukaj, je C ++. Na tem tečaju se boste tega jezika naučili poglobljeno.

Ko gre za MCU-je, dobite možnost, da imate možnost nadzora in konfiguriranja vseh njegovih izrezov.

Če se s tem nekoliko utrudite, se samo ohladite, ker to sploh ni nič zapletenega, saj boste skozi vse vidike vztrajno, a trdno olajšani.

V čipu MCU se lahko vsi zatiči, razen Vdd in Vss, ki sta napajalna zatiča čipa, lahko dodelijo z izključnimi oznakami.

Podrobnosti o izrezkih

Če čip pogledate od zgoraj, boste našli majhno trikotno zarezo, ki označuje začetno točko, od koder se začnejo pinouti, šteje, da se št. 1 čipa začne tik pod to zarezo.

Od te zatiča boste našli 20 zatičev do dna na tej strani (levo) in še 20 zatičev na drugi strani (desno), ki se nadaljujejo od spodaj navzgor na desni strani.

Prvih 8 zatičev, ki se začnejo z zarezo, so PBO-7, ki tvorijo indeksne zatiče IC, saj se vsi programi tukaj začnejo z indeksom nič.

Zgornja serija pinov se imenuje PORT B, medtem ko obstajajo drugi enaki sklopi vrat, ki so dodeljeni od A do D.

Ta vrata so lahko dodeljena tako, da sprejemajo in prepoznajo podane podatke, imenovane INPUT, in tudi za prenos podatkov v določeni obliki, imenovani OUTPUT.

Dva zatiča, ki spadata v splošno kategorijo, sta zatiča (+) / (-), ki se imenujeta tudi Vdd in GND.

Na levi strani čipa na dnu je viden en zatič iz PORTA D (PDO-6).

PD7, ki je številka 7 v PORTU D, je mogoče izslediti samostojno in začeti na desni strani serije pinov.

Zdaj, ko nadaljujemo z desne strani čipa, kjer se PORT D konča, PORT C začne s štetjem navzgor v vrstnem redu.

Ti prispevajo k številnim zanimivim zatičem MCU, vse od analognih do digitalnih.

Ti zatiči so namenjeni zaznavanju vhodov za zaznavanje številnih parametrov prek zunanje nastavljenih analognih stopenj vezja.

Zgornji zatiči predstavljajo PORT A.

Analogno digitalno pretvorbo na zgornjih zatičih bi lahko razumeli s pomočjo primera, ko analogni nivo temperature, zaznan z običajnim senzorjem, kot je termistor, nanese na enega od zatičev PORT A, ki ga MCU takoj sprejme in pretvori ustvariti digitalni odčitek od nič do 255 stopinj F (8-bitna številka, ki jo je mogoče nadgraditi za doseganje 10-bitne izhodne vrednosti).

Druga značilnost, ki bi jo lahko videli tudi v MCU-jih, je razpoložljiv programski prostor ali pomnilnik, ki določa prostor za spremenljivke in program, določen za mikrokrmilnik.

Poleg tega imajo MCU-ji vgrajeno uro za štetje ustreznih parametrov.

Funkcije ure omogočajo MCU, da se uporabi za številne različne postopke štetja, ki so lahko hitri v območju mikrosekund, odvisno od specifikacije določene naprave, in lahko tudi počasnejši do želene mere.

Do zdaj ste morda do neke mere že razumeli koncept mikrokrmilnika in njegove priključke in zatiče.

Kako ustvariti priključek SPI od programerja do mikrokrmilnika

Zdaj je čas, da se malo poglobimo v to temo in raziščemo svet programiranja.

Glede na to moramo, preden se prepustimo postopku nalaganja programa v čip, najti ustrezen način za integracijo priključka SPI (serijski periferni vmesnik) z MCU.

Vendar tudi po tem ne moremo samo potisniti SPI v izrezke MCU, kajne? Prav tako ne moremo dovoliti, da se podaljšane žice iz SPI neposredno vstavijo v ploščo za kruh. To lahko povzroči tudi napačne nastavitve žic, povezane z nepravilnimi nožicami, ki povzročajo slabe povezave.

Da bi stvari postale popolnoma brezhibne, izvajamo postopke na drobni veroboardi, kjer dobimo potrebne spajalne kovinske zatiče, imenovane tudi 'glava', ki so spajkani. Te zatiče glave lahko zdaj uporabite za povezovanje s spojnikom SPI. Povezave iz te glave se lahko prekinejo z drugimi vzporednimi zatiči glave, ki se lahko uporabljajo za povezave na plošči.

Tako zgornji sklop zdaj tvori tesno in zanesljivo vmesno povezovalno platformo za SPI na MCU.

Do zdaj je vse videti lepo, popolno, zato nadaljujmo s zaslužkom s programatorjem, ki je potreben med vašim računalnikom in MCU-jem.

Lahko bi bilo veliko podjetij, ki izdelujejo in prodajajo te enote programerjev, zato vam nabava le-teh ne bi smela predstavljati težav, kot so Adafruit Industries, USBtinyISP ali Sparkfun itd.

Nekateri izmed njih bi se lahko povsem razlikovali od običajnih tipov, vendar imajo v bistvu vse enako in sledijo standardnim programskim pravilom in se lahko uporabljajo kot vmesnik med osebnim računalnikom in mikrokrmilnikom AVR.

Vendar se prepričajte, da če uporabljate kakšen drug MCU in ne AVR Atmega32, boste morda morali preveriti, ali obstaja ustrezen združljiv programer za ta čip MCU.

Opaziti je mogoče, da kar nekaj teh programerjev uporablja enake gonilnike, za kar je treba poskrbeti, o tem pa bomo izvedeli več v naslednjih poglavjih.

Povezava računalnika z mikrokrmilnim čipom je resnično osnovna in z veseljem bi vedeli, kako enostavni postopki so za to potrebni. Torej, takoj pritisnite gumb J

Izdelava zgoraj razložene vmesniške plošče SPI ni težavna, gre le za to, da vaš spajkalnik deluje skozi vse povezave na prikazanih dveh vrsticah glav zatičev na majhni splošni plošči.

Zgornja slika prikazuje podrobnosti o povezavi, ki bi jih morali upoštevati pri medsebojnem povezovanju žic med glavami.

Da bi bile stvari še enostavnejše, si oglejte naslednje podrobnosti o povezavi, tako da se sklicujete na zgornjo sliko:

Zatič SPI, ki se začne od zgoraj levo, gre na 'Master IN, Slave OUT' (MISO)

Zatič SPI od sredine levo se poveže z zatičem ure (SCK)

Zatič SPI v spodnjem levem kotu se poveže s ponastavitvijo. (O tem zatiču bomo podrobno izvedeli v naslednjih vadnicah)

SPI, ki se nanaša na spodnji desni del, pritrjen z zatičem GND MCU, GND se nanaša na zatič, ki tvori ničelno napajalno linijo ali negativno (relativno) tirnico dovoda.

SPI, ki se konča iz srednje desne glave, se poveže z zatičem 'Master Out, Slave IN' (MOSI) na MCU.

SPI, ki prihaja iz zgornje desne glave, je povezan z (+) MCU, kar je očitno Vdd ali pozitivni napajalni zatič MCU.

To je to.

Povežite oba konektorja, kot je opisano, in vmesniška plošča SPI je pripravljena na potrebna dejanja.

Za nadaljnjo pomoč si oglejte sliko, ki je prikazana zgoraj, vaša končna vmesniška plošča bi morala izgledati takole, ko bodo vse žične povezave ustrezno opravljene s pomočjo zgornje razprave.

Upam, da ste morda že ustvarili vmesnik SPI, kot je razloženo v prejšnji vadnici, in zdaj je čas, da zagotovimo, da bo naš računalnik sprejel programer, ki ga moramo vgraditi med računalnik in MCU.

Izdelava preproste programske kode za MCU

Za povezavo računalnika z mikrokrmilnikom vzamemo enoto USBTinyISP, ki jo ponuja Sparkfun.

Vemo, da bodo za vsak računalniški operacijski sistem, kot je Windows, potrebni gonilniki, brez katerih bi bilo nekoristno naložiti kar koli v računalnik, zato bo naš programer potreboval gonilnike za nalaganje v vaš računalnik.

Poglejmo postopke, ki so potrebni za namestitev gonilnikov v operacijski sistem vašega računalnika, tukaj bomo uporabili primer operacijskega sistema Windows 7 z 32-bitnimi ali 64-bitnimi specifikacijami.

Odprite sparkfun.com in kliknite »stran žepnega programerja AVR«. Povezavo je mogoče zlahka vizualizirati na strani.

Nato pod dokumenti poiščite »Gonilnik sistema Windows« in ga preprosto kliknite.

Tako boste dobili datoteko pocketprog-driver.zip v računalniku.

Pojdite v računalnik, poiščite mesto za prenos in preprosto razpakirajte preneseno datoteko v mapo.

Če je vaš računalnik 64-bitni OS, morate slediti še nekaj korakom, kot je navedeno spodaj, pri 32-bitnem OS pa lahko namestitev začnete neposredno iz razpakirane datoteke.

Za 64-bitno sledite tem, za 32-bitno pa preprosto prezrite:

Google 'libusb sourceforge' in kliknite na te povezave najnovejšo različico.

Naleteli bi na nekaj dodatnih datotek, vendar bi vas zanimala datoteka bib, to je: libusb-win32-bin - #. #. #. #. Zip

Zdaj pojdite in poiščite to mesto za prenos v računalniku, razpakirajte in shranite v eno od map.

V tej mapi se pomaknite po mapi bin in nadaljujte do mape amd64.

Tu bi videli nekaj map kot: ghcalled libusb0.dll in libusb0.sys.

Te bi želeli preimenovati kot: libusb0_x64.dll in libusb0_x64.sys.

Zdaj boste morali kopirati zgornje datoteke v mapo pocketprog-driver, preprosto prepisati datoteke v obstoječi različici.

Če želite namestiti zgornje gonilnike, bi vas zanimala naslednja metoda, ki je po vrsti precej nekonvencionalna:

Gre za način »dodajanje starejše strojne opreme«.

Kliknite 'Start Menu'

Nato nadaljujte z desnim klikom na 'računalnik'

Kliknite »Upravljanje« in na koncu še »Upravitelj naprav«

Nato v meniju izberite »Dodaj starejšo strojno opremo«

Nadaljujte s pritiskom na “next”, dokler se čarovnik ne vstavi

Po navodilih kliknite »Namesti strojno opremo, ki bi jo morali izbrati na naprednem seznamu«, to bo pozvalo ikono izbirnega gumba v to določeno izbiro. To je pravzaprav gumb za nadzor oken, ki bi bil zdaj videti kot majhen krog, ki ima v notranjosti okroglo modro datoteko.

Zdaj preprosto kliknite 'Naprej'

Prikaže se meni »Prikaži vse naprave«, ki ga boste morali klikniti.

Po tem nadaljujte s klikom na ikono »Have Disk«.

S pomočjo ikone »Prebrskaj« pojdite na mesto mape pocketprog-driver. Če ste pravilno izvedli izbor, bi vizualizirali datoteko pocketprog.inf, nameščeno v tej mapi.

Dvokliknite to datoteko in zagotovo boste priča, da se gonilnik namesti v vaš računalnik.

Nad in zunaj !! Nadaljujmo z naslednjo vadnico na naslednji strani.

Do zdaj ste morda že namestili potrebno programsko opremo in zgradili vmesnik SPI.

Kako prenesti program v čip mikrokrmilnika

Naslednji korak bo zahteval nekaj komponent, kot so plošča, LED in izračunani upor za predvideno uporabo.

V tem razdelku se bomo naučili preskusne metode programerja in potrdili namestitev ustreznih gonilnikov in programske opreme.

Da bi preverili, ali so bili gonilniki in programska oprema pravilno nameščeni, bomo izvedli preprost program, znan kot avrdude.

AVRdude je program, povezan z najnovejšo namestitvijo WinAVR, brez katerega dejanski prenos datoteke v MCU ne more biti mogoč.

Ta program je oblika datoteke .hex, ki MCU v bistvu postane razumljiva za zahtevane izvedbe.

Če preverjanje ne bo uspelo, programer ne bo mogel prenesti datoteke.

Hitro poglejmo, kako lahko izvedemo postopek testiranja s pomočjo naslednjih navodil:

Odprite poziv DOS (diskovni operacijski sistem), tako da kliknete »meni Start« in v dano iskalno polje vtipkate cmd.exe.

Zdaj lahko izvedbo AVRdude opravite tako, da preprosto vtipkate avrdude -c usbtiny -p m32 preko poziva DOS. Takoj ko bo to izvedeno, bo DOS takoj ugotovil, ali je bila povezava uspešna.

V zgornjem ukazu je »-c« opozorilna zastava, ki vključuje specifikacijo parametra programerja »usbtiny«, oznaka »-p« pa identificira mikrokrmilniško napravo (»m32 označuje Atmega32).

Če ste uporabili drugačen MCU, boste morali vključiti ustrezne predpone za izvedbo.

Ko je zgornji postopek končan, lahko preko poziva DOS vtipkate 'exit' in to vas bo premaknilo iz okna.

Če se resno sprašujete glede dejanskih podrobnosti programiranja, bi morali za to najprej spajkati in izdelati zunanje analogno vezje LED, prek katerega bi se program lahko izvajal, kajti če ni sistema za prepoznavanje odziva MCU, programiranje in delovanje mikrokrmilnika bi bilo povsem nesmiselno.

Izdelava LED plošče je zelo enostavna, gre za spajkanje dveh vodnikov LED nad kosom veroboarda in upor povežite z enim od vodnikov LED. Vloga te LED je le omejiti tok na LED, da ne bo zagorel zaradi previsoke napetosti ad toka iz izhoda MCU.

Vrednost upora lahko izračunamo po naslednji preprosti formuli:

R = (Ub - LEDfwd) / I

Kjer je Ub napajalna napetost, je LEDfwd optimalna delovna napetost uporabljene LED, I pa optimalni ojačevalnik.

Recimo, da uporabimo RDEČO LED, ki ima napetost LED naprej 2,5 V in tok I = 20 mA, zgornjo enačbo lahko rešimo na naslednji način:

Ker bi bila napetost MCU 5V, jo lahko izrazimo kot:

R = (5 - 2,5) /. 02 = 125 ohmov, ¼ vatov, najbližja vrednost je 120 ohmov.

Zdaj imamo LED, 120 ohmski upor in veroboard, zgoraj zgoraj povezane komponente, kot je prikazano na diagramu, preprosto povežemo z mikrokrmilnikom.

Ko je to končano, se lahko MCU programira za predvideni odziv na zgornji nastavljeni LED.

Sledi programiranje MCU.

Če želite mikrokrmilniku omogočiti izvedbo pomembnih izvedb, morate v MCU zapisati ustrezna navodila.

Kako namestiti programsko okolje in raziskati WinAVR

Za to bi verjetno lahko uporabili svoj lasten 'urejevalnik besedil' v svojem računalniku, čeprav bi bili morda hvaležni za uporabo bolj profesionalnega 'programskega okolja' namesto običajnega urejevalnika besedil, preprosto, ker bi vam ta pristop omogočil, da uživate v nekaterih vgrajene zanimive funkcije v tem paketu »programsko okolje«.

Podpiral bi ustvarjanje in urejanje programov v različnih jezikih ter jih tudi sestavljal v dobavljiv način, ki ga mikrokrmilniški čip zlahka razume in sprejme.

Končno bi to lahko podprl WinAVR in prenesel v zadevni čip MCU.

WinAVR je lahko opremljen tudi za izvajanje številnih drugih operacij, kot je odpravljanje težav s programi in opozarjanje na možno sintakso ter sestavljanje napak in napak. O teh bomo razpravljali v naših kasnejših vajah.

Potek namestitve WinAVR-ja bi bil zelo hiter in hiter. Poglobimo se v podrobnosti z naslednjimi točkami:

Najnovejše različice boste morali prenesti iz mape izvornih datotek WinAVR. Z njegove uradne spletne strani boste našli nekaj koristnih informacij, povezanih s tem prenosom.

Pozvani boste k varnostni poizvedbi, tako da boste lahko odgovorili, če želite, da se prenos izvede, to je zahteva, da je datoteka, ki jo želite prenesti, izvršljiva datoteka.

Prenesite datoteko in s klikom nanjo zaženite postopek izvajanja. Naj se namestitev začne.

Postopek vas bo vodil z nekaj vprašanji, na katera boste odgovorili, tako da boste lahko poenostavili namestitev po svojem udobju. Mnoge od njih bi radi prezrli na njihove privzete obrazce, vse bi bilo od vas, da izberete tiste, za katere menite, da so najbolj primerni za dejanja.

Do zdaj bi se vam zdelo vse povsem normalno in lahkotno in našli bi nekaj možnosti, ko sem v meniju Start nameščen proti vam. Brez skrbi, le nekateri od njih bi dejansko uporabljali samo enega izmed tem z imenom »beležnica programerjev«.

Ko kliknete to ikono, boste sprožili uporabniški vmesnik, da boste lahko uporabili pisanje programov (na primer ustvarjanje in urejanje). Prav tako boste priča programu, ki je sestavljen iz menijskih ukazov za pomoč pri sestavljanju kod in vdelavi v mikrokrmilnik.

Temeljna naloga zgornje beležnice programerja je pretvoriti človeško berljivo kodo, ki bi jo pisali, v vrsto navodil, razumljivih samo MCU.

Naslednja vadnica bo zajela testiranje zgornjega programerja, da bomo lahko prepričani o njegovi združljivosti z operacijskim sistemom Windows in ali se popolnoma »rokuje« z vašim mikrokrmilnikom IC.

Kako programirati MCU za vklop LED

Ko se to potrdi, bi nadaljevali z ustvarjanjem majhne kode 'ne naredi ničesar', da bi zagotovili, da postopek prenosa kode ne bo naletel na napake.

Seveda smo zdaj pripravljeni na izvajanje našega prvega programa znotraj MCU, toda pred tem bi bilo zanimivo na kratko povzeti, kaj smo naredili v prejšnjih vajah:

V skladu z zahtevano specifikacijo smo nabavili mikrokrmilnik AVR Atmel, za ilustracije pa smo uporabili ATMega32, nato pa smo se seznanili z osnovami mikrokrmilnika in enoto programerja, ki je odgovorna za prenos programa v čip MCU.

Nadalje smo izdelali vmesniški vtič SP, ki je bistvenega pomena, da lahko vaš računalnik povežete z mikrokrmilnikom za programiranje.

Po tem smo potrdili, ali so bili gonilniki pravilno nameščeni v računalnik tako za 32-bitni kot tudi za 64-operacijski sistem.

Nato smo namestili programsko okolje Win AVR za lažje pisanje prenosa oglasov kod v mikrokrmilnik, čemur je sledila izvedba avrdude za preverjanje programerja z računalnikom in medsebojno povezanim mikrokrmilnikom.

Nazadnje v prejšnjem poglavju smo zaključili z vezjem LED / upor in ga povezali z ustreznimi izhodi MCU.

To je res veliko dela, kljub temu je čas, da se takoj odpravite na nekaj pravih programskih stvari!

Za začetek bi radi razdelili mikrokrmilnik v tri kategorije, kar bi nam zelo poenostavilo razumevanje:

Nadzor, zaznavanje in komunikacija

Zanimivo bi bilo vedeti, da je mogoče zgoraj navedene funkcije programirati na različne načine.

V našem prvem programu bi poskušali naročiti mikrokrmilniku, da 'nadzoruje' zunanji parameter, ja, prav imate, to bi bila LED, ki smo jo zgradili pred kratkim.

Če smo natančni, bomo MCU rekli, naj vklopi priključeno LED, ja, vem, da je to videti precej primitivno, vendar mora biti začetna faza vedno enostavna.

Če nadaljujete s sedanjim delom, je upravljanje MCU z LED diodami pravzaprav precej preprosto:

Za to naročimo zatiču št. 0 na PORTU B, da proizvede potrebnih 5 V za LED.

Spomnimo se iz prejšnje vadnice, anodo LED smo priključili na zgoraj omenjeni zatič MCU.

Na ta zatič MCU je treba nasloviti dve bistveni stvari: 1) izhod in 2) 5 voltov

Spoznali bomo način, kako bomo določenemu zatiču ukazali, da postane izhod MCU-ja.

Ko je nastavljen kot izhod čipa, mu lahko naročimo, da je 'visok' (5 V) ali 'nizek' (0 V), kot je želeno za aplikacijo.

Ker je lahko katero koli logično vezje, kot je MCU, zatiči bodisi izhod ali vhod in jih je mogoče konfigurirati tako, da proizvajajo logično visoko ali logično nizko vrednost, je treba nožice dodeliti le tako, da so logično visoke ali logično nizke , ni nobenega vmesnega ali nedefiniranega stanja, razen teh nekaj stanj za mikrokrmilnike ali za katero koli digitalno IC. Tudi enako velja za vsak zatič MCU.

Kar zadeva dodelitve vhodnih in izhodnih zatičev, bi bili vhodi postavljeni tako, da sprejemajo signale z zunanjih analognih stopenj, medtem ko bi bili izhodi odgovorni za njihovo interpretacijo v določena logična stanja ali frekvenco.

Čeprav bi lahko zgornje naloge izvedli na več različnih načinov, bi zaradi enostavnosti razpravljali o eni od njih. Vendar je treba opozoriti, da čeprav je ta, ki bi bila predstavljena zdaj, videti enostavno in zanimivo, ni tako izvedljiva in ni priporočljiva vrsta za vse aplikacije MCU, iz istega razloga bi bili pozneje med tečajem seznanjeni z bolj priljubljenimi programskimi metodami . Ti programi bodo omogočili dodelitev samo želenih zatičev v skladu s specifikacijami, ne da bi to vplivalo na druge sosednje, ki bi bile morda že dodeljene za izvajanje nekaterih drugih funkcij.

Vendar se trenutno ne bomo toliko obremenjevali z drugimi zatiči in bi uporabili le ustrezne zanimive zatiče, da bi se v določeni meri izognili zapletom.

Za dodelitev pin-a kot izhoda moramo uporabiti Data Direction Register (DDR). Če se sprašujete, kaj pomeni tukaj register, je to preprosto prostor v MCU, ki omogoča mikrokrmilniku, da se odzove na določen način.

Z uporabo DDR-ja lahko nastavimo, da pin pošlje podatke, ki so podobni 'izhodu', ali pa sprejme podatke, ki so v obliki 'vhoda'.

Kljub temu, da ste glede besede zmedeni, kaj to pomeni? Podatki dodajo tretjo dimenzijo zatičem, ki jim je mogoče dodeliti neprekinjeno logično ničlo (0V) ali logično visoko (5V), kaj pa signali, ki se lahko hitro spreminjajo, na primer frekvenca impulzov. Frekvenco bi spremljale visoke in nizke logike (5V in 0V), ki nihajo z določenimi intervali ali obdobji, zato postane časovno usmerjena in jo je mogoče prilagoditi glede na čas, zato kot 'podatke' označujemo parameter, ki označuje funkcija glede na drugo funkcijo (logična stanja in čas).

En način dodelitve pin0 kot izhoda je zapisovanje naslednje kode:

DDRB = 0b00000001

V zgornjem programu DDRB pomeni Register podatkovnih smeri za PORT B ​​0b, da prevajalniku navodila glede naslednjega binarnega izraza števila, medtem ko »1« na koncu izraza označuje položaj pin0, to je njegovo lokacijo v obliki prvega zatiča PORTA B.

Če se spomnite, smo izvedeli, da PORT B ​​z njo povezuje 8 nožic (od 0 do pin7) in če opazite, da ima zgornja koda tudi 8 številk, kar pomeni, da vsaka številka pomeni teh 8 nožic PORTA B.

Zdaj bi bil naslednji postopek dodelitev 5V temu zatiču (pin0). Ponovno je načelo delovanja identično DDR, kot je navedeno zgoraj, izraženo z naslednjo binarno kodo:

PORTB = 0b00000001

Kot je razvidno, je edina razlika med zgornjo in prejšnjo kodo ta, da smo v tej kodi uporabili register PORT. Ta register posebej obravnava dodelitve nožic za ta vrata, za katera je nameščen znotraj MCU. Tako nam omogoča, da za te izrezke dodelimo prave podatkovne logike (0 ali 1).

Zdaj nas bo morda zanimalo nekaj o približnih podrobnostih našega programa. Ker vemo, da vsi programi zahtevajo določen prostor za začetek izvedbe, ga lahko primerjamo s kuharjem, ki pozna vse sestavine v zvezi z določenim receptom, vendar mu ni naročeno, kje začeti.

'Glavna' funkcija tukaj je mesto, kjer vsak od programov C / C ++ sproži izvedbo. Zato lahko glavni ustvarite kot:

int main (void)
{
}

Da pa lahko program interpretira podrobnosti o registrih DDR in PORT ter njihovo delovanje znotraj čipa MCU, je treba vključiti dodaten stavek, ki lahko vsebuje vse podatke v zvezi z AVR MCU. Morda bi radi to vključitev dodali v vse naše programe.

#include
int main (void)
{
}

Takoj, ko se prevajanje začne, se odsek predprocesorja prevajalnika osredotoči na imenik AVR, da identificira datoteko “io.h”. Pripona ».h« ​​tukaj označuje, da gre za datoteko z glavo in da bi bila ta koda znotraj datoteke uvedena na začetku (glava) izvorne datoteke, ki jo ustvarjamo, od tod tudi ime »header«.

Tukaj lahko v našo kodo vnesemo izjave DDR in PORT, ker bi dodajanje datoteke z glavo io.h prevajalnika usmerjalo k njim.

#include

int main (void)

{

DDRB = 0b00000001 // Nastavitev registra smeri podatkov Data0 na izhod in preostale nožice kot vhod

PORTB = 0b00000001 // Nastavite pin0 na 5 voltov

}

Zgoraj je določena usmeritev pin0 kot izhoda z magnitudo 5V. Vendar še vedno obstaja ena težava, ki ni določena za ta pin, to je, da ta pin še ni dobil vklopljenega za nedoločen čas, dokler je MCU vklopljen. Ta neskončna povratna zanka bi zagotovila, da se ta zatič MCU-ja ne izklopi, temveč nadaljuje z 5V izhodom za nedoločen čas.

Čeprav obstaja veliko različnih načinov uporabe navodil zanke za zatič, bi tukaj poskusili uporabiti zanko 'while'. Kot že ime pove, zanka 'while' mikrokrmilniku sporoča, da je 'medtem, ko je moč na voljo, treba ostati aktiven z dodeljenimi 5V za dodeljeni pinout.

#include

int main (void)

{

DDRB = 0b00000001 // Nastavitev registra smeri podatkov Data0 na izhod in preostale nožice kot vhod

PORTB = 0b00000001 // Nastavite pin0 na 5 voltov

medtem ko (1)

{

// Koda bi bila tukaj, če bi jo bilo treba izvajati znova in znova in znova ... neskončno

}

}

Morda boste želeli vedeti, da smo tukaj uporabili '1' v obliki argumenta za zanko 'while', saj bi lahko vse, razen '0', šteli za logično 'resnico'.

To pomeni, da upoštevanje zanke »while« nikoli ne bi bilo odgovorno za nič drugega, razen za logično »true«, kar pomeni, da bi se določen zatič za nedoločen čas zaskočil z navedenim stanjem.

Priča se, da LED dioda trajno sveti na dodeljenem zatiču, dokler ima MCU moč prek svojih Vdd in Vss.

To je to, zdaj imamo rezultat, ki smo si ga želeli doseči, in končno lahko vidimo, da se to dogaja po toliko trdega dela, vendar je kljub temu pogled na sladek rezultat našega trdega dela tako zadovoljiv.

V naslednjih vajah se bomo naučili, kako zgornji LED-diodi dodati dimenzijo »čas«, to je, kako utripati z določeno določeno hitrostjo.

Pravzaprav pri zgornji izvedbi LED dejansko utripa, vendar je hitrost zanke tako hitra, da je skoraj tako kot stalno vklopljeno LED osvetlitev.

Videli bomo, kako lahko to zanko po želji dodamo z zamikom, da bo LED utripal s to zakasnjeno hitrostjo.

Kako narediti utripanje LED z uporabo mikrokrmilnika AVR

V zadnji razpravi smo se naučili, kako preko mikrokrmilnika vklopiti LED-stikalo, bilo je izjemno, kajne? Mogoče ne toliko!

Tu se bomo naučili, kako popestriti zgornjo osvetlitev LED z dodeljevanjem dvosmerne funkcionalnosti, to pomeni, da bomo poskušali utripati ali utripati pri določeni frekvenci ali hitrosti. Videli bomo tudi, kako bi lahko to stopnjo povečali ali zmanjšali po želji uporabnika.

Oglejmo si to:

#include

#include

int main (void)

{

DDRB | = 1<< PINB0

medtem ko (1)

{

PORTB ^ = 1<< PINB0

_zakasnitev_ms (100)

}

}

Če se počutite zmedeno s temi čudnimi simboli (&, ^, | itd.), Uporabljenimi v zgornjem izrazu (& ni tam, vendar bi ga bilo mogoče uporabiti v drugih podobnih kodah), so tukaj povezane informacije, ki bi jih o tem zanimali. :

Vključuje številne standardne logične algoritme, kot so AND, OR, NOT in XOR, ki se običajno uporabljajo z zgornjo kodo.

Ti logični funkcionalnosti natančno primerjata dva bita '1' in '0' glede na dodeljene tabele resnic.

Idejo bomo dobili z analizo naslednje razporeditve bitov:

01001011 &
10001101
enako
00001001

V zgornji kodi & se nanaša na AND, kot se uporablja pri programiranju C.

Če vertikalno beremo vrstice, kaže, da je 0 in 1 enako 0, 1 in 0 enako tudi 0, 0 in 0 enako 0, 1 in 1 enako 1. Branje je tako preprosto. To so v skladu s tabelo resnic operaterja AND.

Če ocenimo naslednjo tabelo, označuje simbol '|' označuje uporabo funkcionalnosti 'ALI', '|' lahko najdete levo na levi strani »backspace« na tipkovnici računalnika:

01001011 |
10001101
enako
11001111

Ta razpredelnica resnic logične funkcije OR kaže, da so biti 0 ali 1 enaki 1, 1 ali 0 tudi 1, 0 ali 0 enako 0, medtem ko je 1 ali 1 enako 1.

Naslednja bitna kombinacija je za logični operater XOR, označen s ^, in ga lahko preučimo tako kot pri tablicah resnic AND, OR:

01001011 ^
10001101
enako
11000110

Zdaj pa nadaljujmo s prvim programom in se naučimo, kaj pomeni naslednja vrstica v njem:

#include

Iz naših prejšnjih vadnic vemo, kako deluje izraz, zato ga ne bomo ponavljali, vendar se zdi, da gre za novo 'vključitev', izraženo z #include, ki jo je treba raziskati.

V to 'vključi' delay.h nam omogoča nekaj preprostih načinov izvedbe.

Kot že ime pove, delay.h nam omogoča, da povzročimo zamudo pri določenem programu.

Naslednji izraz int main (void) bi lahko izpustil iz tekoče razprave, saj smo to že pokrili v prejšnjih objavah.

Sledi spremenjeni DDRB.

V nadaljevanju je prikazan prejšnji obrazec, ki ni boljši način dodeljevanja zatičev, saj so bili vsi zatiči od 0 do 7 preklopljeni za oblikovanje vhodov. Toda samo predstavljajte si, kakšen bi bil položaj, če bi želeli ustvariti daljši program, ki zahteva te zatiče za kakšno drugo funkcionalnost? Na primer pin2 bi lahko bil potreben za daljinsko preklapljanje naprave. V tem primeru ne bi želeli dodeliti istega kot vnos samo s poskusi in napakami. To lahko pomeni napačen odziv daljinskega oddajnika na sprejemnik naprave.

DDRB = 0b00000001

Raje želimo vplivati ​​samo na en bit, na pin0 bit, in pogledati funkcionalnost 'ALI', ki bi jo lahko izvedli z binarnim maskiranjem.

DDRB = DDRB | 0b00000001

Tu je zastrta z masko 'ALI': 0b00000001, čeprav se zdi, da gre za verodostojno binarno številko, v primeru, da bi prejšnja DDRB, na primer: 0b01001010, potem z uporabo OR z maskiranjem lahko dala: 0b01001010 | 0b00000001 = 0b01001011.

Nastala razlika, kot bi lahko bila priča, je le pri pin0, katerega biti so se spremenili!

Z nadaljnjim stiskanjem zgornje izjave prek C ++ dobimo:

DDRB | = 0b00000001

Vendar ugotavljamo, da je v danem programu še več. Čeprav se morda zdi povsem legitimno in očitno, bi morali izkoristiti nekatere izjave iz datoteke z glavo io.h, še posebej, če je v osnovi ustvarjena za naše udobje?

Torej, če je “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.

Začnemo torej z 0b00000000 in postavimo '1', da dobimo 0b0000001, nato pa jo prenesemo v leve 0 položaje, kar daje popolnoma enak 0b00000001 kot zgoraj.

Če bi domnevali, da gre za PINB4, bi lahko izjavo izrazili kot 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Pazimo, da uporabljamo ničelni indeks, kar pomeni, da so po »1« štiri ničle.

Zdaj nadaljujemo do zanke »while«, ki smo jo prej opazili čez »neskončno zanko«. Morda pa zdaj želimo, da mikrokrmilnik izvede nekaj želenih izvedb. To je mogoče le znotraj dane zanke. To je zanka, kjer se določeno zaporedje znova in znova ponavlja.

Če bi bila izvedba postavljena pred zanko, bi se izvedla samo enkrat.

Da bi LED neomejeno utripala, bi bilo treba PINB0 izmenično vklopiti / izklopiti znotraj zanke. Tu najdemo tudi uvedene zamude, brez katerih utripanje LED ne bi bilo mogoče. Toda to bi prisililo LED, da utripa zelo hitro, kar je težko prepoznati s prostim očesom, zato bi se moralo nekoliko upočasniti, da bi se prepoznalo z našimi očmi.

Zavedamo se postopka nastavitve določenega bita v binarnem številu, vendar nismo prepričani o načinu uporabe določenega bita '0', če je še '1'.

Videti je mogoče, da to počne naslednji program, vendar bomo ugotovili tudi, da v programu morda ni viden.

Začetna dva stavka spremenita bit v »1« (5 V, LED lučke), nato se uvede premor za 100 ms.

Naslednjih nekaj vrstic spremeni bit PINB0 v '0' (ničelna napetost, LED izklopljen), žal pa primerjava AND ne bo mogla izvesti '0' iz bita, če pa uporabimo NOT '~' za binarno masko lahko preklopi vse 0 na 1 in obratno.

Tako bomo lahko vplivali samo na bit PINB0 in ga preusmerili na '0'. Oklepaj je bil vključen, da je vseboval izvedbo maskiranja, tako da se je operacija NOT lahko uporabila za celotne maske in ne zgolj nad '1' pred levim premikom '<<”.

PORTB | = 1<< PINB0
_zakasnitev_ms (100)
PORTB & = ~ (1<< PINB0)
_zakasnitev_ms (100)

Da bi ustvarili zamude ON OFF ali obdobja enakega trajanja, lahko prejšnje štiri vrstice presečemo na dve in uporabimo XOR funkcionalnost v našo korist. Upoštevati je treba, da je pri izvedbi XOR dodeljen zatič 1, če je 0, in obratno. Ta izvedba bi vplivala samo na PINB0. Kot se lahko zgodi, da se ukaz uporabi, bi bit preprosto spremenil v nasprotje obstoječe logike.

PORTB ^ = 1<< PINB0
_zakasnitev_ms (100)

KONČANO! Vaša LED bi zdaj utripala po nastavljeni hitrosti ... Preprosto, kajne?




Prejšnja: Vezje daljinskega upravljanja več naprav Naprej: Faza izmeničnega toka, nevtralno, vezje indikatorja zemeljske napake