Bazele microcontrolerului explorate

Încercați Instrumentul Nostru Pentru Eliminarea Problemelor





Un lucru este extraordinar la IC-urile microcontrolerelor, acestea sunt disponibile aproape în toate părțile globului și la comercianții cu amănuntul de electronice.

Introducere

În mod fundamental, dispozitivele cu microcontroler sunt utilizate în mod popular în aplicații care implică evaluări ale mediului înconjurător și în electronice similare.



Puteți găsi aceste dispozitive folosite pentru afișarea unui anumit parametru, în aplicații de control al motorului, iluminare cu LED-uri, senzori de diferite tipuri, cum ar fi senzor de înclinare, accelerometru, contor de viteză, jurnal de date, controlere de temperatură, tastaturi etc.

Înțelegerea principală în ceea ce privește microcontrolerele ar putea fi obținută referindu-se la microcontrolerul AVR Amega32, care este atât de avansat încât uneori se numește computer în cadrul unui cip.



Acest dispozitiv este atribuit să efectueze serii de comenzi pentru a forma un program.

Limbajul programului pe care l-ați vedea aici este C ++. Veți putea învăța această limbă în profunzime mai mare în cadrul cursului aici.

Când vine vorba de MCU-uri, aveți posibilitatea de a avea opțiunea de a controla și configura toate pinouturile sale.

Dacă obosiți un pic cu acest lucru, doar vă răcoriți, pentru că nu este absolut deloc complex, veți fi ușurați prin toate aspectele în mod constant, dar ferm, pe măsură ce avansăm.

Într-un cip MCU, toți pinii, cu excepția Vdd și Vss, care sunt pinii de putere ai cipului, pot fi atribuiți cu denumiri exclusive.

Detalii Pinout

Dacă priviți cipul de sus, veți găsi o mică crestătură triunghiulară care indică punctul de pornire de unde începe pinout-urile, care este numărul 1 al cipului începe chiar sub această crestătură.

Începând de la acest pin, veți găsi 20 de pini în partea inferioară pe partea respectivă (stânga) și alți 20 de pini pe cealaltă parte (dreapta), continuând de jos în sus în partea dreaptă.

Primii 8 pini care încep de la crestătură sunt PBO-7 care formează pinii index ai IC, deoarece toate programele de aici încep cu indexul zero.

Seria de pinouts de mai sus este denumită PORT B, în timp ce există alte seturi identice de porturi atribuite A la D.

Aceste porturi ar putea fi atribuite să accepte și să recunoască o dată alimentată numită INPUT și, de asemenea, să transmită date într-o formă specificată numită OUTPUT.

Doi dintre pinii care intră în categoria generală sunt pinii (+) / (-), care sunt, de asemenea, numiți Vdd și GND.

Un pin de la PORT D (PDO-6) poate fi văzut situat în partea stângă a cipului în zona de jos.

PD7, care este pinul 7 al PORTULUI D, ar putea fi urmărit în picioare singur și începând seria de pinouts din partea dreaptă.

Acum, trecând din partea dreaptă a cipului unde se termină PORT D, PORT C începe numărul său în ordine în ordine.

Acestea contribuie la numeroasele pini interesanți ai MCU chiar de la cei analogici la cei digitali.

Acești pini sunt prezentați pentru a deveni intrările de detectare pentru detectarea multor parametri prin etape de circuit analogic configurate extern.

Pinii de mai sus constituie PORTUL A.

Conversia analogică la digitală între pinii de mai sus ar putea fi înțeleasă cu ajutorul unui exemplu în care un nivel analogic de temperatură detectat folosind un senzor obișnuit, cum ar fi un termist, este aplicat la unul dintre pinii PORT A, care este ușor acceptat și convertor de către MCU pentru a produce o citire digitală de la zero la 255 grade F (o cifră de 8 biți care ar putea fi actualizată pentru a obține o ieșire de 10 biți).

O altă caracteristică care ar putea fi asistată suplimentar în MCU-uri este spațiul de programare disponibil sau memoria care determină spațiul pentru variabilele și programul specificat pentru microcontroler.

În plus, MCU-urile au un ceas încorporat alocat pentru numărarea parametrilor relevanți.

Funcțiile de ceas permit MCU-ului să se aplice pentru multe procese de numărare diferite, care ar putea fi rapide în intervalul de microsecunde, în funcție de specificația dispozitivului particular și, de asemenea, ar putea fi mai lent până la orice măsură dorită.

Până acum ați fi înțeles conceptul de microcontroler într-o oarecare măsură și cu privire la porturile și pinii săi.

Cum se creează un conector SPI de la programator la microcontroler

Acum este timpul să aprofundăm puțin subiectul și să investigăm lumea programării.

