Cuprins:

Tutorial AVR Assembler 9: 7 Pași
Tutorial AVR Assembler 9: 7 Pași

Video: Tutorial AVR Assembler 9: 7 Pași

Video: Tutorial AVR Assembler 9: 7 Pași
Video: Getting started with AVR and Atmel Studio 7 2024, Iulie
Anonim
Tutorial AVR Assembler 9
Tutorial AVR Assembler 9

Bine ați venit la Tutorialul 9.

Astăzi vom arăta cum să controlăm atât un afișaj cu 7 segmente, cât și un afișaj cu 4 cifre folosind codul nostru de limbaj de asamblare ATmega328P și AVR. În acest sens, va trebui să luăm în considerare modul de utilizare a stivei pentru a reduce numărul de registre pe care trebuie să le legăm. Vom adăuga câteva condensatoare (filtre low-pass) pentru a încerca să reducem zgomotul de pe tastatura noastră. Vom crea un amplificator de tensiune dintr-un cuplu de tranzistori, astfel încât întrerupătorul nostru de întrerupere INT0 să funcționeze mai bine pentru butoanele de tensiune mai mică de pe rândul de jos al tastaturii. Și ne vom ciocni puțin de perete încercând să obținem rezistențele corecte, astfel încât lucrul să funcționeze corect.

Vom folosi tastatura noastră din Tutorialul 7

Pentru a face acest tutorial, pe lângă lucrurile standard, veți avea nevoie de:

  1. Un afișaj pe 7 segmente

    www.sparkfun.com/products/8546

  2. Un afișaj din 4 cifre

    www.sparkfun.com/products/11407

  3. Un buton

    www.sparkfun.com/products/97

  4. Fișele tehnice ale afișajului care pot fi descărcate de pe paginile respective legate de mai sus.
  5. Un condensator ceramic de 68 pf, câteva condensatoare 104, o grămadă de rezistențe, două tranzistoare 2N3904 NPN.

Iată un link către colecția completă a tutorialelor mele de asamblare AVR:

Pasul 1: Cablarea afișajului de 7 seg

Cablarea afișajului de 7 seg
Cablarea afișajului de 7 seg
Cablarea afișajului de 7 seg
Cablarea afișajului de 7 seg
Cablarea afișajului de 7 seg
Cablarea afișajului de 7 seg

Vom folosi același cod pe care l-am folosit în Tutorialul 7 pentru tastatură pentru a controla afișajul cu 7 segmente. Deci, va trebui să faceți o copie a acesteia și o vom modifica.

Vom mapa segmentele la pinii microcontrolerului nostru după cum urmează:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

unde literele segmentelor sunt afișate în imagine împreună cu pinout-ul corespunzător 5V comun și fiecare segment LED, inclusiv punctul zecimal (dp) din dreapta jos a afișajului. Motivul pentru aceasta este acela că putem introduce întregul număr într-un singur registru și ieșire care se înregistrează în porturile B și D pentru a aprinde segmentele. După cum puteți vedea, biții sunt numerotați secvențial de la 0 la 7 și astfel vor fi mapați la pinii corecți fără a fi nevoie să setați și să ștergeți biții individuali.

După cum puteți vedea după codul pe care l-am atașat la pasul următor, am mutat rutina de afișare într-o macro și am eliberat pinii SDA și SCL pentru utilizare viitoare în următorul tutorial.

Ar trebui să adaug că trebuie să puneți un rezistor între anodul comun al afișajului și șina de 5V. Am ales un rezistor de 330 ohm ca de obicei, dar dacă doriți ați putea calcula rezistența minimă necesară pentru a obține luminozitatea maximă de pe afișaj fără a-l prăji. Iată cum puteți face acest lucru:

Mai întâi uitați-vă la foaia de date și observați că pe prima pagină oferă diverse proprietăți ale afișajului. Cantitățile importante sunt „curentul înainte” (I_f = 20mA) și „tensiunea înainte” (V_f = 2.2V). Acestea vă spun că doriți căderea de tensiune pe ecran va fi dacă curentul este egal cu curentul direct. Acesta este curentul maxim pe care îl va lua afișajul fără prăjire. În consecință, este și luminozitatea maximă pe care o puteți obține din segmente.

