Mikrokontrollerin perusteet tutkittu

Kokeile Instrumenttia Ongelmien Poistamiseksi





Yksi asia on hieno mikrokontrolleri-IC: stä, joita on saatavilla melkein kaikkialla maailmassa ja sähköisissä vähittäiskauppiaissa.

Johdanto

Pohjimmiltaan mikrokontrollerilaitteita käytetään yleisesti sovelluksissa, joissa arvioidaan ympäröivää ympäristöä, ja vastaavassa elektroniikassa.



Näitä laitteita voidaan käyttää tietyn parametrin näyttämiseen moottorinohjaussovelluksissa, LED-valaistuksessa, erityyppisissä antureissa, kuten kallistustunnistimessa, kiihtyvyysanturissa, nopeusmittarissa, tiedonkerääjissä, lämpötilan säätimissä, näppäimistöissä jne.

Ensisijainen käsitys mikro-ohjaimista voitaisiin saada viittaamalla AVR Amega32 -mikro-ohjaimeen, joka on niin edistynyt, että joskus sitä kutsutaan tietokoneeksi sirussa.



Tämä laite on määrätty suorittamaan komentosarjoja ohjelman muodostamiseksi.

Ohjelman kieli, jonka näet täällä, on C ++. Opit tämän kielen syvemmälle täällä olevalla kurssilla.

Kun kyseessä on MCU, saat mahdollisuuden hallita ja konfiguroida kaikkia sen pinouteja.

Jos olet väsymässä hieman tähän, vain kylmä, koska se ei ole mitään monimutkaista, sinut helpotetaan kaikkien näkökohtien kautta tasaisesti, mutta tiukasti, kun etenemme.

MCU-sirussa kaikki nastat, lukuun ottamatta Vdd: tä ja Vss: ää, jotka ovat sirun tehonastat, voidaan osoittaa yksinoikeudella.

Pinoutin tiedot

Jos vilkaisit sirua ylhäältä, löydät pienen kolmiomaisen loven, joka osoittaa aloituskohdan siitä, mistä pinouts alkaa laskea, että sirun # 1 tappi alkaa juuri tämän loven alapuolelta.

Tästä nastasta alkaen löydät 20 nastaa alareunaan tältä sivulta (vasemmalta) ja vielä 20 nastaa toiselta puolelta (oikealta) jatkaen alhaalta ylös oikealle puolelle.

Ensimmäiset lovesta alkavat 8 nastaa ovat PBO-7, jotka muodostavat IC: n hakemistotapit, koska kaikki tässä olevat ohjelmat alkavat indeksinollasta.

Yllä olevaa pinouts-sarjaa kutsutaan PORT B: ksi, kun taas muita identtisiä porttisarjoja on osoitettu A: sta D: hen.

Nämä portit voidaan osoittaa hyväksymään ja tunnistamaan syötetty data nimeltä INPUT, ja myös lähettämään tietoja jossakin määrätyssä muodossa nimeltä OUTPUT.

Kaksi nastaista, jotka kuuluvat yleiseen luokkaan, ovat (+) / (-) nastat, joihin viitataan myös nimellä Vdd ja GND.

Yksi PORT D: n tappi (PDO-6) voidaan nähdä sijoitettuna sirun vasemmalle puolelle alaosaan.

PD7, joka on PORT D: n tappi # 7, voidaan jäljittää seisomaan yksin ja aloittamalla pinouts-sarjan oikeanpuoleinen sarja.

Nyt siirtymällä sirun oikealta puolelta, missä PORT D loppuu, PORT C aloittaa laskemisen ylöspäin järjestyksessä.

Nämä edistävät MCU: n monia mielenkiintoisia nastoja analogisista digitaalisiin.

Näistä nastoista tulee tunnistustuloja monien parametrien havaitsemiseksi ulkoisesti konfiguroitujen analogisten piirien vaiheiden kautta.

Yllä olevat nastat muodostavat PORT A.

Analogia-digitaalimuunnos yllä olevien nastojen yli voitaisiin ymmärtää esimerkin avulla, jossa tavallisella anturilla, kuten termisterillä, havaittu analoginen lämpötilataso kohdistetaan yhteen PORT A -nastoista, jotka MCU hyväksyy ja muuntaa helposti tuottaa digitaalinen lukema nollasta 255 asteeseen F (8-bittinen luku, joka voitaisiin päivittää 10-bittisen ulostulon saavuttamiseksi).

Toinen piirre, joka voidaan todeta MCU: issa, on käytettävissä oleva ohjelmointitila tai muisti, joka määrittää tilan mikrokontrollerille määritetyille muuttujille ja ohjelmalle.

Tämän lisäksi MCU: lla on sisäänrakennettu kello, joka on osoitettu laskemaan asiaankuuluvat parametrit.

Kellotoiminnot mahdollistavat MCU: n itsensä soveltamisen moniin erilaisiin laskentaprosesseihin, jotka voivat olla nopeita mikrosekuntien alueella riippuen tietyn laitteen spesifikaatiosta, ja voivat myös olla hitaampia missä tahansa halutussa laajuudessa.

Tähän mennessä olet ehkä ymmärtänyt mikrokontrollerin käsitteen jossain määrin ja sen porttien ja nastojen suhteen.

SPI-liittimen luominen ohjelmoijasta mikrokontrolleriin

Nyt on aika mennä hieman syvemmälle aiheeseen ja tutkia ohjelmoinnin maailmaa.