Acestea fiind spuse, înainte de a ne angaja într-o procedură de încărcare a programului în cip, trebuie să găsim o modalitate adecvată de a integra conectorul SPI (Serial Peripheral Interface) cu MCU.

Cu toate acestea, chiar și după aceasta, nu putem împinge SPI în pinout-urile MCU, nu-i așa? Nici nu putem permite firelor extinse de la SPI să fie introduse direct în placa de pâine. Acest lucru poate provoca, de asemenea, o setare incorectă a firelor conectate cu pinii incorecți care fac conexiuni defecte.

Prin urmare, pentru a face lucrurile absolut impecabile, facem procedurile pe un veroboard minuscul în care obținem pinii metalici de conectare necesari, numiți și „antet” lipit. Acești pini de antet ar putea fi folosiți acum pentru conectarea cu conectorul SPI. Conexiunile de la acest antet pot fi terminate la alte știfturi de antet paralele care pot fi folosite pentru conexiunile panoului de control.

Astfel, ansamblul de mai sus formează acum o platformă intermediară de conectare confortabilă și fiabilă pentru SPI la MCU.

Uptil acum totul arată frumos, perfect, așa că haideți să câștigăm în ceea ce privește programatorul necesar între PC și MCU.

Ar putea fi o serie de companii care produc și vând aceste unități de programare, astfel încât achiziționarea acestora nu ar trebui să fie o problemă pentru dvs., cum ar fi Adafruit Industries, USBtinyISP sau Sparkfun etc.

Câteva dintre acestea ar putea arăta complet diferite de tipurile convenționale, dar în principiu au totul identic și respectă regulile de programare standard și pot fi utilizate ca o interfață între computerul dvs. și microcontrolerul AVR.

Cu toate acestea, asigurați-vă că gândiți-vă, dacă utilizați un alt MCU și nu un AVR Atmega32, poate fi necesar să verificați dacă există un programator compatibil corespunzător pentru acel cip MCU.

Se poate observa că destul de mulți dintre acești programatori folosesc drivere identice, trebuie să avem grijă de ceva și vom afla mai multe despre acest lucru în capitolele noastre ulterioare.

Conectarea computerului cu cipul microcontrolerului este cu adevărat de bază și ați fi încântat să știți cât de simple sunt necesare procedurile pentru acest lucru. Deci, să apăsăm butonul imediat J.

Efectuarea plăcii de interfață SPI explicate mai sus nu este dificilă, este vorba de a face ca fierul tău de lipit să funcționeze prin toate conexiunile de pe cele două rânduri de antet afișate de pin pe o placă mică de uz general.

Figura de mai sus arată detaliile conexiunii pe care ar trebui să le urmați în timp ce interconectați firele dintre anteturi.

Pentru a simplifica lucrurile, să parcurgem următoarele detalii de conexiune pentru aceleași, făcând referire la imaginea de mai sus:

PIN-ul SPI care începe din stânga sus merge la „Master IN, Slave OUT” (MISO)

Pinul SPI din centrul stânga se conectează cu pinul de ceas (SCK)

PIN-ul SPI din stânga jos se alătură Resetării. (Vom afla detaliat despre acest cod în următoarele tutoriale)

SPI relevant pentru dreapta jos se conectează cu pinul GND al MCU, GND se referă la pinul care formează linia de alimentare zero sau șina negativă (relativă) a alimentării.

SPI care se termină din antetul din dreapta mijloc se leagă de pinul „Master Out, Slave IN” (MOSI) al MCU.

SPI care iese din antetul din dreapta sus este conectat cu (+) MCU, care este, evident, Vdd sau pinul de alimentare pozitiv al MCU.

Asta este.

Conectați cei doi conectori așa cum s-a explicat, iar placa de interfață SPI este pregătită pentru acțiunile necesare.

Pentru ajutor suplimentar, puteți consulta figura prezentată mai sus, placa de interfață finală ar trebui să arate astfel după ce toate conexiunile de cablu sunt realizate în mod corespunzător cu ajutorul discuției de mai sus.

Sper că s-ar putea să fi construit deja interfața SPI așa cum s-a explicat în tutorialul anterior și acum este timpul să ne asigurăm că computerul nostru acceptă programatorul pe care trebuie să îl integrăm între PC și MCU.

Realizarea unui cod de programare simplu pentru un MCU

Luăm o unitate USBTinyISP disponibilă de la Sparkfun, pentru conectarea computerului la microcontroler.

Știm că orice sistem de operare al computerului, cum ar fi Windows, va necesita drivere fără de care ar fi inutil să încărcați ceva în computer, astfel programatorul nostru va avea nevoie de drivere pentru a se încărca în computerul dvs.

Să aruncăm o privire asupra procedurilor necesare pentru instalarea driverelor în sistemul de operare al computerului dvs., luăm aici exemplul sistemului de operare Windows 7 cu specificații pe 32 de biți sau pe 64 de biți.

