Capitolul 12 - Circuite externe cu LED-uri
După capitolele anterioare, a sosit momentul să conectăm în cele din urmă circuite externe la microcontrolerul nostru. Utilizarea circuitelor externe va necesita, desigur, încă o mulțime de cunoștințe despre ADuC 842, dar acestea vor fi discutate frumos pe rând, construite una peste cealaltă cât mai mult posibil.
Care sunt dispozitivele de semnalizare pe care le întâlnește cel mai des o persoană obișnuită? Probabil semafoarele. În acest capitol, le vom modela. În acest capitol, luminile semafoarelor sunt reprezentate de LED-uri și vom folosi porți foto pentru poziționare. De acum înainte, există întotdeauna o diagramă de circuit pentru a rezolva fiecare sarcină. Selectarea pieselor nu este, desigur, exclusivă; am încercat să facem curricula ușor accesibilă și. alege elemente de circuit ieftine. Cu excepția LED-urilor, fiecare componentă utilizată are o descriere electronică; acestea sunt conținute într-un director separat. Cu cunoștințe adecvate de inginerie electrică, putem alege cu îndrăzneală și alte tipuri de componente, trebuie să modificăm un pic circuitul sau codul cel puțin.
12.1. Controlul semaforului
Modelează funcția de bază a unui semafor cu trei lentile prin conectarea schimbării fiecărei culori la un moment prestabilit. [Code23, Code24]
Rezolvarea sarcinii este foarte, foarte simplă. Aprindem acel LED, așteptăm timpul pentru acea fază și apoi continuăm. Așteptarea s-ar putea întâmpla cu vechiul subrutină DELAY, dar hai să folosim întreruperea contorului de interval de timp acum! Rezolvați problema specificând tiparele de biți și latențele responsabile de aprinderea LED-urilor în avans în memoria codului ca date.
O diagramă a circuitului unei lămpi indicatoare cu trei lentile cu LED-uri este prezentată în [12.2. figura]. prezentat în figura. Rezistențele de balast ale LED-urilor pot fi alese destul de liber, doar aveți grijă să nu generați prea mult curent în fiecare ramură. Valoarea sa depinde de tipurile de LED-uri, desigur, dar 10-15 mA sunt de obicei destule. Dintre porturile de microcontroler ADuC 842, am putea folosi acum fie 0, fie 2. Deoarece am folosit portul 2 până acum - deoarece LED-urile mici plantate pe panou sunt conectate la acesta - să alegem portul zero acum! Cu toate acestea, aveți mare grijă ca porturile să nu poată fi utilizate ca ieșiri active (evidențiat în [Figura 12.1]). Pe de altă parte, cu picioarele porturilor, putem trage elementele circuitului conectate la pământ, fără alte adoane, deoarece acest pământ este pământul sursei de alimentare.
Alocarea specifică a biților portului 0 este prezentată în [12.2. figura]. Fig. 5 este legată de faptul că avem astfel mai mult spațiu pe panoul de testare plug-in pentru a juxtapune cu gust LED-urile cu carcasa de 5 mm, dacă sunt utilizate. (Și le folosim în acest manual.)
Soluția este acum însoțită de o diagramă de flux non-clasică, deoarece codul în sine nu este foarte complicat. Operația este acum ilustrată printr-un grafic de tranziție de stare (a se vedea [Figura 12.3]) în care stările sunt notate de vârfurile graficului. Acestea sunt notate cu inițialele în engleză ale culorilor aparținând fiecărei faze: R - roșu, roșu; RA - roșu-chihlimbar, roșu-galben; A - chihlimbar, chihlimbar, G - verde, verde. Blocurile sunt conectate la vârfurile într-o diagramă, arătând pașii efectuați acolo; desigur, doar cele mai importante din punct de vedere al funcționării. Tranzițiile dintre stări sunt reprezentate de marginile graficului, pentru care scriem condiția tranziției. Rețineți că variabila de bit suplimentară în condiții este întotdeauna setată la 1 de întreruperea asociată cu contorul de intervale. Pentru fiecare stare, semnificația desemnării TIC (Tn) este de a elibera întreruperea asociată cu contorul de intervale (TIC) cu un timp de așteptare pentru a n-a fază. Întreruperea este reprezentată grafic separat de grafic. (Pentru acest bloc, ne concentrăm doar pe bitul de pavilion.)
Rețineți că octeții de date pot fi scrise separate prin virgule, nu trebuie să le aliniați pe toate.!
Pentru ca următoarea subsecțiune să fie mai ușor de înțeles, lucrăm puțin mai departe și arătăm o altă soluție la [Sarcina 16]. Principiul soluției va fi practic același ca înainte, pur și simplu nu folosim numărarea intervalelor, ci alegem, să zicem, 1/8 secunde ca unitate. Aceasta este setată la începutul programului și nu va mai fi atinsă. Facem acest lucru setând un număr de 1/128 s cu TIMECON SFR și încărcând 16 în registrul INTVAL. Acest lucru dă felia de timp 16/128 s = 1/8 s. Subliniem încă o dată că nu schimbăm numărarea intervalului în timp ce programul rulează, unitatea sa, cu alte cuvinte felia sa de timp, va fi de 1/8 s pe toată durata rulării.
Aveți nevoie de o variabilă cu care întreruperea TIC să numere intervalele de timp trecute (numărare). Apoi, avem nevoie și de o variabilă, în care să dăm valoarea așteptării necesare pentru fiecare fază a lămpii, desigur în 1/8 s unitate (tvar). După aceea, în esență, totul se întâmplă în același mod ca și în programul anterior, cu excepția părții din program care gestionează întreruperea. Aceasta crește întotdeauna valoarea szaml cu 1 și verifică dacă valoarea sa a atins valoarea tvar. Dacă nu, crește valoarea numărării cu 1. Dacă da, suntem bine; s-au scurs toate intervalele de timp mici ale așteptării necesare și bitul ulterior poate fi setat ridicat. Asigurați-vă că porniți variabila de numărare de la 1, deoarece atunci când TIC este întrerupt pentru prima dată, intervalul de timp stabilit a trecut, adică în acest caz 1/8 s. Graficul de tranziție de stare modificat este prezentat în figura de mai jos.
Codul principiului soluției ilustrat în figura de mai sus, Code24, diferă de Code23 doar în câteva rânduri, deci numai liniile diferențelor esențiale sunt indicate în manual. Este important ca în Code24 să avem nevoie doar să inițializăm contorul de intervale și ceasul chiar la începutul programului principal. După aceea, nu le vom mai închide, deci nu este nevoie să le repornim. Din acest motiv, nu trebuie să așteptăm acum după atribuirea valorilor către INTVAL. Codul complet poate fi găsit în depozitul de coduri.
12.2. Un alt mod de a evalua relațiile
În cazul metodelor de organizare a ciclului prezentate (subsecțiunea [Secțiunea 8.3]), a fost necesar să se examineze variabila ciclului în toate cazurile. Dacă vă întrebați dacă bateria este zero sau nu zero, puteți utiliza instrucțiunile JZ sau JNZ. A fost mai complex de atât, dar instrucțiunea DJNZ a fost, de asemenea, perforată în același loc, doar că reduce conținutul registrului dat cu unul înainte de examinare. Am reușit să facem o comparație mai liberă cu instrucțiunea CJNE, care se tachină atunci când nu există egalitate. Toate acestea sunt în regulă, dar ceva încă lipsește dureros. Aceasta este pentru a evalua dacă conținutul unui registru este mai mic sau mai mare decât conținutul unui alt registru. Ei bine, nu avem alte instrucțiuni comparative, dar putem folosi una pentru acest tip de evaluare.
În plus față de declarația CJNE, putem vedea acest lucru în multe rezumate:
Un grafic de tranziție de stare este atașat la soluție (vezi [Figura 12.5]) deoarece este acum mult mai informativ decât o diagramă de flux supradimensionată. Tranzițiile care aparțin fazelor lămpii sunt considerate evenimente sau tastele care declanșează schimbarea modurilor sunt marcate ca evenimente în culori diferite: primul în negru, celălalt în roșu.
Codul fără subrutina RESET128 prezentat mai sus este mai jos. Acest cod este acum destul de complex, dar graficul de tranziție de stat poate fi un mare ajutor pentru a ne împiedica să ne pierdem în el. În același timp, îl liniștim pe cititor; codul mai lung decât acesta nu va mai apărea în acest manual. La începutul programului, imediat după atribuirea unei valori registrului INTVAL, mult menționata scurtă așteptare nu este inclusă, pentru că la scurt timp după aceea numim subprogramul RESET128, care îl conține oricum; imediat la prima fază a lămpii de funcționare normală. Nu detaliați datele la sfârșitul codului, deoarece acestea sunt exact aceleași cu cele date în Code23. În cod, folosim marcaje colorate pentru a distinge în mod clar părțile care aparțin fiecărui mod.
În Code25, gestionarea întreruperilor este deja o soluție foarte sofisticată. Cu toate acestea, acest stil „centrat” poate fi găsit de cititor ca fiind puțin deprimant. Nicio problemă, arătăm o soluție diferită pentru [Problema 17]. A [12.5. figura]. Graficul de tranziție de stare prezentat în Figura 1 rămâne neschimbat. Cheia soluției este acum să scoateți din nou vechiul subrutin DELAY, dar să îl modificați puțin. Acum, acest lucru se va ocupa de așteptarea necesară pentru fazele date ale lămpii, dar vom încorpora monitorizarea bitului de apăsare a butonului. Mergeți adânc în bucla cea mai interioară pentru a scana bitul cât mai des posibil. Funcția de întrerupere a contorului de intervale este acum redusă pentru a elimina deriva. La fel ca și în rezolvarea [Problemei 15] (vezi Code22). Întreruperea apăsării tastei este extinsă cu o singură linie în comparație cu Code25: pornind contorul de intervale.
Subrutina temporizatorului este proiectată pentru a fi apelată cu exact aceleași timpi de așteptare ca și Code24 și Code25. Aceasta înseamnă că, dacă conținutul bateriei este de 8 la apelare, vom aștepta o secundă. Să ne uităm la subrutina modificată:
Și acum calculăm din nou cât timp durează să ruleze subrutina. Luați valoarea bateriei la 8! Instrucțiunea NOP încorporată în subrutina DELAY simplă durează 1 ciclu de ceas, bitul JB încorporat în subrutina GDELAY necesită 4 relee, în timp ce instrucțiunea rel necesită 4. Deci, întreaga rutină este acum totală
2 + (2 + (2 + (4 + 3) · 249 + 3) · 150 + 3) · 8 + 4 = 2.097.646
necesită un ciclu de ceas. La o viteză de ceas implicită de 2.097.152 Hz, aceasta înseamnă 1.0002 s.
Sufletul soluției actuale este că subrutina de tragere a timpului, dacă nu face deja altceva decât timpul, este excelentă pentru a verifica cât mai des posibil dacă bitul de apăsare a tastei (urmă) a fost înclinat la 1 Dacă da, se termină imediat și rulajul său este întrerupt. Imediat după apelarea subrutinei din programul principal, examinăm, pentru a doua oară acum, care este valoarea bitului de semnalizare. Dacă este 1, controlul a revenit prematur din subrutină. Și asta înseamnă că putem trece la următorul mod. În programul de mai jos, subrutina care trage timpul nu se mai repetă. Nici vectorii întreruperilor nu sunt, deoarece rămân neschimbate.
Comparând Code25 și Code26, putem vedea că acesta din urmă este puțin mai scurt și necesită mai puține variabile. Ambele oferă o soluție instructivă, dar într-un stil complet diferit. Cititorul este încurajat să analizeze și să înțeleagă pe deplin ambele; în fiecare detaliu! Ai putea simți cu ușurință o simpatie mult mai puternică pentru unul decât pentru celălalt. Cu toate acestea, este treaba ta să alegi când cu ce stil îți vei atinge obiectivul mai ușor sau doar mai elegant. Și, desigur, cititorul poate pune în aplicare și o a treia idee, radical diferită de cele două de mai sus, și o poate considera cea mai bună ...
- Încărcător de urgență, powerbank, baterie externă ✔️ Prețuri și cumpără Extreme Digital
- Capitolul 4 - Pasul 2: mese regulate
- Capitolul 8 - Analiza arborelui evenimentelor (ETA)
- MATERIAL DE LUCRU. József Farkas. Circuite pentru circuite digitale. Interpretarea și pregătirea schemelor de circuit. Denumirea modulului de cerințe:
- Capitolul 10: Rola Kosher Torah