Tämän jälkeen meidän on löydettävä oikea tapa integroida SPI (Serial Peripheral Interface) -liitin MCU: hon, ennen kuin aloitamme ohjelman latausprosessin sirulle.

Jopa tämän jälkeen emme voi vain työntää SPI: tä MCU-nastoihin, vai mitä? Emme voi myöskään sallia, että SPI: n laajennetut johdot työnnetään suoraan leipälevyyn. Tämä voi myös aiheuttaa väärän johtojen asennuksen, kun väärät nastat tekevät huonoja yhteyksiä.

Siksi, jotta asiat olisivat täysin moitteettomia, teemme menettelyt pienellä verilaudalla, jossa saamme tarvittavat yhdistävät metallinastat, joita kutsutaan myös juotettaviksi 'otsikoiksi'. Näitä otsikkotappeja voitiin nyt käyttää yhteyden muodostamiseen SPI-liittimeen. Tämän otsikon yhteydet voidaan päättää toiseen rinnakkaiseen otsikkotapiin, joita voidaan käyttää leipälautan liitäntöihin.

Siten yllä oleva kokoonpano muodostaa nyt mukavan ja luotettavan väliliitäntäalustan SPI: lle MCU: lle.

Uptil nyt kaikki näyttää hyvältä mainokselta täydellisesti, joten siirrytään ansaitsemaan ohjelmoijan suhteen, jota vaaditaan tietokoneen ja MCU: n välillä.

Voisi olla joukko yrityksiä, jotka valmistavat ja myyvät näitä ohjelmoijayksiköitä, joten niiden hankkimisen ei pitäisi olla sinulle ongelma, kuten Adafruit Industries, USBtinyISP tai Sparkfun jne.

Muutama näistä voi näyttää täysin erilaiselta kuin perinteiset tyypit, mutta periaatteessa kaikki on identtistä ja noudattaa tavanomaisia ​​ohjelmointisääntöjä, ja niitä voidaan käyttää liitäntänä tietokoneen ja AVR-mikrokontrollerin välillä.

Varmista kuitenkin yhdestä ajattelusta, että jos käytät jotain muuta MCU: ta etkä AVR Atmega32, sinun on ehkä tarkistettava vastaavan yhteensopiva ohjelmoija kyseiselle MCU-sirulle.

Voidaan havaita, että melko monet näistä ohjelmoijista käyttävät identtisiä ohjaimia, jotain on huolehdittava ja opimme siitä lisää seuraavissa luvuissamme.

Tietokoneesi liittäminen mikrokontrollerisiruun on todella yksinkertaista, ja olisit iloinen tietäessäsi, kuinka yksinkertaisia ​​prosessit tähän vaaditaan. Joten painetaan nappia hetiJ

Edellä selitetyn SPI-liitäntäkortin tekeminen ei ole vaikeaa, vaan kyse on siitä, että juotin saa toimimaan läpi kaikki liitännät esitettyjen kahden otsikkorivin kautta pienellä yleiskäyttöisellä levyllä.

Yllä olevassa kuvassa on yhteystiedot, joita sinun on noudatettava kytkettäessä johtoja otsikoiden väliin.

Jotta asiat olisivat vielä yksinkertaisempia, käymme läpi seuraavat yhteystiedot samalla tavalla viittaamalla yllä olevaan kuvaan:

SPI-tappi ylhäältä vasemmalta menee “Master IN, Slave OUT” (MISO)

SPI-tappi vasemmalta keskeltä yhdistyy kellotappiin (SCK)

Vasemmassa alakulmassa oleva SPI-nasta liittyy Reset-tilaan. (Opimme yksityiskohtaisesti tästä nastasta seuraavissa opetusohjelmissa)

SPI, joka on oikeassa alakulmassa, kiinnittyy MCU: n GND-tapiin, GND viittaa tapiin, joka muodostaa syöttöjohdon nollan tai negatiivisen (suhteellisen) kiskon.

SPI, joka päättyy oikeanpuoleisesta keskikohdasta, liittyy MCU: n ”Master Out, Slave IN” (MOSI) -tappiin.

SPI, joka tulee ulos oikeasta yläkulmasta, on kytketty MCU: n (+): n kanssa, mikä on ilmeisesti MCU: n Vdd tai positiivinen syöttötappi.

Se siitä.

Liitä kaksi liitintä ohjeiden mukaan ja SPI-liitäntäkortti on valmis tarvittaviin toimiin.

Lisäapua varten saat lisätietoja yllä olevasta kuvasta. Lopullisen liitäntäkorttisi pitäisi näyttää tältä, kun kaikki johdot on tehty asianmukaisesti yllä olevan keskustelun avulla.

Toivon, että olet ehkä jo rakentanut SPI-käyttöliittymän edellisessä opetusohjelmassa kuvatulla tavalla, ja nyt on aika varmistaa, että tietokoneemme hyväksyy ohjelmoijan, joka meidän on integroitava tietokoneen ja MCU: n välille.

Yksinkertaisen ohjelmointikoodin tekeminen MCU: lle

Otamme Sparkfunilta saatavan USBTinyISP-yksikön tietokoneen linkittämiseksi mikrokontrolleriin.

Tiedämme, että mikä tahansa tietokoneen käyttöjärjestelmä, kuten Windows, vaatii ajureita, ilman joita ei olisi mitään hyötyä ladata mitään tietokoneeseen, joten ohjelmoijamme tarvitsee ohjaimia ladatakseen tietokoneellesi.

Tarkastellaan ohjainten asentamiseen tarvittavia menettelyjä tietokoneesi käyttöjärjestelmään. Otetaan tässä esimerkki Windows 7 -käyttöjärjestelmästä, jossa on joko 32- tai 64-bittiset tekniset tiedot.