Deschideți sparkfun.com și faceți clic pe „pagina de buzunar a programatorului AVR”. Link-ul poate fi vizualizat cu ușurință în cadrul paginii.

Apoi, găsiți „driverul Windows” sub documente și pur și simplu faceți clic pe el.

Aceasta vă va oferi fișierul pocketprog-driver.zip în computer.

Accesați computerul, găsiți locația de descărcare și dezarhivați fișierul descărcat într-un folder.

În cazul în care computerul dvs. este un sistem de operare pe 64 de biți, trebuie să urmați încă câțiva pași, așa cum este prezentat mai jos, cu un sistem de operare pe 32 de biți, puteți începe direct instalarea din fișierul dezarhivat.

Pentru un 64-bit urmați aceste, pentru 32-bit pur și simplu ignorați:

Google „libusb sourceforge” și faceți clic pe ultima versiune a acestui link.

Ați întâlni câteva fișiere suplimentare, cu toate acestea ați fi interesat să găsiți fișierul bib, adică: libusb-win32-bin - #. #. #. #. Zip

Acum, mergeți și găsiți această locație de descărcare în computer, dezarhivați-o și salvați-o într-unul dintre foldere.

În acest folder, navigați peste folderul bin, continuând cu folderul amd64.

Ați vedea câteva foldere aici ca: ghcalled libusb0.dll și libusb0.sys.

Ați dori să le redenumiți ca: libusb0_x64.dll și libusb0_x64.sys.

Acum va trebui să copiați fișierele de mai sus în folderul pocketprog-driver, pur și simplu suprascrieți fișierele din versiunea existentă.

Pentru a instala driverele de mai sus, următoarea metodă care este mai degrabă neconvențională în acest tip te-ar interesa:

Este un mod „adăugați hardware vechi”.

Faceți clic pe „Meniu Start”

Apoi continuați făcând clic dreapta pe „computer”

Faceți clic pe „Gestionați” și apoi faceți clic pe „dispozitiv manager”

Apoi, în interiorul meniului, alegeți „Adăugați hardware vechi”

Continuați să apăsați „următor”, până când expertul este introdus

Urmând instrucțiunile, faceți clic pe „Instalați hardware-ul pe care ar trebui să îl selectați dintr-o listă avansată”, aceasta va solicita pictograma butonului radio în acea selecție. De fapt, este un buton de control al ferestrelor care acum ar apărea ca un cerc mic cu un filtru albastru rotund în interior.

Acum pur și simplu faceți clic pe „Următorul”

Aceasta vă va afișa meniul „Afișați toate dispozitivele” pe care va trebui să faceți clic.

După aceasta, faceți clic pe pictograma „Have Disk”.

Cu ajutorul pictogramei „Browse”, mergeți la locația folderului pocketprog-driver. Dacă selecția ați fost efectuată corect de dvs., veți vizualiza fișierul pocketprog.inf plasat în acel folder.

Faceți dublu clic pe acest fișier și veți fi cu siguranță martori la instalarea driverului în computer.

Peste și afară!! Să continuăm cu următorul nostru tutorial de pe pagina următoare.

Până acum este posibil să fi instalat software-ul necesar și să fi construit interfața SPI.

Cum se transferă un program într-un cip de microcontroler

Următorul pas va solicita câteva componente, cum ar fi o placă de măsurare, un LED și un rezistor calculat pentru aplicația dorită.

În această secțiune vom învăța metoda de testare a programatorului și vom confirma instalarea driverelor relevante și a software-ului.

Pentru a verifica dacă driverele și software-ul au fost instalate corect, vom implementa un program simplu cunoscut sub numele de avrdude.

AVRdude este un program asociat cu cea mai recentă instalare WinAVR fără de care transferul efectiv al fișierului în MCU nu poate fi posibil.

Acest program este un format de fișier .hex care devine esențial de înțeles de MCU pentru execuțiile necesare.

În cazul în care verificarea nu reușește, programatorul va fi incapabil să efectueze transferul fișierului.

Să vedem rapid cum putem implementa procedura de testare cu ajutorul următoarelor instrucțiuni:

Deschideți promptul DOS (Disk operating system) făcând clic pe „meniul de pornire” și tastând cmd.exe în caseta de căutare dată.

Acum, efectuarea AVRdude se poate face prin simpla tastare avrdude –c usbtiny –p m32 peste promptul DOS. De îndată ce acest lucru este implementat, DOS va recunoaște instantaneu dacă conexiunea a fost un succes.

În comanda de mai sus, „-c” este un semnalizator de notificare care include specificația parametrului programatorului „usbtiny”, în timp ce eticheta „-p” identifică dispozitivul microcontroler („m32 indică Atmega32).

În cazul în care ați utilizat un alt MCU, ar trebui să includeți prefixele relevante pentru implementare.