Deci, să folosim legea lui Ohm și regula de buclă a lui Kirchoff pentru a afla ce rezistență minimă ar trebui să punem în serie cu afișajul pentru a obține luminozitatea maximă. Regula lui Kirchoff spune că suma tensiunii se schimbă în jurul unei bucle închise într-un circuit este egală cu zero și legea lui Ohm spune că căderea de tensiune pe un rezistor de rezistență R este: V = I R unde I este curentul care curge prin rezistor.

Deci, având în vedere o tensiune a sursei de V și în jurul circuitului nostru avem:

V - V_f - I R = 0

ceea ce înseamnă (V - V_f) / I = R. Deci rezistența necesară pentru a obține luminozitatea maximă (și, probabil, prăjirea segmentelor) ar fi:

R = (V - V_f) / I_f = (5.0V - 2.2V) /0.02A = 140 ohmi

Deci, dacă ai vrea, ai putea folosi fericit 150 ohmi fără griji. Cu toate acestea, cred că 140 ohmi îl fac prea luminos pentru dorința mea și așa că folosesc 330 ohmi (ceea ce este un fel de rezistență personală Goldilocks pentru LED-uri)

Pasul 2: Cod de asamblare și videoclip

Am atașat codul de asamblare și un videoclip care arată funcționarea tastaturii cu afișajul. După cum puteți vedea, am mapat pur și simplu tasta Redial la „r”, tasta flash la „F”, asteriscul la „A” și semnul hash la „H”. Acestea ar putea fi mapate la diverse operații, cum ar fi backspace, enter și ce nu, dacă doriți să utilizați în continuare tastatura pentru tastarea numerelor pe afișajele LCD sau afișajele cu 4 cifre. Nu voi parcurge codul rând cu rând de data aceasta, deoarece este foarte similar cu ceea ce am făcut deja în tutoriale anterioare. Diferențele sunt în principal doar aceleași lucruri pe care le știm deja să le facem, cum ar fi întreruperile și tabelele de căutare. Trebuie doar să parcurgeți codul și să priviți lucrurile noi pe care le-am adăugat și lucrurile pe care le-am schimbat și să vă dați seama de acolo. Vom reveni la analiza linie cu linie în următorul tutorial când vom introduce noi aspecte ale codificării limbajului de asamblare pe microcontrolerele AVR.

Să vedem acum un afișaj din 4 cifre.

Pasul 3: Cablarea afișajului cu 4 cifre

Cablarea afișajului cu 4 cifre
Cablarea afișajului cu 4 cifre
Cablarea afișajului cu 4 cifre
Cablarea afișajului cu 4 cifre

Conform fișei tehnice, afișajul cu 4 cifre are un curent înainte de 60 mA și o tensiune înainte de 2,2 volți. Deci, prin același calcul ca înainte, aș putea folosi un rezistor de 47 ohmi, dacă aș vrea. În schimb, voi folosi un … hrm.. lasă-mă să văd … ce zici de 330 ohmi.

Modul în care este conectat afișajul cu 4 cifre este că există 4 anode, unul pentru fiecare dintre cifre, iar celelalte pini controlează ce segment apare în fiecare. Puteți afișa simultan 4 cifre deoarece sunt multiplexate. Cu alte cuvinte, la fel cum am făcut pentru perechea de zaruri, pur și simplu ciclăm puterea prin fiecare anod la rândul său și îi va clipi unul după altul. Va face acest lucru atât de repede încât ochii noștri nu vor vedea clipirea și va arăta ca și cum toate cele patru cifre sunt aprinse. Cu toate acestea, doar pentru a fi siguri, modul în care îl vom codifica este să setăm toate cele patru cifre, apoi să ciclăm anodii, mai degrabă decât să setăm, să mutăm, să setăm, să mutăm etc. În acest fel putem obține o sincronizare precisă între iluminarea fiecărei cifre.

Deocamdată, să testăm că toate segmentele funcționează.