Avaa sparkfun.com ja napsauta “AVR-ohjelmointisivun tasku”. Linkki voidaan helposti visualisoida sivun sisällä.

Etsi seuraavaksi ”Windows-ohjain” asiakirjoista ja napsauta sitä.

Tämä antaa sinulle pocketprog-driver.zip -tiedoston tietokoneellesi.

Mene tietokoneellesi, etsi lataussijainti ja pura ladattu tiedosto vain kansioon.

Jos tietokoneesi on 64-bittinen käyttöjärjestelmä, sinun on suoritettava vielä muutama vaihe alla annettujen ohjeiden mukaisesti. 32-bittisen käyttöjärjestelmän kanssa voit aloittaa asennuksen suoraan puretusta tiedostosta.

Seuraa 64-bittisiä näitä, 32-bittinen yksinkertaisesti ohita:

Google 'libusb sourceforge' ja napsauta tätä linkkiä uusin versio.

Löydät muutamia muita tiedostoja, mutta olisit kiinnostunut löytämään ruokalapputiedoston, eli libusb-win32-bin - #. #. #. #. Zip

Mene nyt ja etsi tämä latauspaikka tietokoneeltasi, pura se ja tallenna se johonkin kansioista.

Siirry tähän kansioon roskakorikansion yli ja jatka amd64-kansioon.

Näet muutaman kansion täällä: ghcalled libusb0.dll ja libusb0.sys.

Haluat nimetä nämä uudelleen: libusb0_x64.dll ja libusb0_x64.sys.

Nyt sinun on kopioitava yllä olevat tiedostot pocketprog-driver-kansioon, yksinkertaisesti korvaa nykyisen version tiedostot.

Edellä mainittujen ohjaimien asentaminen kiinnostaa sinua seuraavalla tavalla, joka on tyypiltään epätavanomainen:

Se on 'lisää vanha laite' -tila.

Napsauta Käynnistä-valikkoa

Jatka sitten napsauttamalla hiiren kakkospainikkeella 'tietokone'

Napsauta 'Hallitse' ja lopuksi 'Laitehallinta'

Valitse seuraavaksi valikosta 'Lisää vanha laite'

Jatka painamalla “seuraava”, kunnes ohjattu toiminto lisätään

Napsauta ohjeita ja napsauta 'Asenna laitteisto, joka sinun on valittava Lisäasetukset-luettelosta'. Tämä kehottaa valintanappikuvaketta kyseiseen valintaan. Se on itse asiassa Windowsin ohjauspainike, joka näyttää nyt pieneltä ympyrältä, jonka sisällä on pyöristävän sininen viila.

Napsauta nyt 'Seuraava'

Tämä näyttää 'Näytä kaikki laitteet' -valikon, jota sinun on napsautettava.

Napsauta tämän jälkeen 'Levy' -kuvaketta.

Siirry 'Selaa' -kuvakkeen avulla eteenpäin pocketprog-driver-kansion sijaintiin. Jos olet tehnyt valinnan oikein, visualisoit kyseiseen kansioon sijoitetun pocketprog.inf-tiedoston.

Kaksoisnapsauta tätä tiedostoa ja näet varmasti ohjaimen asentamisen tietokoneellesi.

Yli ja ulos!! Aloitetaan seuraavasta opetusohjelmasta seuraavalla sivulla.

Tähän mennessä olet ehkä asentanut tarvittavan ohjelmiston ja rakentanut SPI-käyttöliittymän.

Kuinka siirtää ohjelma mikrokontrolleri-sirulle

Seuraavassa vaiheessa vaaditaan muutama komponentti, kuten leipälauta, LED ja laskettu vastus aiottua sovellusta varten.

Tässä osassa opitaan ohjelmoijan testausmenetelmä ja vahvistetaan asiaankuuluvien ohjainten ja ohjelmiston asennus.

Sen varmistamiseksi, että ohjaimet ja ohjelmisto on asennettu oikein, toteutamme yksinkertaisen avrdude-ohjelman.

AVRdude on viimeisimpään WinAVR-asennukseen liittyvä ohjelma, jota ilman tiedoston todellinen siirto MCU: han ei ole mahdollista.

Tämä ohjelma on .hex-tiedostomuoto, joka tulee olennaisesti MCU: n ymmärrettäväksi vaadittujen suoritusten yhteydessä.

Jos vahvistus ei onnistu, ohjelmoija ei pysty siirtämään tiedostoa.

Katsotaanpa nopeasti, kuinka testausmenettely voidaan toteuttaa seuraavien ohjeiden avulla:

Avaa DOS (Disk -käyttöjärjestelmä) -kehote napsauttamalla Käynnistä-valikkoa ja kirjoittamalla cmd.exe annettuun hakukenttään.

Nyt AVRdude voidaan suorittaa kirjoittamalla avrdude –c usbtiny –p m32 DOS-kehotteen päälle. Heti kun tämä on toteutettu, DOS tunnistaa välittömästi, onnistuiko yhteys.