Odată ce procedura de mai sus este terminată, puteți tasta „exit” peste solicitarea DOS, iar aceasta vă va muta afară din fereastră.

Dacă vă întrebați cu seriozitate cu privire la detaliile reale de programare, pentru asta ar trebui mai întâi să lipim și să construim circuitul analogic extern LED pe care ar putea fi implementat programul, deoarece dacă nu există un sistem care să recunoască răspunsul de la MCU, programarea și rularea microcontrolerului ar fi destul de lipsită de sens.

Realizarea plăcii cu LED-uri este foarte simplă, este vorba de lipirea celor două cabluri ale LED-ului peste o bucată de veroboard și conectarea rezistorului cu unul dintre cablurile LED-ului. Rolul acestui LED este doar de a limita curentul la LED, astfel încât să nu ardă din cauza excesului de tensiune din curentul de la ieșirea MCU.

Valoarea rezistorului poate fi calculată utilizând următoarea formulă simplă:

R = (Ub - LEDfwd) / I

În cazul în care Ub este tensiunea de alimentare, LEDfwd este tensiunea optimă de funcționare a LED-ului utilizat, iar I este amplificatorii săi optimi.

Să presupunem că folosim un LED ROȘU care are o tensiune LED înainte = 2,5 V și curent I = 20 mA, ecuația de mai sus poate fi rezolvată după cum urmează:

Deoarece tensiunea de la MCU ar fi de 5V, aceasta poate fi exprimată ca:

R = (5 - 2,5) /. 02 = 125 ohmi, ¼ watt, cea mai apropiată valoare fiind de 120 ohmi.

Acum avem LED-ul, un rezistor de 120 ohmi și un veroboard, pur și simplu interconectați componentele de mai sus, așa cum este prezentat în diagramă, cu microcontrolerul.

Odată ce acest lucru este făcut, MCU-ul ar putea fi programat pentru răspunsul dorit pe LED-ul de mai sus configurat.

Apoi, programarea MCU.

Pentru a permite microcontrolerului să efectueze unele implementări semnificative, este imperativ să scrieți instrucțiuni adecvate în MCU.

Cum se instalează un mediu de programare și se investighează WinAVR

Pentru aceasta, am putea folosi propriul nostru „editor de text” în computerul nostru, deși este posibil ca noi dintre noi să apreciem utilizarea unui „mediu de programare” mai profesionist în loc de un editor de text obișnuit, simplu deoarece această abordare vă va permite să vă bucurați de unele caracteristici interesante încorporate în cadrul acestui pachet „mediu de programare”.

Ar sprijini crearea și editarea programelor prin diferite limbi și, de asemenea, le va compila într-un mod livrabil ușor de înțeles și acceptat de un cip de microcontroler.

În cele din urmă, acest lucru ar fi susținut de WinAVR și transferat în cipul MCU în cauză.

WinAVR ar putea fi, de asemenea, echipat pentru a executa multe alte operații, cum ar fi depanarea programelor și avertizarea noastră despre posibila sintaxă și compilarea greșelilor și erorilor. Vom discuta aceste I tutorialele noastre ulterioare.

Cursul de instalare al WinAVR ar fi extrem de rapid și rapid. Să ne aruncăm în detalii cu următoarele puncte:

Va trebui să descărcați cele mai recente versiuni din folderul de fișiere forge sursă WinAVR. Ați întâlni câteva informații utile legate de această descărcare de pe site-ul său oficial.

Vi se va solicita o interogare de securitate, astfel încât să puteți răspunde dacă doriți ca descărcarea să aibă loc, se solicită că fișierul care trebuie descărcat este un fișier executabil.

Descărcați fișierul și începeți procesul de execuție făcând clic pe el. Lăsați instalarea să înceapă.

Procesul vă va ghida cu câteva întrebări cu răspunsuri, astfel încât să puteți simplifica instalarea conform confortului dumneavoastră. Ați dori să ignorați multe dintre acestea la formele lor implicite, totul ar trebui să le selectați pe cele care vi se par cele mai potrivite pentru acțiuni.

Până acum, veți găsi totul destul de normal și ușor și veți găsi câteva opțiuni în care meniul de pornire vă va arunca. Nu vă faceți griji, doar unele dintre acestea ar folosi de fapt doar unul dintre temele numite „blocnotes programatori”.

După ce faceți clic pe această pictogramă, veți iniția interfața cu utilizatorul, astfel încât să puteți aplica scrierea programelor (cum ar fi crearea și editarea). De asemenea, ai fi martor la programul care constă din comenzi de meniu pentru a te ajuta să compilezi codurile și să le încorporezi în microcontroler.

Sarcina fundamentală a blocnotei de programare de mai sus este de a transforma un cod lizibil de către om pe care l-ați scrie într-o serie de instrucțiuni ușor de înțeles de MCU.