Așezați rezistorul de 330 ohmi între șina pozitivă a panoului dvs. și primul anod de pe ecran. Fișa tehnică ne spune că pinii sunt numerotați de la 1 la 16 în sens invers acelor de ceasornic, începând din stânga jos (când priviți afișajul în mod normal.. cu punctele zecimale de-a lungul de jos) și afirmă că anodii sunt numerele de pin 6, 8, 9 și 12.

Deci conectăm pinul 6 la 5V și apoi luăm un avantaj negativ de pe șina GND și îl introducem în toți ceilalți pini și vedem că toate segmentele se aprind pe cifra căreia îi corespunde (care este de fapt a doua cifră din dreapta). Asigurați-vă că obțineți toate cele 7 segmente și punctul zecimal pentru a se aprinde.

Acum lipiți firul GND într-unul dintre pini pentru a lumina unul dintre segmente și de această dată mutați rezistorul în jurul celorlalți 3 anodi și vedeți că același segment se aprinde în fiecare dintre celelalte cifre.

Ceva neobișnuit?

Se pare că definiția din foaia de date este greșită. Acest lucru se datorează faptului că este foaia tehnică și pinout-ul pentru un afișaj cu 12 pini, cu 4 cifre. Adică una fără două puncte sau punct zecimal superior. Afișajul pe care l-am primit când l-am comandat este un afișaj cu 16 pini, cu 4 cifre. De fapt, pe mine, anodii segmentului sunt la pinii 1, 2, 6 și 8. Anodul de colon este pinul 4 (pinul catodic 12) și anodul dp superior este pinul 10 (catodul este pinul 9)

Exercițiul 1: Utilizați rezistorul și firul de împământare pentru a identifica care pin corespunde segmentului și punctului zecimal de pe afișaj, astfel încât segmentele corecte să se lumineze atunci când îl codificăm.

Modul în care dorim să codificăm harta segmentelor este exact așa cum am făcut cu afișajul cu 7 segmente de o singură cifră de mai sus - nu trebuie să schimbăm nimic în cod, singurul lucru pe care îl schimbăm este modul în care sunt conectate firele La tabla. Pur și simplu conectați pinul de port corect de pe microcontroler la pinul corespunzător de pe afișajul de 4 cifre, astfel încât, de exemplu, PB0 să treacă în continuare la pinul corespunzător segmentului a, PB1 să meargă la segmentul B etc.

Singura diferență este că acum avem nevoie de 4 pini suplimentari pentru anodi, deoarece nu mai putem merge pur și simplu la șina de 5V. Avem nevoie de microcontroler pentru a decide care cifră obține sucul.

Deci vom folosi PC1, PC2, PC3 și PD4 pentru a controla anodii celor 4 cifre.

S-ar putea la fel de bine să mergeți mai departe și să conectați firele. (nu uitați de rezistențele de 330 ohmi de pe firele anodice!)

Pasul 4: Codarea afișajului cu 4 cifre

Codificarea afișajului cu 4 cifre
Codificarea afișajului cu 4 cifre

Să ne gândim la modul în care vrem să codăm acest afișaj.

Am dori ca utilizatorul să apese butoanele tastaturii și ca numerele să apară secvențial pe afișaj pe măsură ce apasă fiecare buton. Deci, dacă împing un 1 urmat de un 2, acesta va apărea pe ecran ca 12. Aș dori, de asemenea, să stochez acea valoare, 12, pentru uz intern, dar vom ajunge la asta puțin mai târziu. Deocamdată vreau doar să scriu o nouă macrocomandă care să ia apăsarea tastelor și să le afișeze. Cu toate acestea, deoarece avem doar 4 cifre, vreau să mă asigur că vă permite să introduceți doar patru numere.

O altă problemă este că modul în care funcționează afișajul multiplexat din 4 cifre este ciclarea anodilor, astfel încât fiecare cifră să fie aprinsă doar o fracțiune de secundă înainte de a afișa următoarea și apoi următoarea și în cele din urmă înapoi la prima din nou, etc. am nevoie de o modalitate de codificare a acestui lucru.