Yllä olevassa komennossa '-c' on ilmoituslippu, joka sisältää 'usbtiny' -ohjelmoijan parametrimäärityksen, kun taas '-p' -tunniste tunnistaa mikro-ohjaimen ('m32 ilmaisee Atmega32: n).

Jos olet käyttänyt eri MCU: ta, sinun on sisällytettävä toteutukseen tarvittavat etuliitteet.

Kun yllä oleva toimenpide on valmis, voit kirjoittaa DOS-kehotteeseen 'exit', mikä siirtää sinut ulos ikkunasta.

Jos mietit vakavasti ohjelmoinnin todellisia yksityiskohtia, meidän on ensin juotettava ja rakennettava ulkoinen analoginen LED-piiri, jonka yli ohjelma voidaan toteuttaa, koska ellei ole järjestelmää, joka kuittaa MCU: n vastauksen, ohjelmointi ja mikro-ohjaimen käyttö olisi melko merkityksetöntä.

LED-levyn tekeminen on hyvin yksinkertaista, kyse on LEDin kahden johtimen juotoksesta palalaudan päälle ja kytke vastus yhteen LEDin johtimesta. Tämän LED: n tehtävänä on rajoittaa virtaa vain LEDiin, jotta se ei palaisi MCU-lähdöstä tulevan ylijännitteen vuoksi.

Vastuksen arvo voidaan laskea käyttämällä seuraavaa yksinkertaista kaavaa:

R = (Ub - LEDfwd) / I

Missä Ub on syöttöjännite, LEDfwd on käytetyn LEDin optimaalinen käyttöjännite ja I on sen optimaalinen ampeeri.

Oletetaan, että käytämme PUNAISTA LEDiä, jonka LED-lähtöjännite = 2,5 V ja virta I = 20 mA, yllä oleva yhtälö voidaan ratkaista seuraavasti:

Koska MCU: n jännite olisi 5 V, se voidaan ilmaista seuraavasti:

R = (5 - 2,5) /. 02 = 125 ohmia, ¼ wattia, lähin arvo on 120 ohmia.

Nyt meillä on LED, 120 ohmin vastus ja veropöytä, yhdistä yksinkertaisesti yllä olevat komponentit kaavion mukaisesti mikrokontrolleriin.

Kun tämä on tehty, MCU voidaan ohjelmoida aiottua vastausta varten yllä olevaan LED-asetukseen.

Seuraavaksi MCU: n ohjelmointi.

Jotta mikro-ohjain voisi suorittaa mielekkäitä toteutuksia, on välttämätöntä kirjoittaa asianmukaiset ohjeet MCU: han.

Kuinka asentaa ohjelmointiympäristö ja tutkia WinAVR

Tätä varten voisimme todennäköisesti käyttää omaa 'tekstieditoria' tietokoneellamme, vaikka ehkä meistä arvostaa ammattimaisemman 'ohjelmointiympäristön' käyttöä tavallisen tekstieditorin sijasta, yksinkertaista, koska tämä lähestymistapa antaisi sinun nauttia sisäänrakennettuja mielenkiintoisia ominaisuuksia tässä 'ohjelmointiympäristö' -paketissa.

Se tukisi ohjelmien luomista ja muokkaamista eri kielillä ja kääntäisi ne myös toimitettavaan tilaan, jonka mikrokontrollerisiru helposti ymmärtää ja hyväksyy.

Lopulta WinAVR tukee tätä ja siirtää asianomaiselle MCU-sirulle.

WinAVR voidaan myös varustaa suorittamaan monia muita toimintoja, kuten ohjelmien vianmääritys ja varoitus mahdollisesta syntaksista sekä virheiden ja virheiden kokoamisesta. Keskustelemme näistä myöhemmistä opetusohjelmistamme.

WinAVR: n asennuskurssi olisi erittäin nopea ja nopea. Sukelletaan yksityiskohtiin seuraavilla seikoilla:

Sinun on ladattava uusimmat versiot WinAVR source forge -tiedostokansiosta. Löydät hyödyllisiä tietoja, jotka liittyvät tähän lataukseen sen virallisella verkkosivustolla.

Sinua pyydetään turvakyselyyn, jotta voit vastata, jos haluat, että lataus tapahtuu, kysytään, ladattava tiedosto on suoritettava tiedosto.

Lataa tiedosto ja aloita suoritusprosessi napsauttamalla sitä. Anna asennuksen alkaa.

Prosessi opastaa sinua vastaamaan joihinkin vastaamiin kysymyksiin, jotta pystyt virtaviivaistamaan asennusta mukavuutesi mukaisesti. Haluat jättää huomiotta monet näistä oletuslomakkeissaan, sinun kaikkien on valittava ne, jotka mielestäsi sopivat parhaiten toimintoihin.

Tähän asti olet löytänyt kaiken melko normaalia ja helppoa ja löytänyt muutaman vaihtoehdon, että aloitusvalikko heitetään sinulle. Ei hätää, vain osa näistä käyttäisi tosiasiassa vain yhtä nimeltään “ohjelmoijien muistikirja”.

Kun napsautat tätä kuvaketta, se käynnistää käyttöliittymän, jotta voit pystyä soveltamaan ohjelmien kirjoittamista (kuten luominen ja muokkaaminen). Voit myös nähdä ohjelman, joka koostuu valikkokomennoista koodien kokoamisessa ja upottamisessa mikrokontrolleriin.

Yllä olevan ohjelmoijan muistilehden perustyö on muuttaa ihmisen luettavissa oleva koodi, jonka kirjoitat, sarjaksi ohjeita, jotka ovat ymmärrettävissä vain MCU: lle.

Seuraava opetusohjelma kattaa yllä olevan ohjelmoijan testauksen, jotta voimme olla varmoja sen yhteensopivuudesta Windowsin kanssa ja 'kätteleekö se täydellisesti mikrokontrolleri IC: täsi.

Kuinka ohjelmoida MCU LEDin kytkemiseksi päälle

Kun tämä on vahvistettu, jatkamme pienen 'Älä tee mitään' -koodin luomista vain varmistaaksemme, että koodinsiirtomenettelyssä ei esiinny virheitä.

Tietenkin olemme nyt valmiita toteuttamaan ensimmäisen ohjelmamme MCU: n sisällä, mutta ennen sitä olisi mielenkiintoista tiivistää nopeasti, mitä teimme aikaisempien opetusohjelmien aikana:

Hankimme AVR Atmel -mikro-ohjaimen vaaditun määrittelymme mukaisesti, tässä olemme käyttäneet ATMega32-mallia kuviin. Seuraavaksi opimme mikrokontrollerin perusteista ja ohjelmointiyksiköstä, joka on vastuussa ohjelman siirtämisestä MCU-sirulle.

Rakensimme edelleen SP-liitäntäliittimen, joka on välttämätön, jotta tietokoneesi voidaan yhdistää mikrokontrolleriin ohjelmointitoimintoja varten.

Tämän jälkeen vahvistimme, oliko ajurit asennettu oikein tietokoneeseen 32-bittiselle ja 64-bittiselle käyttöjärjestelmälle.

Seuraavaksi asensimme Win AVR -nimisen ohjelmointiympäristön helpottamaan koodien siirtämistä mikrokontrolleriin, minkä jälkeen toteutettiin avrdude ohjelmoijan varmistamiseksi PC: lläsi ja yhdistetyllä mikrokontrollerilla.

Lopuksi edellisessä luvussa saimme valmiiksi LED / vastuspiirin rakentamisen ja liitimme sen asiaankuuluviin MCU-lähtöihin.

Se on paljon työtä, vaikka onkin aika mennä heti todellisiin ohjelmointikavaroihin!

Aluksi haluaisimme jakaa mikro-ohjaimen kolmeen luokkaan, mikä yksinkertaistaisi ymmärrystämme paljon:

Ohjaus, tunnistus ja viestintä

Olisi mielenkiintoista tietää, että yllä olevat toiminnot voidaan ohjelmoida monin eri tavoin.

Ensimmäisessä ohjelmassa yritämme tilata mikro-ohjaimen 'ohjaamaan' ulkoista parametria, kyllä, olet oikeassa, se olisi äskettäin rakennettu LED.

Tarkemmin sanottuna käskemme MCU: ta kytkemään kytketty LED päälle, kyllä ​​tiedän, että tämä näyttää melko alkeelliselta, mutta aloitusvaiheen on aina oltava helppo.

Nykyisen työn eteneminen, jolloin MCU ohjaa LEDiä, on itse asiassa melko yksinkertaista:

Tätä varten käskemme PORT B: n nastaa # 0 tuottamaan vaadittu 5 V LEDille.

Palautetaan edellisestä opetusohjelmasta, yhdistimme LEDin anodin MCU: n edellä mainittuun tapiin.

Tälle MCU-nastalle on osoitettava kaksi olennaista asiaa: 1) lähtö ja 2) 5 volttia