Următorul tutorial va acoperi testarea programatorului de mai sus, astfel încât să fim siguri în ceea ce privește compatibilitatea acestuia cu Windows și dacă acesta „dă mâna” perfect cu microcontrolerul IC.

Cum se programează un MCU pentru pornirea unui LED

Odată confirmat acest lucru, vom continua să creăm un mic cod „nu face nimic”, doar pentru a ne asigura că procedura de transfer de cod nu întâmpină erori.

Desigur, acum suntem gata să implementăm primul nostru program în cadrul MCU, dar înainte de aceasta ar fi interesant să rezumăm rapid ceea ce am făcut în timpul tutorialelor noastre anterioare:

Am achiziționat microcontrolerul AVR Atmel conform specificațiilor noastre necesare aici, am folosit ATMega32 pentru ilustrații.Apoi, am aflat despre elementele de bază ale microcontrolerului și unitatea de programare care este responsabilă pentru transferul unui program în cipul MCU.

Mai departe, am construit conectorul interfeței SP, care este esențial, astfel încât computerul dvs. să poată fi conectat cu microcontrolerul pentru acțiunile de programare.

După aceasta, am confirmat dacă driverele au fost instalate corect în computer pentru un sistem de operare pe 32 de biți, precum și pe 64, dar.

Apoi, am instalat mediul de programare numit Win AVR pentru a facilita scrierea ușoară a transferului de coduri în microcontroler, urmată de implementarea avrdude pentru verificarea programatorului cu PC-ul și microcontrolerul interconectat.

În cele din urmă, în capitolul anterior am terminat de construit circuitul LED / rezistor și l-am conectat la ieșirile MCU relevante.

Este o mulțime de muncă, cu toate acestea, este timpul să vă îndreptați imediat către niște lucruri reale de programare!

Pentru început, am dori să împărțim microcontrolerul în trei categorii, ceea ce ne-ar simplifica înțelegerea mult:

Control, detectare și comunicare

Ar fi interesant să știți că funcțiile de mai sus ar putea fi programate în multe moduri diferite.

În primul nostru program am încerca să comandăm microcontrolerului să „controleze” un parametru extern, da ai dreptate, ar fi LED-ul pe care l-am construit recent.

Pentru a fi precis, îi vom spune MCU-ului să pornească LED-ul conectat, da, știu că pare destul de primitiv, dar faza de pornire trebuie să fie întotdeauna ușoară.

Mergând mai departe cu lucrarea actuală, făcând MCU să controleze LED-ul este de fapt destul de simplu:

Pentru aceasta, instruim pinul 0 din PORT B ​​să producă 5V necesari pentru LED.

Reamintim din tutorialul anterior, am conectat anodul LED-ului la pinul mai sus menționat al MCU.

Există două lucruri esențiale care trebuie adresate acestui pin al MCU: 1) ieșire și 2) 5 volți

Vom învăța o modalitate prin care putem instrui pinul special să devină rezultatul MCU.

După ce este setat să fie ieșirea cipului, îl putem instrui să fie fie „ridicat” (5V), fie „scăzut” (0V) după cum doriți pentru o aplicație.

Deoarece orice circuit logic, cum ar fi un MCU, pinii ar putea oferi o ieșire sau o intrare și ar putea fi configurat pentru a produce fie un nivel logic ridicat, fie un nivel logic redus, pinii trebuie să fie atribuiți fie pentru a fi un maxim logic, fie un nivel logic scăzut , nu există alte stări intermediare sau nedefinite, altele decât aceste două stări pentru microcontrolere sau pentru orice IC digital, de altfel. De asemenea, același lucru se aplică pentru fiecare pin al MCU.

În ceea ce privește atribuirea pinilor de intrare și ieșire, intrările ar fi poziționate pentru a accepta semnale de la etape analogice externe, în timp ce ieșirile ar fi responsabile pentru interpretarea acestora în stările logice specificate sau într-o frecvență.

Deși sarcinile de mai sus ar putea fi realizate în mai multe metode diferite, am discuta una dintre ele din motive de simplitate. Cu toate acestea, trebuie remarcat faptul că, deși cel care ar fi prezentat acum pare ușor și interesant, nu este atât de viabil și nu este un tip recomandat pentru toate aplicațiile MCU, din același motiv, veți fi introdus la metode de programare mai populare mai târziu în curs . Aceste programe vor permite alocarea numai a pinilor doriti conform specificatiilor fara a afecta celelalte adiacente care ar putea fi deja atribuite pentru a îndeplini alte functii.

Cu toate acestea, în acest moment nu ne vom deranja atât de mult pe ceilalți pini și vom folosi doar pinii de interes relevanți, evitând complicații în anumite măsuri.