De asemenea, vrem să deplaseze „cursorul” spre dreapta un spațiu atunci când tastăm următoarea cifră. Deci, dacă doresc să tastați 1234, de exemplu, după ce tastați 1, cursorul se va deplasa, astfel încât următoarea cifră pe care o tastez să apară pe următorul afișaj cu 7 segmente și așa mai departe. În timp ce se întâmplă acest lucru, încă vreau să pot vedea ceea ce am scris, așa că trebuie să treacă în continuare prin cifre și să le afișeze.

Sună ca o comandă înaltă?

Lucrurile sunt chiar mai rele. Avem nevoie de încă 4 registre cu scop general pe care le putem folosi pentru a stoca valorile curente ale celor 4 cifre pe care dorim să le afișăm (dacă urmează să le parcurgem, trebuie să le păstrăm undeva) și problema cu asta este că avem Am folosit registre de uz general ca nebune și dacă nu ne uităm nu ne va mai rămâne. Așadar, este probabil o idee bună să abordați problema mai devreme decât mai târziu și să vă arătați cum să eliberați registrele folosind stiva.

Deci, să începem prin simplificarea puțin a lucrurilor, să folosim stiva și să eliberăm niște registre și apoi vom încerca să îndeplinim sarcina de a citi și de a afișa numerele noastre pe afișajul cu 4 cifre.

Pasul 5: Push 'n Pop

Push 'n Pop
Push 'n Pop

Există doar câteva „registre cu scop general” pe care le avem la dispoziție și odată ce acestea sunt utilizate, nu mai există. Deci, este o bună practică de programare să le folosiți doar pentru câteva variabile care sunt utilizate ca stocare temporară de care aveți nevoie pentru a citi și pentru a scrie în porturi și SRAM, sau altele de care veți avea nevoie în subrutine de pretutindeni și astfel numește-le. Deci, ceea ce am făcut, acum că am inițializat și învățăm să folosim Stack-ul, este să trec prin cod și să găsim registrele cu scop general numite care sunt folosite numai într-un singur subrutin sau întrerupere și nicăieri altundeva în cod și să înlocuim le cu unul din registrele noastre temporare și o apăsare și pop la stivă. De fapt, dacă vă uitați la codul scris pentru microcontrolere mai mici sau dacă vă întoarceți în timp până când toate cipurile erau mai mici, veți vedea doar câteva registre de scop general care trebuiau utilizate pentru toate, astfel încât să nu puteți stocați doar o valoare acolo și lăsați-o în pace, deoarece ați fost sigur că veți avea nevoie de acel registru pentru alte lucruri. Deci, veți vedea împingerea și un poppin 'peste tot în cod. Poate că ar fi trebuit să numesc registrele noastre de uz general ale temperaturii AX și BX ca o felicitări respectuoase pentru acele zile trecute.

Un exemplu va ajuta la clarificarea acestui lucru.

Observați că în conversia noastră analogică la digitală întreruperea completă ADC_int folosim un registru cu scop general pe care l-am numit butonul H pe care l-am folosit pentru a încărca valoarea ADCH și a-l compara cu tabelul nostru de căutare a conversiilor analogice cu butoane. Folosim acest buton H registru numai în subrutina ADC_int și nicăieri altundeva. Deci, în schimb, vom folosi variabila noastră temp2 pe care o vom folosi ca o variabilă temporară pe care o putem folosi în cadrul unui subrutin dat și valoarea acestuia nu va afecta nimic în afara acelui subrutin (adică valoarea pe care i-o dăm în ADC_int nu va fi folosită nicăieri altfel).

Un alt exemplu este în macro-ul nostru de întârziere. Avem un registru pe care l-am numit „milisecunde” care conține timpul nostru de întârziere în milisecunde. În acest caz, este într-o macro și ne amintim că modul în care funcționează macro-ul este că ansamblul plasează întregul cod macro în locul programului unde este apelat. În acest caz, am dori să scăpăm de variabila „milisecunde” și să o înlocuim cu una dintre variabilele noastre temporare. În acest caz, o voi face puțin diferit pentru a vă arăta cum, chiar dacă valoarea variabilei va fi necesară în altă parte, o putem folosi în continuare utilizând stiva. Deci, în loc de milisecunde folosim „temp” și pentru a nu înșela alte lucruri care folosesc și valoarea temp, pur și simplu începem macro-ul „întârziere” prin „împingerea” temp pe stivă, apoi o folosim în loc de milisecunde, iar apoi la sfârșitul macro-ului, „scoatem” valoarea anterioară din stivă.