Opimme tapan, jolla voimme ohjeistaa tietyn nastan tulemaan MCU: n lähdöksi.

Kun se on asetettu sirun lähdöksi, voimme ohjeistaa sen olevan joko 'korkea' (5 V) tai 'matala' (0 ​​V), kuten sovellukselle halutaan.

Koska mikä tahansa logiikkapiiri, kuten MCU, nastat voivat kuihtua lähdön tai tulon ja ne voidaan konfiguroida tuottamaan joko logiikan korkea tai logiikan matala, nastat on vain osoitettava joko loogisesti korkeiksi tai loogisesti mataliksi , ei ole muita välitiloja tai määrittelemättömiä tiloja kuin nämä pari tilaa mikrokontrollereille tai mille tahansa digitaaliselle IC: lle. Sama pätee myös kaikkiin MCU-nastoihin.

Mitä tulee tulo- ja lähtönippien määrityksiin, tulot sijoitettaisiin vastaanottamaan signaaleja ulkoisista analogisista vaiheista, kun taas lähdöt vastaavat niiden tulkinnasta määriteltyihin loogisiin tiloihin tai taajuuteen.

Vaikka yllä olevat tehtävät voitaisiin tehdä monilla eri tavoilla, keskustelemme niistä yhdestä yksinkertaisuuden vuoksi. On kuitenkin huomattava, että vaikka nyt esiteltävä näyttää helpolta ja mielenkiintoiselta, se ei ole niin toteuttamiskelpoinen eikä suositeltava tyyppi kaikille MCU-sovelluksille, samasta syystä sinut tutustutaan suosittuihin ohjelmointimenetelmiin myöhemmin kurssilla . Nämä ohjelmat sallivat vain haluttujen nastojen osoittamisen teknisten tietojen mukaan vaikuttamatta muihin vierekkäisiin, jotka mahdollisesti jo voidaan osoittaa suorittamaan joitain muita toimintoja.

Tällä hetkellä emme kuitenkaan vaivaudu muista nastoista niin paljon ja käytämme vain asiaankuuluvia nastoja välttäen komplikaatioita jossain määrin.

Nastan määrittämiseksi lähdöksi meidän on käytettävä DDR (Data Direction Register) -rekisteriä. Jos mietit mitä tässä oleva rekisteri tarkoittaa, se on yksinkertaisesti tila MCU: ssa, jonka avulla mikro-ohjain voi vastata tietyllä tavalla.