Pentru atribuirea unui pin ca ieșire, trebuie să folosim Registrul de direcție a datelor (DDR). Dacă vă întrebați ce înseamnă registrul aici, este pur și simplu un spațiu din MCU care permite microcontrolerului să răspundă într-un mod specific.

Folosind DDR putem seta pinul să trimită fie date ca o „ieșire”, fie să acceptăm date care sunt sub forma unei „intrări”.

Cu toate acestea, este posibil să fiți confuz cu privire la cuvânt, ce înseamnă acest lucru? O dată adaugă o a treia dimensiune pinilor, care pot fi atribuiți să fie continuu la zero logic (0V) sau logică ridicată (5V), dar ce zici de semnalele care ar putea varia rapid, cum ar fi frecvența impulsurilor. O frecvență ar fi însoțită de logici înalte și joase (5V și 0V) oscilând cu anumite intervale sau perioade specificate, astfel devine orientată în timp și poate fi ajustată în funcție de timp, de aceea identificăm ca „date” însemnând un parametru care indică o funcție relativă la o altă funcție (stări logice și timp).

O metodă de atribuire a pin0 ca ieșire este prin scrierea următorului cod:

DDRB = 0b00000001

În programul de mai sus, DDRB semnifică Registrul de direcție a datelor pentru PORT B ​​0b instruiește compilatorul cu privire la următoarea expresie binară a unui număr în timp ce „1” la sfârșitul expresiei indică poziția pin0, adică locația sa în formular a primului pin al PORTULUI B.

Dacă vă amintiți, am aflat că PORT B ​​asociază 8 pini cu acesta (de la 0 la pin 7) și, dacă observați, codul de mai sus are, de asemenea, 8 cifre, adică fiecare cifră înseamnă acești 8 pini ai PORT B.

Acum următoarea procedură ar fi să atribuiți 5V acestui pin (pin0). Din nou, principiul de funcționare este identic cu DDR ca mai sus, exprimat prin următorul cod binar:

PORTB = 0b00000001

După cum se poate vedea, singura diferență dintre codul de mai sus și cel anterior este că în acest cod am folosit registrul PORT. Acest registru tratează în mod specific atribuțiile de pin ale acelui port special pentru care a fost poziționat în interiorul MCU. Astfel, ne permite să atribuim logice de date reale (0 sau 1) pentru acele identificări.

Acum ne-ar putea interesa să discutăm câteva despre detaliile aproximative ale programului nostru. După cum știm, toate programele necesită un anumit spațiu pentru a iniția execuția, acest lucru poate fi comparat cu un bucătar care știe toate ingredientele referitoare la o anumită rețetă, dar nu este instruit de unde să înceapă.

Funcția „principală” aici este locația în care fiecare dintre programele C / C ++ inițiază execuția. Prin urmare, principalul poate fi creat ca:

int main (nul)
{
}

Cu toate acestea, pentru a permite programului să interpreteze detaliile registrului DDR și PORT și funcționarea lor în interiorul cipului MCU, trebuie inclusă o declarație suplimentară care poate consta din toate datele referitoare la MCU AVR. Poate că am vrea să adăugăm această includere în toate programele noastre.

#include
int main (nul)
{
}

De îndată ce începe compilarea, secțiunea pre-procesor a compilatorului se concentrează pe directorul AVR pentru a identifica fișierul „io.h”. Extensia „.h” indică aici că este un fișier antet și că acest cod din fișier ar fi introdus la începutul (capul) fișierului sursă care este creat, de unde și numele „antet”.

Aici putem introduce instrucțiunile DDR și PORT în codul nostru, deoarece adăugarea fișierului antet io.h ar fi îndreptat compilatorul cu privire la acestea.

#include

int main (nul)

{

DDRB = 0b00000001 // Reglarea direcției datelor setând pinul 0 la ieșire și pinii rămași ca intrare

PORTB = 0b00000001 // Setați pin0 la 5 volți

}

Cele de mai sus fixează orientarea pinului 0 ca ieșire, având o magnitudine de 5V. Cu toate acestea, există încă o problemă care nu este stabilită pentru acest pin, adică acest pin nu este încă instruit să fie pornit la nesfârșit atâta timp cât MCU este alimentat. Această buclă de feedback infinit ar asigura că acest pin de la MCU nu se oprește, ci mai degrabă continuă cu ieșirea de 5V pe termen nelimitat.

Deși există multe metode diferite de aplicare a unei instrucțiuni de buclă pentru un pin, am încerca să folosim aici bucla „while”. După cum sugerează și numele, bucla „în timp ce” spune microcontrolerului că „în timp ce” este disponibilă puterea, trebuie să rămâneți activ cu 5V alocat pentru pinout-ul atribuit.

#include

int main (nul)