Rezultatul net este că am „împrumutat” temp și temp2 pentru utilizare temporară și apoi le-am restabilit la valorile lor anterioare când am terminat.

Iată rutina de întrerupere ADC_int după efectuarea acestei modificări:

ADC_int:

push temp; salvați temp deoarece îl modificăm aici împingeți temp2; salvați temp2 lds temp2, ADCH; încărcare tastă ldi ZH, ridicat (2 * numere) ldi ZL, redus (2 * numere) cpi temp2, 0 breq return; dacă declanșatoarele de zgomot nu se schimbă 7segnumber setkey: lpm temp, Z +; incarcare din tabel si post increment clc cp temp2, temp; comparați apăsarea tastelor cu tabelul brlo PC + 4; dacă ADCH este mai mic, încercați din nou lpm 7segnumber, Z; în caz contrar, încărcați tabelul valorii cheie cu cifre; crește numărul cifrei rjmp return; și reveniți la ZH: ZL, 1; increment Z rjmp setkey; și întoarce-te înapoi sus: pop temp2; restaurare temp2 pop temp; restabilire temp reti

Observați că modul în care funcționează stiva este că primul pornit este ultimul oprit. La fel ca un teanc de hârtii. Vedeți că în primele noastre două linii împingem valoarea temp pe stivă, apoi împingem temp2 pe stivă, apoi le folosim în subrutină pentru alte lucruri și în cele din urmă le restabilim din nou la valorile lor anterioare prin primul popping temp2 off (din moment ce a fost ultima apăsat pe el este în partea de sus a stivei și va fi primul pe care îl vom retrage) și apoi popping temp.

Deci, de acum înainte vom folosi întotdeauna această metodă. Singura dată când vom desemna de fapt un registru pentru altceva decât o variabilă temp este atunci când vom avea nevoie de el peste tot. De exemplu, registrul numit „deborduri” este unul pe care îl folosim în mai multe locuri diferite din program și așa că am dori să îi dăm un nume. Desigur, am putea să-l folosim în continuare așa cum am făcut cu temp și temp2, deoarece am restabili valoarea acestuia după ce am terminat. Dar asta ar spaghetiza lucrurile prea mult. Acestea sunt numite pentru un motiv și avem temp și temp2 deja desemnate pentru acel loc de muncă.

Pasul 6: Filtre low-pass și amplificator de tensiune

Filtre low-pass și amplificator de tensiune
Filtre low-pass și amplificator de tensiune
Filtre low-pass și amplificator de tensiune
Filtre low-pass și amplificator de tensiune

Pentru a curăța puțin zgomotul și a face tastatura să funcționeze mai bine, dorim să adăugăm câteva filtre low-pass. Acestea filtrează zgomotul de înaltă frecvență și permit trecerea semnalului de joasă frecvență. În esență, modul de a face acest lucru este pur și simplu să adăugați un condensator de 68 pf între intrarea noastră analogică și masă și, de asemenea, un condensator de 0,1 microfarad (adică 104) între întreruperea PD4 (INT0) și masă. Dacă vă jucați în timp ce apăsați butoanele de pe tastatură, veți putea vedea ce fac.

Apoi vrem să facem un amplificator de tensiune. Se pare că rândul inferior de taste de pe tastatură (precum și tasta de reapelare) scoate o tensiune prea mică pentru a declanșa întreruperea INT0. Portul analogic este suficient de sensibil pentru a citi tensiunile joase de la aceste taste, dar pinul nostru de întrerupere nu are o margine ascendentă suficient de bună pentru a întrerupe când apăsăm acele taste. Prin urmare, am dori un fel de a ne asigura că o margine de creștere a tensiunii frumoase atinge PD4, dar aceeași tensiune joasă ajunge la ADC0. Aceasta este o comandă destul de înaltă, deoarece ambele semnale provin de la același fir de ieșire al tastaturii noastre. Există o serie de moduri sofisticate de a face acest lucru, dar nu vom mai folosi tastatura noastră după acest tutorial, așa că haideți să combinăm o metodă care funcționează (abia).