DDR: n avulla voimme asettaa PIN-koodin joko lähettämään dataa, joka on kuin 'lähtö', tai hyväksymään datan, joka on 'tulo'.

Saatat kuitenkin olla hämmentynyt sanasta, mitä tämä tarkoittaa? Data lisää nastoihin kolmannen ulottuvuuden, joka voidaan määrittää olemaan jatkuvasti logiikkanollalla (0 V) tai logiikkakorkealla (5 V), mutta entä signaalit, jotka voivat vaihdella nopeasti, kuten pulssitaajuus. Taajuuteen liittyy korkea ja matala logiikka (5 V ja 0 V), jotka värähtelevät tietyillä tietyillä aikaväleillä tai jaksoilla, joten siitä tulee ajallinen ja sitä voidaan säätää ajan suhteen, minkä vuoksi tunnistamme 'dataksi', joka tarkoittaa parametria, joka osoittaa funktio suhteessa toiseen toimintoon (logiikkatilat ja aika).

Yksi tapa määrittää pin0 lähtö on kirjoittamalla seuraava koodi:

DDRB = 0b00000001

Yllä olevassa ohjelmassa DDRB tarkoittaa PORT B: n tietosuuntarekisteriä. 0b ohjeistaa kääntäjää seuraavan luvun binäärilausekkeesta, kun taas lausekkeen lopussa oleva ”1” osoittaa pin0: n sijainnin, eli sen sijainnin muodossa PORT B: n ensimmäisen nastan

Jos muistat, saimme tietää, että PORT B ​​yhdistää siihen 8 nastaa (0: sta nastaan ​​7), ja jos huomaat, että yllä olevassa koodissa on myös 8 numeroa, mikä tarkoittaa, että jokainen numero tarkoittaa näitä PORT B: n 8 nastaa.

Seuraava toimenpide olisi määrittää 5V tälle pinille (pin0). Jälleen toimintaperiaate on identtinen DDR: n kanssa, joka on ilmaistu seuraavalla binaarikoodilla:

PORTB = 0b00000001

Kuten voidaan nähdä, ainoa ero yllä olevan koodin ja aikaisemman välillä on se, että tässä koodissa olemme käyttäneet PORT-rekisteriä. Tämä rekisteri käsittelee nimenomaan sen portin pin-määritykset, jolle se on sijoitettu MCU: n sisään. Siten se antaa meille mahdollisuuden määrittää todelliset datalogiikat (0 tai 1) näille pinouteille.

Nyt saatamme olla kiinnostunut keskustelemaan joistakin ohjelmamme likimääräisistä yksityiskohdista. Koska tiedämme, että kaikki ohjelmat vaativat tietyn tilan suorituksen aloittamiseksi, tätä voidaan verrata kokkiin, joka tietää kaikki tietyn reseptin ainesosat, mutta jota ei opasteta mistä aloittaa.

Tärkein toiminto on tässä paikka, jossa kukin C / C ++ -ohjelmista aloittaa suorituksen. Siksi pääosa voidaan luoda seuraavasti:

int main (mitätön)
{
}

Kuitenkin, jotta ohjelma voi tulkita DDR- ja PORT-rekisteritiedot ja niiden toiminnan MCU-sirussa, on lisättävä lisälauseke, joka voi sisältää kaikki AVR MCU: ta koskevat tiedot. Ehkä haluaisimme lisätä tämän sisällyttämisen kaikkiin ohjelmiin.

#sisältää
int main (mitätön)
{
}

Heti kun kokoaminen on aloitettu, kääntäjän esiprosessori-osa keskittyy AVR-hakemistoon tunnistamaan “io.h” -tiedoston. Laajennus '.h' osoittaa tässä olevan otsikkotiedoston ja että tämä tiedoston sisällä oleva koodi otettaisiin käyttöön luotavan lähdetiedoston alussa (pää), joten nimi 'otsikko'.

Tässä voimme ottaa käyttöön DDR- ja PORT-käskyt koodissamme, koska io.h-otsikkotiedoston lisääminen olisi ohjannut kääntäjän heihin.

#sisältää

int main (mitätön)

{

DDRB = 0b00000001 // Data Direction Rekisteröi pin0 tuotettavaksi ja loput nastat tuloksi

PORTB = 0b00000001 // Aseta nasta 0 arvoon 5 volttia

}

Edellä on vahvistettu pin0: n suunta lähdöksi, jonka suuruus on 5 V. On kuitenkin edelleen yksi asia, jota ei ole määritetty tälle tappiolle, eli tappi on vielä ohjeistettava kytkemään PÄÄLLE loputtomiin, kunhan MCU: n virta on kytkettynä. Tämä ääretön takaisinkytkentäsilmukka varmistaa, että tämä MCU: n tappi ei kytkeydy pois päältä, vaan jatkuu pikemminkin 5 V: n lähdöllä.

Vaikka on olemassa monia erilaisia ​​tapoja käyttää silmukka-käskyä pinille, yritämme käyttää ”while” -silmukkaa täällä. Kuten nimestä voi päätellä, 'while' -silmukka kertoo mikrokontrollerille, että 'kun' virtaa on käytettävissä, sinun on pysyttävä aktivoituna määritetyllä 5V: lla osoitetulle pinoutille.

#sisältää

int main (mitätön)

{

DDRB = 0b00000001 // Data Direction Rekisteröi pin0 tuotettavaksi ja loput nastat tuloksi

PORTB = 0b00000001 // Aseta nasta 0 arvoon 5 volttia

kun taas (1)

{

// Koodi olisi täällä, jos sen tarvitsisi suorittaa uudestaan ​​ja uudestaan ​​ja uudestaan ​​... loputtomasti

}

}