{

DDRB = 0b00000001 // Reglarea direcției datelor setând pinul 0 la ieșire și pinii rămași ca intrare

PORTB = 0b00000001 // Setați pin0 la 5 volți

în timp ce (1)

{

// Codul ar fi aici dacă ar fi nevoie să se execute din nou și din nou ... la nesfârșit

}

}

S-ar putea să doriți să rețineți că, aici am folosit „1” sub forma unui argument pentru bucla „while”, întrucât totul cu excepția ‘0’ ar putea fi considerat un „adevărat” logic.

Asta implică, considerarea buclei „în timp ce” nu ar fi niciodată responsabilă pentru nimic, cu excepția unei „adevărate” logice, ceea ce înseamnă că pinul particular ar fi blocat cu starea specificată la nesfârșit.

LED-ul poate fi observat că este aprins permanent pe pinul atribuit, atâta timp cât MCU a primit alimentare pe Vdd și Vss.

Asta e, acum avem rezultatul pe care am dorit să-l obținem și, în sfârșit, putem vedea cum se întâmplă după atâta muncă grea, dar totuși să vedem rezultatul dulce al muncii noastre grele este atât de satisfăcător.

În cadrul următoarelor tutoriale vom învăța cum să adăugăm o dimensiune „timp” la LED-ul de mai sus, așa cum să facem să clipească la o anumită rată specificată.

De fapt, în implementarea de mai sus, LED-ul clipește de fapt, dar rata de buclă este atât de rapidă încât este aproape ca un comutator permanent PORNIT peste iluminarea cu LED-uri.

Vom vedea cum această buclă poate fi adăugată cu o întârziere dorită, pentru a face LED-ul să clipească la ritmul întârziat.

Cum se face un LED intermitent utilizând microcontrolerul AVR

În ultima discuție, am învățat cum să pornim LED-ul printr-un microcontroler, era remarcabil, nu-i așa? S-ar putea să nu fie atât de mult!

Aici vom învăța cum să condimentăm iluminarea LED-ului de mai sus atribuind o funcționalitate bidirecțională, adică vom încerca să-l facem să clipească sau să clipească la o anumită frecvență sau rată specificată. Vom vedea, de asemenea, cum această rată ar putea fi mărită sau micșorată, după cum dorește utilizatorul.

Să aruncăm o privire în acest sens:

#include

#include

int main (nul)

{

DDRB | = 1<< PINB0

în timp ce (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Dacă vă simțiți nedumerit cu acele simboluri ciudate (&, ^, | etc) utilizate în expresia de mai sus (& nu există, dar ar putea fi folosit în alte coduri similare), iată informațiile conexe pe care ați fi interesat să le cunoașteți despre acestea :

Include mulți algoritmi logici standard, cum ar fi AND, OR, NOT și XOR, care sunt de obicei folosiți cu codul de mai sus.

Aceste funcționalități logice compară în mod specific cei doi biți „1” și „0” în conformitate cu tabelele lor de adevăr atribuite.

Ne vom face o idee analizând următoarea aranjare de biți:

01001011 &
10001101
egal
00001001

În codul de mai sus & se referă la ȘI așa cum este utilizat în programarea C.

Citind rândurile pe verticală, sugerează că 0 și 1 este egal cu 0, 1 și 0 este egal cu 0, 0 și 0 este egal cu 0, 1 și 1 este egal cu 1. Citirea acestuia este la fel de simplă ca asta. Acestea sunt conform tabelului de adevăr al unui operator AND.

Dacă evaluăm tabelul următor, acesta indică simbolul „|” denotând utilizarea funcționalității „SAU”, „|” poate fi găsit chiar în stânga „backspace” din tastatura computerului:

01001011 |
10001101
egal
11001111

În mod identic, acest tabel de adevăr al unei funcționalități logice OR indică faptul că biții 0 sau 1 este egal cu 1, 1 sau 0 este egal cu 1, 0 sau 0 este egal cu 0, în timp ce 1 sau 1 este egal cu 1.

Următoarea combinație de biți este pentru operatorul logic XOR notat cu ^ și poate fi studiată exact așa cum am făcut cu tabelele de adevăr AND, OR:

01001011 ^
10001101
egal
11000110

Acum, să continuăm cu primul program și să aflăm ce înseamnă următoarea linie din el:

#include

Prin tutorialele noastre anterioare știm cum funcționează expresia, așa că nu o vom reitera, cu toate acestea, pare a fi o nouă „includere” exprimată de #include care trebuie investigată.

În acest „include” delay.h ne permite cu câteva metode ușoare de implementare.

După cum sugerează și numele, delay.h ne permite să inducem o întârziere în programul respectiv.

Următoarea expresie int main (nul) ar putea fi omisă din discuția în curs, deoarece am tratat deja acest lucru în postările noastre anterioare.

Urmează DDRB modificat.

Următorul arată forma anterioară, care nu este o modalitate mai bună de atribuire a pinilor, deoarece toți pinii de la 0 la 7 au fost comutați pentru a forma intrările. Dar imaginați-vă care ar fi situația dacă am dori să creăm un program mai lung care să solicite acei pini pentru alte funcționalități? De exemplu, pin2 ar putea fi necesar pentru aplicarea unei comutări la distanță a unui aparat. În acest caz, nu ne-ar plăcea să atribuim același lucru ca o intrare doar prin încercare și eroare. Acest lucru ar putea însemna un răspuns incorect de la transmițătorul de la distanță la receptorul aparatului.

DDRB = 0b00000001

Mai degrabă dorim să influențăm doar un bit, hat pin0 bit, aruncând o privire asupra funcționalității „SAU”, aceasta putând fi executată printr-o mascare binară.

DDRB = DDRB | 0b00000001

Aici este acoperit cu o mască „SAU”: 0b00000001, deși pare a fi un număr binar autentic, în cazul în care DDRB-ul anterior, de exemplu: 0b01001010, apoi aplicarea unui SAU prin mascare ar putea da: 0b01001010 | 0b00000001 = 0b01001011.

Diferența rezultată, așa cum s-a putut observa, este doar cu pin0, ale cărui biți s-au schimbat!

Comprimarea declarației de mai sus chiar mai departe prin C ++ oferă:

DDRB | = 0b00000001

Cu toate acestea, constatăm că există și mai multe în programul dat. Deși poate părea destul de legitim și evident, ar trebui să profităm de unele dintre afirmațiile din fișierul antet io.h mai ales atunci când este creat fundamental pentru confortul nostru?

Deci, dacă „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.

Deci, începem cu un 0b00000000 și punem un „1” pentru a produce 0b0000001 și apoi îl transferăm în pozițiile stânga 0, ceea ce dă un 0b00000001 exact identic cu cel de mai sus.

Acum, dacă presupunem că este PINB4, declarația ar putea fi exprimată ca 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Atenție, folosim un indice zero, ceea ce înseamnă că sunt patru zerouri după „1”.

Acum trecem la bucla „while” pe care am observat-o mai devreme peste „bucla infinită”. Dar poate că acum vrem ca microcontrolerul să implementeze unele dintre execuțiile dorite. Acest lucru poate fi fezabil numai în interiorul buclei date. Este bucla în care secvența particulară se repetă din nou și din nou.

În cazul în care execuția ar fi plasată înainte de buclă, s-ar fi implementat o singură dată.

Cu toate acestea, pentru a face LED-ul să clipească la nesfârșit, ar fi necesar să porniți PINB0 alternativ ON / OFF în buclă. Aici găsim și întârzierile introduse, fără de care clipirea LED-ului ar fi imposibilă. Dar acest lucru ar forța LED-ul să clipească la o viteză foarte rapidă greu de recunoscut cu ochiul liber, ar trebui să încetinească puțin pentru a deveni identificabil cu ochii noștri.

Suntem conștienți de procedura de configurare a unui anumit bit din numărul binar, dar nu suntem siguri de metoda de aplicare a unui bit specific „0” în cazul în care este încă „1”.

Următorul program ar putea fi văzut făcând acest lucru, dar vom constata, de asemenea, că este posibil să nu fie vizibil în program.

Cele două declarații inițiale schimbă bitul în „1” (5V, lumini LED), apoi se introduce o pauză pentru 100 ms.

Următoarele două linii transformă bitul PINB0 în „0” (tensiune zero, LED-ul oprit), dar îmi pare rău compararea AND nu va putea executa un „0” din bit, dar dacă folosim NU „~” pentru masca binară ar putea comuta toate 0 în 1 și invers.

Acest lucru ne va permite să influențăm doar bitul PINB0 și să-l întoarcem la „0”. Parantezele au fost incluse pentru a conține execuția de mascare astfel încât operațiunea NU să poată fi aplicată pentru toate măștile și nu pur și simplu peste „1” înainte de schimbarea la stânga „<<”.

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

Pentru a crea întârzierile ON OFF sau perioadele de durată egală, putem reduce scurtele patru rânduri anterioare la două și putem aplica funcționalitatea XOR în beneficiul nostru. Trebuie remarcat o execuție XOR și un pin atribuit unui 1 în cazul în care este 0 și invers. Această execuție ar influența doar PINB0. De câte ori este aplicată comanda, aceasta ar transforma pur și simplu bitul în opusul logicii existente.

PORTB ^ = 1<< PINB0
_delay_ms (100)

TERMINAT! LED-ul dvs. ar clipi acum, conform ratei stabilite ... Simplu, nu-i așa?




Precedent: Circuit de telecomandă cu mai multe aparate Următorul: Circuit indicator fază alternativă, neutru, pământ