Mai întâi ar trebui să conectați un buton extern pentru a înlocui întreruperea INT0 și a controla afișajul ținând o tastă pe tastatură și făcând clic pe buton. Acest lucru are mai puține probleme cu tastatura și vă va permite să fiți încrezători că tensiunile dvs. sunt setate corect pe masa de căutare a tastaturii. Odată ce știți că tastatura este conectată corect, apoi scăpați de buton și puneți întreruperea INT0 înapoi. Există unele probleme grave de zgomot și tensiune care controlează tastatura în acest fel, deci este bine să știți că totul funcționează, astfel încât problemele viitoare să poată fi izolate de tasta INT0.

Când vă conectați tastatura și amplificatorul de tensiune, este foarte probabil ca aceleași valori ale rezistorului pe care le-am folosit să nu funcționeze. Așadar, va trebui să faceți câteva experimente pentru a obține valori care funcționează pentru dvs.

Dacă vă uitați la diagrama pe care am atașat-o la acest pas, veți vedea cum va funcționa amplificatorul de tensiune. Folosim niște rezistențe și două tranzistoare. Modul în care funcționează tranzistoarele (vezi fișele tehnice!) Este că există o tensiune minimă pe care trebuie să o introduceți la pinul de bază de pe transister (pinul din mijloc), care îl va satura și va permite curentului să curgă între pinul colector și emițător pin. În cazul tranzistorului 2N3904 pe care îl folosim aici, tensiunea este de 0,65V. Acum luăm tensiunea din ieșirea noastră de pe tastatură și nu vrem să schimbăm ieșirea, așa că vom pune un rezistor mare între ieșirea de pe tastatură și baza primului tranzistor (am folosit 1Mohm). Am etichetat acest lucru ca R_1 în diagramă. Apoi vrem să configurăm un divizor de tensiune, astfel încât baza tranzistorului să fie „aproape” la 0,65 volți deja și doar un pic mai mic să-l împingă deasupra și să-l sature. Acest mic bit mic va proveni de la ieșirea tastaturii atunci când apăsăm un buton. Deoarece tastele inferioare de pe tastatură scot doar o tensiune mică, trebuie să fim deja foarte aproape de saturație pentru ca acestea să fie suficiente. Rezistențele de divizare a tensiunii sunt etichetate pe diagramă R_a și R_b. Am folosit R_a = 1Mohm și R_b = 560Kohm, dar este aproape sigur că va trebui să vă jucați cu aceste numere pentru a le rezolva corect pentru configurare. Poate doriți să aveți un perete în apropiere pentru a vă bate capul și două sau trei pahare de scotch la îndemână (aș recomanda Laphroaig - scump, dar merită dacă vă place fumul. Dacă lucrurile devin cu adevărat nebunești, atunci luați doar un ulcior de BV și stabiliți-vă pentru noapte)

Acum aruncăm o privire asupra modului în care tranzistoarele vor obține o margine ascendentă drăguță care intră în tasta INT0 și generează întreruperea apăsării tastei. Mai întâi să vedem ce se întâmplă când nu apăs o tastă. În acest caz, primul tranzistor (etichetat T1 în diagramă) este oprit. Deci nu curge curent între colector și pinii emițătorului. Astfel, baza celuilalt tranzistor (etichetat T2) va fi trasă în sus și astfel se va satura permițând curentul să curgă între pinii săi. Aceasta înseamnă că emițătorul de T2 va fi scăzut, deoarece este conectat la colectorul care este conectat la masă. Astfel, ieșirea care merge la PIN-ul nostru de întrerupere a tastelor INT0 (PD4) va fi redusă și nu va exista nicio întrerupere.