Haluat ehkä huomata, että tässä olemme käyttäneet merkintää '1' argumentin muodossa 'while' -silmukkaan, koska kaikkea muuta paitsi '0' voidaan pitää loogisena 'true'.

Tämä tarkoittaa, että 'while' -silmukan huomiointi ei koskaan ole vastuussa mistään muusta kuin loogisesta 'true' -arvosta, mikä tarkoittaa, että tietty tappi tarttuisi määritettyyn tilaan loputtomiin.

LEDin voidaan todeta olevan päällä määritetyn nastan päällä pysyvästi, kunhan MCU sai virtaa Vdd: n ja Vss: n yli.

Siinä kaikki, nyt meillä on tulos, jonka halusimme saada ja voimme lopulta nähdä sen tapahtuvan niin kovan työn jälkeen, mutta silti nähdä työmme suloinen tulos on niin tyydyttävää.

Seuraavissa opetusohjelmissa opimme lisäämään 'aika' -ulottuvuuden yllä olevaan LED-merkkivaloon, jolloin se saadaan vilkkumaan tietyllä nopeudella.

Itse asiassa yllä olevassa toteutuksessa LED todella vilkkuu, mutta silmukanopeus on niin nopea, että se on melkein kuin pysyvä kytkin päälle LED-valaistuksessa.

Näemme, kuinka tämä silmukka voidaan lisätä viiveellä halutulla tavalla, jotta LED vilkkuu tällä viivästetyllä nopeudella.

Kuinka saada LED-valo vilkkumaan AVR-mikrokontrollerilla

Viimeisessä keskustelussa opimme kuinka kytkeä LED-kytkin päälle mikrokontrollerin kautta, se oli erinomainen, eikö olekin? Ei voi olla niin paljon!

Täällä opitaan, kuinka lisätä yllä olevaa LED-valaistusta osoittamalla kaksisuuntainen toiminto, eli yritämme saada sen vilkkumaan tai vilkkumaan tietyllä taajuudella tai nopeudella. Näemme myös, kuinka tätä korkoa voidaan nostaa tai vähentää käyttäjän toivomalla tavalla.

Katsotaanpa tätä:

#sisältää

#sisältää

int main (mitätön)

{

DDRB | = 1<< PINB0

kun taas (1)

{

PORTB ^ = 1<< PINB0

_viive_ms (100)

}

}

Jos tunnet olosi hämmentyneeksi yllä olevassa lausekkeessa käytetyistä oudoista symboleista (&, ^, | jne.) (& Ei ole siellä, mutta sitä voidaan käyttää muissa vastaavissa koodeissa), tässä on asiaan liittyvä tieto, jonka haluat olla kiinnostunut näistä :

Se sisältää monia tavallisia loogisia algoritmeja, kuten AND, OR, NOT ja XOR, joita tyypillisesti käytetään yllä olevan koodin kanssa.

Nämä loogiset toiminnot vertaavat erityisesti kahta bittiä '1' ja '0' niille annettujen totuustaulukoiden mukaan.

Saamme idean analysoimalla seuraavaa bittijärjestelyä:

01001011 &
10001101
on yhtä suuri
00001001

Yllä olevassa koodissa & viittaa AND: hen, jota käytetään C-ohjelmoinnissa.

Lukemalla rivejä pystysuoraan, se viittaa siihen, että 0 ja 1 ovat yhtä suuria kuin 0, 1 ja 0 ovat myös yhtä suuria kuin 0, 0 ja 0 ovat yhtä kuin 0, 1 ja 1 on yhtä kuin 1. Sen lukeminen on niin yksinkertaista. Nämä ovat AND-operaattorin totuustaulukon mukaisia.

Jos arvioimme seuraavan taulukon, se osoittaa symbolin '|' tarkoittaa OR-toiminnon käyttöä, '|' löytyy tietokoneesi näppäimistön 'askelpalautin' -kohdan vasemmalta puolelta:

01001011 |
10001101
on yhtä suuri
11001111

Samoin tämä OR-logiikkatoiminnon totuustaulukko osoittaa, että bitit 0 tai 1 ovat yhtä suuria kuin 1, 1 tai 0 ovat yhtä kuin 1, 0 tai 0 ovat yhtä kuin 0, kun taas 1 tai 1 on yhtä kuin 1.

Seuraava bittiyhdistelmä on tarkoitettu XOR-logiikkaoperaattorille, jota merkitään ^: llä, ja sitä voidaan tutkia aivan kuten teimme AND-, OR-totuustaulukoiden kanssa:

01001011 ^
10001101
on yhtä suuri
11000110

Jatketaan nyt ensimmäistä ohjelmaa ja opitaan, mitä seuraava rivi siinä tarkoittaa:

#sisältää

Aikaisempien opetusohjelmiemme avulla tiedämme, kuinka lauseke toimii, joten emme toista sitä, mutta niiden näyttää olevan uusi 'sisälly', jonka ilmaisee #include ja joka on tutkittava.

Tässä 'sisällytä' delay.h antaa meille joitain helppoja toteutustapoja.

Kuten nimestä voi päätellä, delay.h antaa meille mahdollisuuden aiheuttaa viive tietyssä ohjelmassa.

Seuraava lauseke int main (void) voidaan jättää meneillään olevasta keskustelusta, koska olemme jo käsitelleet sitä aikaisemmissa viesteissämme.

Seuraavaksi tulee muutettu DDRB.

Seuraava osoittaa aikaisemman muodon, joka ei ole parempi tapa määrittää nastat, koska kaikki nastat 0-7 vaihdettiin tulojen muodostamiseksi. Mutta vain kuvittele, mikä olisi tilanne, jos haluaisimme luoda pidemmän ohjelman, joka vaatii kyseiset nastat muille toiminnoille? Esimerkiksi nasta 2 voi olla tarpeen laitteen etäkytkennän suorittamiseksi. Siinä tapauksessa emme ymmärtäisi, että syötetään sama syötteeksi vain kokeilemalla. Tämä voi tarkoittaa väärää vastausta kaukolähettimestä laitteen vastaanottimeen.

DDRB = 0b00000001

Haluamme mieluummin vaikuttaa vain yhteen bittiin, hattu pin0-bittiin, vilkaisemalla “OR” -toimintoa, joka voidaan suorittaa binäärisen peitteen avulla.

DDRB = DDRB | 0b00000001

Täällä se on peitetty 'OR' -maskilla: 0b00000001, vaikka se näyttää olevan aito binääriluku, jos aikaisempi DDRB esimerkiksi: 0b01001010, OR: n käyttäminen tähän peittämällä voi antaa: 0b01001010 | 0b00000001 = 0b01001011.

Tuloksena oleva ero, jonka voidaan todistaa, on vain pin0: lla, jonka bitit ovat muuttuneet!

Pakkaamalla yllä oleva lause vielä enemmän C ++: n kautta saadaan:

DDRB | = 0b00000001

Kuitenkin havaitsemme, että annetussa ohjelmassa on vielä enemmän. Vaikka se saattaa näyttää melko lailliselta ja ilmeiseltä, meidän on hyödynnettävä joitain io.h-otsikkotiedoston lausuntoja etenkin, kun se on luotu periaatteessa mukavuutemme vuoksi?

Joten jos “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.

Joten aloitamme numerolla 0b00000000 ja laitamme “1” tuottamaan arvon 0b0000001 ja siirrämme sen sitten vasemmalle 0-asentoon, mikä antaa täsmälleen identtisen arvon 0b00000001 kuten yllä.

Jos oletetaan, että se on PINB4, lauseke voidaan ilmaista yhdellä<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Varo, että käytämme nollaindeksiä eli '1': n jälkeen on neljä nollaa.

Jatketaan nyt 'while' -silmukkaan, jonka me huomasimme aiemmin 'äärettömän silmukan' poikki. Mutta ehkä nyt haluamme, että mikro-ohjain toteuttaa joitain haluttuja teloituksia. Tämä voi olla mahdollista vain tietyn silmukan sisällä. Se on silmukka, jossa tietty jakso toistetaan uudestaan ​​ja uudestaan.

Jos toteutus sijoitettaisiin ennen silmukkaa, se olisi toteutettu vain kerran.

Jotta LED-valo vilkkuisi loputtomasti, PINB0 olisi kuitenkin kytkettävä vuorotellen päälle / pois silmukan sisällä. Täältä löydät myös viivästykset, joita ilman LED: n vilkkuminen olisi mahdotonta. Mutta tämä pakottaisi LED-valon vilkkumaan hyvin nopeasti, jota on vaikea tunnistaa paljaalla silmällä, sen on hidastettava hieman, jotta se voidaan tunnistaa silmiemme kanssa.

Olemme tietoisia tietyn bittimäärityksen menettelystä binääriluvussa, mutta emme ole varmoja siitä, miten tiettyä bittiä '0' käytetään, jos se on vielä '1'.

Seuraava ohjelma voidaan nähdä tekemässä tätä, mutta huomaamme myös, että se ei välttämättä ole näkyvissä ohjelmassa.

Kaksi ensimmäistä lausetta vaihtaa bitiksi arvoksi “1” (5V, LED-valot), sitten tauko otetaan käyttöön 100 ms: n ajan.

Muutama seuraava rivi muuttaa PINB0-bitin arvoksi '0' (nollajännite, LED sammuu), mutta valitettavasti AND vertailu ei pysty suorittamaan bittiä '0', mutta jos käytämme EI '~' binaarimaskille se voisi vaihtaa kaikki 0: t 1: ksi ja päinvastoin.

Tämän avulla voimme vaikuttaa vain PINB0-bittiin ja kääntää sen arvoon '0'. Sulkeet sisällytettiin peittämisen suorittamiseksi siten, että NOT-operaatiota voitiin soveltaa koko naamioihin eikä pelkästään “1” -kohdan yli ennen vasenta siirtymää ”.<<”.

SATAMA | = 1<< PINB0
_viive_ms (100)
PORTB & = ~ (1<< PINB0)
_viive_ms (100)

ON OFF -viiveiden tai yhtä kestävien jaksojen luomiseksi voimme lyhentää edelliset neljä riviä kahteen ja soveltaa XOR-toiminnallisuutta hyödykseemme. On huomattava, että XOR-suorituksessa määritetty nasta 1: lle, jos se on 0 ja päinvastoin. Tämä suoritus vaikuttaisi vain PINB0: een. Kuten komentoa saatetaan usein käyttää, se vain muuttaisi bitin nykyisen logiikan vastakkaiseksi.

PORTB ^ = 1<< PINB0
_viive_ms (100)

TEHTY! LED vilkkuu nyt asetetun nopeuden mukaan ... Yksinkertainen, eikö olekin?




Pari: Useiden laitteiden kaukosäädinpiiri Seuraava: Vaihevaihe, neutraali, maasulkuvirtapiiri