Ce se întâmplă acum când apăs o tastă? Ei bine, atunci baza T1 depășește 0,65 V (în cazul tastelor inferioare abia depășește!) Și apoi curentul va fi lăsat să curgă, ceea ce va trage baza T2 la tensiune joasă și aceasta va opri T2. Dar vedem că atunci când T2 este oprit, atunci ieșirea este ridicată și, prin urmare, vom primi un semnal de 5V care va merge la pinul nostru INT0 și va provoca o întrerupere.

Observați care este rezultatul net aici. Dacă apăsăm tasta 1, obținem 5V mergând la PD4 fără a modifica semnificativ ieșirea care merge la ADC0 și, mai important, chiar dacă apăsăm Asterisk, 0, Hash sau Redial, primim și un semnal de 5V care merge la INT0 și, de asemenea, provocând o întrerupere! Acest lucru este important, deoarece dacă am merge direct de la ieșirea tastaturii la pinul INT0, acele taste nu generează aproape tensiune și nu vor fi suficiente pentru a declanșa acel pin de întrerupere. Amplificatorul nostru de tensiune a rezolvat această problemă.

Pasul 7: cod de afișare din 4 cifre și videoclip

Asta este totul pentru tutorialul 9! Am atașat codul și un videoclip care arată operațiunea.

Aceasta va fi ultima dată când vom folosi tastatura analogică (slavă Domnului). A fost greu de utilizat, dar a fost, de asemenea, foarte util pentru a ne ajuta să aflăm despre conversia analog-digitală, porturile analogice, întreruperile, multiplexarea, filtrele de zgomot, amplificatoarele de tensiune și multe aspecte ale codificării ansamblului de la tabelele de căutare la cronometru / contoare, etc. De aceea am decis să-l folosim. (plus că este distractiv să scapi de lucruri).

Acum vom analiza din nou comunicarea și vom obține afișajele noastre pe 7 segmente și pe cele de 4 cifre pentru a citi aruncările de zaruri de la ruloul nostru de zaruri la fel cum am făcut-o cu analizorul nostru de registre. De data aceasta vom folosi mai degrabă interfața cu două fire decât metoda noastră de cod morse.

Odată ce comunicările funcționează și rulourile care apar pe afișaje, putem realiza în sfârșit prima piesă a produsului nostru final. Veți observa că fără toate porturile analogice, codul nostru va fi semnificativ mai scurt și probabil mai ușor de citit.

Pentru cei dintre voi care sunt ambițioși. Iată un „proiect” pe care l-ați putea încerca și cu siguranță aveți cunoștințele de făcut în acest moment dacă ați parcurs toate aceste tutoriale până în acest punct:

Proiect: Faceți un calculator! Utilizați afișajul nostru din 4 cifre și tastatura noastră și adăugați o apăsare de buton extern care va acționa ca o tastă „enter”. Hartați asteriscul la „ori”, hashul pentru a „împărți” reapelarea la „plus” și blițul la „minus” și scrieți o rutină de calcul care funcționează ca unul dintre acele vechi calculatoare HP „reverse polish” pe care le aveau toți inginerii înapoi în zi. Adică modul în care funcționează este că introduceți un număr și apăsați „enter”. Acest lucru împinge acel număr pe stivă, apoi introduceți un al doilea număr și apăsați „enter”, care împinge al doilea număr pe stivă. În cele din urmă, apăsați una dintre operațiile precum X, /, + sau - și va aplica acea operație primelor două numere din stivă, va afișa rezultatul și împingeți rezultatul pe stivă, astfel încât să îl puteți folosi din nou dacă ca. De exemplu, pentru a adăuga 2 + 3, ați face: 2, „introduceți”, 3, „introduceți”, „+”, iar afișajul va citi 5. Știți cum să utilizați stiva, afișajul, tastatura și voi au deja majoritatea codului de fundal scris. Doar adăugați tasta Enter și subrutinele necesare calculatorului. Este puțin mai complicat decât ai putea crede la început, dar este distractiv și practic.

Ne vedem data viitoare!

Recomandat: