Programare în limbaj de asamblare pentru începători cu exemple de programe. Agenția Federală pentru Educație a Federației Ruse

Salut!
Vreau să arăt cum este scris un program pentru a controla echipamentele tehnologice de pe un PLC.
Cel mai adesea, m-am ocupat de PLC-uri fabricate de Schneider Electric. Quantum-ul pe care l-am ales pentru această sarcină este cel mai puternic și mai scump PLC de la acest producător. Poate controla echipamentele cu mii de semnale; în viața reală, nimeni, desigur, nu-l va folosi pentru un semafor.

Nu am fost niciodată implicat în automatizarea semafoarelor, așa că am venit eu însumi cu algoritmul. Aici era:
1. Semafor pentru trecere de pietoni reglabilă. Acestea. un semafor pentru autoturisme, un semafor pentru pietoni si un buton pentru pietoni, prin apasarea caruia, pietonul anunta dorinta de a traversa drumul.
2. După începerea programului, se aprinde verde pentru mașini și roșu pentru pietoni.
3. Când butonul este apăsat de un pieton, verdele pentru vehicule clipește, apoi galben, apoi roșu. După aceea, se aprinde verde pentru pietoni, după un timp prestabilit începe să clipească, se aprinde roșu pentru pietoni, apoi galben și roșu pentru mașini, apoi verde.
4. Într-o anumită perioadă de timp după o lumină verde la un semafor pentru pietoni, apăsarea butonului de către un pieton nu pornește algoritmul de tranziție. Algoritmul de tranziție începe în acest caz numai după ce timpul specificat a trecut.
Programarea PLC se realizează în mediul de programare Unity în limbile standardului IEC 61131-3. Acest standard include 5 limbi. De exemplu, am ales limbajul blocurilor funcționale - FBD.
Iată browserul de proiect în Unity:

Configurarea PLC-ului:


PLC-ul constă dintr-un panou de montare, o sursă de alimentare (1), un controler (2), un modul de intrare discretă pentru semnale de 32 de 24 V DC (4), un modul de intrare discretă pentru semnale de 32 de 24 V DC (5). Într-un proiect real, pot exista zeci de panouri de montare conectate la un controler prin diferite rețele și sute de module I/O.
Creați variabile de tipurile necesare în editorul de variabile:


Variabilele legate la canalele modulelor I/O au o adresă care indică la ce găleată, modul și canal este legat semnalul.
Programul constă din secțiuni care sunt executate în ordine în fiecare ciclu al scanării controlerului.
Simplificat, ciclul de scanare a controlerului arată astfel:
1. Citirea semnalelor de intrare de la modulul de intrare în variabile cu adrese.
2. Efectuarea secțiunilor.
3. Scrierea valorilor din variabilele cu adrese la semnalele de ieșire ale modulelor de ieșire.
4. Treceți la pasul 1.
Creați o secțiune de ceas cu un generator de impulsuri cu o perioadă de 0,5 secunde. Blocul TP, când semnalul de intrare se schimbă de la 0 la 1, emite un impuls de o durată dată la ieșire.


Aici și mai jos, capturile de ecran ale secțiunilor sunt afișate în modul animație, nu în modul editare. Acestea afișează valorile variabilelor la ora curentă atunci când sunt conectate la un PLC cu un program încărcat (numerele pentru variabile numerice, culoarea verde (1)-roșu (0) pentru boolean).
Secțiunea principală se ocupă de logica principală.
Blocul SR setează ieșirea la 1 când S1=1 și resetează ieșirea la 0 când R=1.
Blocul R_TRIG setează ieșirea pentru 1 ciclu de scanare la 1 atunci când intrarea trece de la 0 la 1 (detector de front ascendent).
Blocul F_TRIG setează ieșirea pentru 1 ciclu de scanare la 1 atunci când intrarea trece de la 1 la 0 (detectorul de margine de fugă).
Variabila inButton legată de canalul butonului a fost înlocuită în secțiune cu inButtonForTest pentru a-și putea schimba valoarea pe un simulator de controler fără hardware real.


Secțiunea Ieșiri generează semnale de ieșire pentru controlul semafoarelor.


Încărcarea proiectului în simulatorul controlerului:


Valoarea oricăror variabile poate fi vizualizată în tabelul de animație:


Dar pentru comoditatea depanării, puteți crea un ecran de operator cu grafică simplă, a cărei animație este legată de variabile:

Să încercăm să traversăm drumul:

Nu mă așteptam să fie necesare 30 de blocuri pentru a controla un obiect atât de simplu precum un semafor.
În următorul articol, vă voi arăta cum să scrieți acest program folosind toate limbile IEC 61131-3 în același timp.

UPD. S-a corectat o eroare în numele standardului.

(Forme), (Panou).

Înainte de a crea o aplicație, ar trebui să revizuiți descrierea noilor componente.

Sarcina. Simulați un semafor. La începerea proiectului, panoul semaforului ar trebui să fie gol. După apăsarea butonului Start, becurile semaforului încep să se comute. După apăsarea butonului Stop, panoul semaforului este din nou gol. Folosind un cronometru, asigurați-vă că semnalul rutier se schimbă la intervale regulate. Introduceți intervalul cronometrului în câmpul Viteză.

Progresul proiectului

1. Creați un nou proiect. Salvați-l într-un folder separat, denumiți-l „Semafor”.

2. Așezați pe formular un panou (TPanel) cu trei forme (TShape), două butoane (TButton), un câmp de text (TEdit), o inscripție (TLabel), un cronometru (TTimer) conform eșantionului:

Ar trebui să arate așa:

2. Realizarea designului:

Setați valorile proprietăților date în inspectorul de obiecte:

Componentă Proprietate Sens
Formularul 1 Legendă Semafor
Panoul 1 Legendă *Gol*
Forma 1 formă stCircle
Forma 2 formă stCircle
Forma 3 formă stCircle
Eticheta 1 Legendă Viteză
Editare1 Text *gol*
Butonul 1 Legendă start
Butonul2 Legendă Stop

3. Creăm un eveniment pentru Form1 în secțiunea OnCreate - Apăsați punctele de suspensie

Creați un eveniment pentru Timer1 în secțiunea OnTimer - Apăsați punctele de suspensie

4. Setați culorile pentru forme:

Lucrare finala:

5. În timp ce formularul se încarcă, temporizatorul este dezactivat, formele de pe panou devin invizibile.

Creați un handler de evenimente pentru evenimentul FormCreate (faceți dublu clic pe componenta Form1) și inserați acest cod:

vark:întreg; procedura TForm1.FormCreate(Sender: TObject); start Timer1.Enabled:=false; Forma1.Vizibil:=fals; Forma2.Vizibil:=fals; Forma3.Vizibil:=fals; Sfârșit;

6. Pentru a comuta becurile semaforului, scrieți codul programului în gestionarea evenimentelor Timer1Timer. Acest cod va fi executat la intervalul pe care utilizatorul îl introduce în câmpul Viteză. În funcție de cronometru, se determină numărul becului care ar trebui să se aprindă în acest moment.

Faceți dublu clic pe componenta Timer1 și inserați acest cod:

6. Scrieți codul butonului de pornire. Făcând clic pe butonul, intervalul pentru temporizator este citit din câmpul Viteză, citirile temporizatorului sunt setate la zero și temporizatorul este pornit.

Faceți dublu clic pe componenta Button1 și inserați codul:

procedura TForm1.Button1Click(Expeditor: TObject); începe Timer1.Interval:=StrToInt(Edit1.text); k:=0; Timer1.Enabled:=adevărat; Sfârșit;

7. Scrieți codul programului pentru butonul Stop. După apăsarea butonului, cronometrul ar trebui să se oprească, becurile semaforului devin din nou invizibile.

Faceți dublu clic pe componenta Button2 și inserați codul:

procedura TForm1.Button2Click(Expeditor: TObject); start Timer1.Enabled:=false; Forma1.Vizibil:=fals; Forma2.Vizibil:=fals; Forma3.Vizibil:=fals; Sfârșit;

8. Rulați proiectul. În câmpul Viteză, introduceți numărul 1000 (1000ms=1s). Semafoarele vor începe să treacă la intervale de o secundă.

Artem Poznyak, elev clasa a 10-a „A”, școala gimnazială nr. 23, Ekibasbuz

Când fiul meu lipea un model de semafor din hârtie pentru școală, a venit gândul: „De ce să nu asamblați un model funcțional de semafor pentru el pe un microcontroler”. Pe Internet, există multe scheme și programe pentru ei care implementează principiul unui semafor simplu. Dar ele fie sunt prea complexe pentru o jucărie (convertor DC-DC, registre de deplasare etc.) fie sunt prezentate doar ca exemplu de program simplu de asamblare. Aș dori să vă arăt schema de circuit și codul de asamblare al unui semafor complet de jucărie, cu câteva caracteristici suplimentare. Mai mult, este asamblat pe un microcontroler „penny” conform celei mai simple scheme, care este importantă pentru începători. Sper că acest circuit simplu va fi pentru mulți care încep să învețe programarea microcontrolerelor PIC, primul design asamblat efectiv pe un PIC. Simplu, dar conținând în același timp tehnicile și atributele de bază ale programării, programul va face ușor de înțeles și experimentat cu el.

Oricine se ocupă cu programarea microcontrolerelor cunoaște principiile de bază ale scrierii manipulatorilor de întreruperi: timp de execuție cât mai scurt și cod scurt posibil, fără bucle și apeluri de la handler către alte subrutine etc. În acest caz, întreruperile sunt permise doar pentru schimbarea nivelului (nu putem sări peste alte întreruperi, deoarece pur și simplu nu există), iar eu, pentru a simplifica programul și percepția lui, am găsit posibil să mă abată de la aceste principii. Aici, în manipulatorul de întreruperi, există bucle și un apel către o altă subrutină și (horror!) chiar o tranziție la modul SLEEP. Prin urmare, în titlu programul este numit „greșit”. În acest caz, manipulatorul de întreruperi este utilizat ca subrutină normală, însă, în alte cazuri, principiile de mai sus, desigur, rămân în vigoare.

Scurte caracteristici ale dispozitivului:

Aparatul este un model de semafor stradal cu o simulare fiabilă a funcționării acestuia (schimbarea culorilor, verde intermitent) și are funcții suplimentare: schimbarea frecvenței de comutare prin apăsarea unui buton, modul galben intermitent, trecerea în modul de repaus în mod manual și automat modul, urmat de pornire prin apăsarea unui buton. Acest dispozitiv poate fi folosit ca o jucărie pentru copii, precum și ca ajutor vizual în grădinițe atunci când îi învață pe copii cum să se comporte pe drumuri.

Deci, să trecem la descrierea și luarea în considerare a circuitului.

Circuitul este asamblat pe un microcontroler PIC12F629 ieftin. Ieșirile GP0-GP2, GP4, GP5 (picioarele 7, b, 5, 3, 2) programate ca ieșiri sunt utilizate direct pentru a controla LED-urile. LED-urile din fiecare direcție sunt grupate în serie pentru a minimiza consumul de curent. Rezistoarele R3-R8 limitează curenții LED. În cazul unei diferențe puternice în ieșirea LED-urilor de diferite culori, va trebui să selectați rezistențele adecvate. De exemplu, am două grupuri galbene conectate în paralel și conectate la același rezistor, și aceeași valoare ca restul și strălucesc chiar și puțin mai strălucitor decât celelalte (returul este mai mare).

În acest circuit, LED-urile sunt alimentate cu 1,5 V mai mult decât microcontrolerul de la un element suplimentar (în acest caz, când ieșirea este oprită, curentul nu trece la ieșirea microcircuitului, deoarece este nevoie de mult mai multă tensiune pentru deschideți tranzițiile a două LED-uri de peste 1,5 V (cel puțin 2,5 C). Și chiar și cu ambele LED-uri rupte (ceea ce este puțin probabil), curentul prin dioda de protecție internă la plusul sursei de alimentare va fi de aproximativ 7,5 mA, ceea ce este mult mai mic decat admisibil.Consumul de curent al LED-urilor este mult mai mare decat consumul MK, prin urmare, diferenta de descarcare a elementelor (printr-unul nu curge consumul de curent al MC) poate fi neglijata. s-a stabilit experimental că, în ciuda scăderii curentului prin LED-uri atunci când bateria este descărcată, luminozitatea strălucirii acestora rămâne la un nivel acceptabil pe toată gama de tensiune a bateriei.Circuitul este extrem de simplificat și nu există stabilizator de tensiune. care consumă un curent suplimentar, ceea ce a făcut posibilă abandonarea comutatorului de alimentare (consum de curent în modul de repaus - 1-3 m kA).

Butonul pentru controlul modurilor de funcționare ale dispozitivului este conectat la pinul GP3 (pin 4), care este declarat ca intrare digitală în biții de configurare. La apăsarea butonului, are loc o întrerupere, în al cărei handler are loc următoarele. Când este apăsat mult timp (mai mult de 4 s), dispozitivul intră în modul de repaus. Cu apăsări mai scurte, viteza semaforului este comutată secvenţial într-un cerc cu indicarea vitezei curente conform figurii.

În ultimul mod (LED-urile roșii sunt aprinse), modul semnal galben intermitent este activat. Când butonul este apăsat mult timp (confirmat de stingerea tuturor LED-urilor), trecem la funcționarea normală cu schimbarea modului la unul nou, dar dacă butonul nu este apăsat mai mult de 6 secunde, modul de funcționare rămâne la fel ca înainte de a apăsa butonul.

Încărcarea celulelor AA în modul de repaus va dura cel puțin un an, motiv pentru care dispozitivul nu are întrerupător de alimentare. Dispozitivul intră în modul de repaus și după 0,5 - 1 oră (în funcție de viteza de schimbare a culorilor) de lucru fără a apăsa butonul. Modul SLEEP este ieșit prin orice apăsare de buton. Alimentarea microcontrolerului este furnizată prin pinii 1 și 8. Pentru a salva pinii și a simplifica designul, acesta are un mod de generator intern fără elemente externe.

Mici explicații pentru program, care este dat în atașament.

Procesarea apăsărilor de butoane se realizează în subrutine: wait_butt__ - așteptarea apăsării și înregistrarea 6 secunde. fără apăsare, push_butt__ - înregistrarea duratei apăsării, wait_nobutt__ - așteptarea unui buton neapăsat. În momentul schimbării stării semaforului (galben și verde intermitent), valorile de pe portul de ieșire sunt citite din tabel în subrutina tact__ (nibbles scăzute sau mari). În mod similar, indicația de stare atunci când este apăsat un buton este din subrutina ind__. Pentru a intra în modul de repaus după ce a trecut timpul de rulare, are loc o tranziție forțată la rutina de gestionare a întreruperilor, prin setarea programatică a semnalizatorului de întrerupere. Prin modificarea constantelor CONST_MIN, CONST_REG, CONST_SL se pot modifica, respectiv, perioada de verde intermitent, modul initial cand bateria este conectata, timpul de functionare fara influenta inainte de a trece in modul SLEEP.

Placa de circuit imprimat este realizata din folie de fibra de sticla cu o singura fata si are dimensiunile de 22x87 mm. LED-urile de margine sunt instalate paralel cu placa în direcții diferite. Cele din mijloc sunt instalate unul din partea de instalare a pieselor, iar celălalt - din partea laterală a șinelor, cu filetarea cablurilor în găurile plăcii și fixându-le din partea pieselor cu o picătură de lipit, iar din lateralul șenilelor prin lipire la șenile corespunzătoare.

Toate rezistențele sunt de 0,125 W. Poti lua orice LED-uri autohtone sau importate, de preferinta de acelasi tip cu o cadere directa de tensiune la un curent de 10 mA, aproximativ 2 Volti. Buton - orice fără blocare. Microcontrolerul este instalat pe bloc.

Cuvântul de configurare este introdus în memorie automat la încărcarea firmware-ului („pasărea” este setată numai în elementul „PWRT”, restul elementelor sunt „resetate”, coloana „oscilator” este setată la „intOSC GP4” ). În primul rând, trebuie să citiți firmware-ul dintr-un microcircuit gol și să scrieți valoarea cuvântului la sfârșitul memoriei programului la adresa 03FF, care este necesară pentru a regla frecvența oscilatorului intern al unei anumite instanțe de microcircuit. După încărcarea fișierului HEX în program, trebuie să introduceți manual această valoare la adresa 03FF. În acest dispozitiv, abaterea de frecvență nu este critică, dar ar trebui să știți totuși că o astfel de procedură este necesară pentru acest microcircuit. În cazuri extreme, dacă valoarea din fabrică este pierdută, nu puteți face nimic - programul a luat măsuri pentru a funcționa corect și în acest caz.

Dispozitivul este plasat într-o cutie de plastic adecvată. Pentru LED-urile din cutie și capac sunt făcute găuri corespunzătoare. In varianta mea, semaforul in sine si baza cu butonul si bateria sunt conectate printr-o bucata de conducta de apa din plastic cu diametrul de 20 mm.

Aplicația conține: un model, o placă de circuit imprimat în format LAY, un program de asamblare MPASM, un fișier firmware HEX.

Lista elementelor radio

Desemnare Tip Denumirea Cantitate NotăMagazinBlocnotesul meu
IC1 MK PIC pe 8 biți

PIC12F629

1 DIP La blocnotes
R1 Rezistor

3 kOhm

1 0,125 W La blocnotes
R2 Rezistor

100 ohmi

1 0,125 W La blocnotes
R3-R8 Rezistor

200 ohmi

6 0,125 W La blocnotes
HL1, HL2, HL9, HL10 Dioda electro luminiscenta

AL307A

4 ROȘU La blocnotes
HL3, HL4, HL11, HL12 Dioda electro luminiscenta

Când fiul meu lipea un model de semafor din hârtie pentru școală, a venit gândul: „De ce să nu asamblați un model funcțional de semafor pentru el pe un microcontroler”. Pe Internet, există multe scheme și programe pentru ei care implementează principiul unui semafor simplu. Dar ele fie sunt prea complexe pentru o jucărie (convertor DC-DC, registre de deplasare etc.) fie sunt prezentate doar ca exemplu de program simplu de asamblare. Aș dori să vă arăt schema de circuit și codul de asamblare al unui semafor complet de jucărie, cu câteva caracteristici suplimentare. Mai mult, este asamblat pe un microcontroler „penny” conform celei mai simple scheme, care este importantă pentru începători. Sper că acest circuit simplu va fi pentru mulți care încep să învețe programarea microcontrolerelor PIC, primul design asamblat efectiv pe un PIC. Simplu, dar conținând în același timp tehnicile și atributele de bază ale programării, programul va face ușor de înțeles și experimentat cu el.

Oricine se ocupă cu programarea microcontrolerelor cunoaște principiile de bază ale scrierii manipulatorilor de întreruperi: timp de execuție cât mai scurt și cod scurt posibil, fără bucle și apeluri de la handler către alte subrutine etc. În acest caz, întreruperile sunt permise doar pentru schimbarea nivelului (nu putem sări peste alte întreruperi, deoarece pur și simplu nu există), iar eu, pentru a simplifica programul și percepția lui, am găsit posibil să mă abată de la aceste principii. Aici, în manipulatorul de întreruperi, există bucle și un apel către o altă subrutină și (horror!) chiar o tranziție la modul SLEEP. Prin urmare, în titlu programul este numit „greșit”. În acest caz, manipulatorul de întreruperi este utilizat ca subrutină normală, însă, în alte cazuri, principiile de mai sus, desigur, rămân în vigoare.

Scurte caracteristici ale dispozitivului:

Aparatul este un model de semafor stradal cu o simulare fiabilă a funcționării acestuia (schimbarea culorilor, verde intermitent) și are funcții suplimentare: schimbarea frecvenței de comutare prin apăsarea unui buton, modul galben intermitent, trecerea în modul de repaus în mod manual și automat modul, urmat de pornire prin apăsarea unui buton. Acest dispozitiv poate fi folosit ca o jucărie pentru copii, precum și ca ajutor vizual în grădinițe atunci când îi învață pe copii cum să se comporte pe drumuri.

Deci, să trecem la descrierea și luarea în considerare a schemei:

Circuitul este asamblat pe un microcontroler ieftin. Ieșirile GP0-GP2, GP4, GP5 (picioarele 7, b, 5, 3, 2) programate ca ieșiri sunt utilizate direct pentru a controla LED-urile. LED-urile din fiecare direcție sunt grupate în serie pentru a minimiza consumul de curent. Rezistoarele R3-R8 limitează curenții LED. În cazul unei diferențe puternice în ieșirea LED-urilor de diferite culori, va trebui să selectați rezistențele adecvate. De exemplu, am două grupuri galbene conectate în paralel și conectate la același rezistor, și aceeași valoare ca restul și strălucesc chiar și puțin mai strălucitor decât celelalte (returul este mai mare).

În acest circuit, LED-urile sunt alimentate cu 1,5 V mai mult decât microcontrolerul de la un element suplimentar (în acest caz, când ieșirea este oprită, curentul nu trece la ieșirea microcircuitului, deoarece este nevoie de mult mai multă tensiune pentru deschideți tranzițiile a două LED-uri de peste 1,5 V (cel puțin 2,5 C). Și chiar și cu ambele LED-uri rupte (ceea ce este puțin probabil), curentul prin dioda de protecție internă la plusul sursei de alimentare va fi de aproximativ 7,5 mA, ceea ce este mult mai mic decat admisibil.Consumul de curent al LED-urilor este mult mai mare decat consumul MK, prin urmare, diferenta de descarcare a elementelor (printr-unul nu curge consumul de curent al MC) poate fi neglijata. s-a stabilit experimental că, în ciuda scăderii curentului prin LED-uri atunci când bateria este descărcată, luminozitatea strălucirii acestora rămâne la un nivel acceptabil pe toată gama de tensiune a bateriei.Circuitul este extrem de simplificat și nu există stabilizator de tensiune. care consumă un curent suplimentar, ceea ce a făcut posibilă abandonarea comutatorului de alimentare (consum de curent în modul de repaus - 1-3 m kA).

Butonul pentru controlul modurilor de funcționare ale dispozitivului este conectat la pinul GP3 (pin 4), care este declarat ca intrare digitală în biții de configurare. Când butonul este apăsat, are loc o întrerupere, în al cărei handler are loc următoarele. Când este apăsat mult timp (mai mult de 4 s), dispozitivul intră în modul de repaus. Cu apăsări mai scurte, viteza semaforului este comutată succesiv într-un cerc cu o indicație a vitezei curente conform figurii:

În ultimul mod (LED-urile roșii sunt aprinse), modul semnal galben intermitent este activat. Când butonul este apăsat mult timp (confirmat de stingerea tuturor LED-urilor), trecem la funcționarea normală cu schimbarea modului la unul nou, dar dacă butonul nu este apăsat mai mult de 6 secunde, modul de funcționare rămâne la fel ca înainte de a apăsa butonul.

Încărcarea celulelor AA în modul de repaus va dura cel puțin un an, motiv pentru care dispozitivul nu are întrerupător de alimentare. Dispozitivul intră în modul de repaus și după 0,5 - 1 oră (în funcție de viteza de schimbare a culorii) de funcționare fără a apăsa butonul. Modul SLEEP este ieșit prin orice apăsare de buton. Alimentarea microcontrolerului este furnizată prin pinii 1 și 8. Pentru a salva pinii și a simplifica designul, acesta are un mod de generator intern fără elemente externe.

O mică explicație despre program, care este dată în atașament:

Procesarea apăsărilor de butoane se realizează în subrutine: wait_butt__ - așteptarea apăsării și înregistrarea 6 secunde. fără apăsare, push_butt__ - înregistrarea duratei apăsării, wait_nobutt__ - așteptarea unui buton neapăsat. În momentul schimbării stării semaforului (galben și verde intermitent), valorile de pe portul de ieșire sunt citite din tabel în subrutina tact__ (nibbles scăzute sau mari). În mod similar, indicația de stare atunci când este apăsat un buton este din subrutina ind__. Pentru a intra în modul de repaus după ce a trecut timpul de rulare, are loc o tranziție forțată la rutina de gestionare a întreruperilor, prin setarea programatică a semnalizatorului de întrerupere. Prin modificarea constantelor CONST_MIN, CONST_REG, CONST_SL se pot modifica, respectiv, perioada de verde intermitent, modul initial cand bateria este conectata, timpul de functionare fara influenta inainte de a trece in modul SLEEP.

Placa de circuit imprimat este realizata din folie de fibra de sticla cu o singura fata si are dimensiunile de 22x87 mm. LED-urile de margine sunt instalate paralel cu placa în direcții diferite. Cele din mijloc sunt instalate una din partea de instalare a pieselor, iar cealaltă din partea laterală a șinelor, filetând cablurile în găurile plăcii și fixându-le din partea pieselor cu o picătură de lipit și din partea laterală a șinelor prin lipire la șinele corespunzătoare.

Toate rezistențele sunt de 0,125 W. Poti lua orice LED-uri autohtone sau importate, de preferinta de acelasi tip cu o cadere directa de tensiune la un curent de 10 mA, aproximativ 2 Volti. Buton - oricare fără fixare. Microcontrolerul este instalat pe bloc.

Cuvântul de configurare este introdus în memorie automat când firmware-ul este încărcat (în IC-Prog, o „pasăre” este setată doar în elementul „PWRT”, restul elementelor sunt „resetate”, „intOSC GP4” este setat în coloana „oscilator”). În primul rând, trebuie să citiți firmware-ul dintr-un microcircuit gol și să scrieți valoarea cuvântului la sfârșitul memoriei programului la adresa 03FF, care este necesară pentru a regla frecvența oscilatorului intern al unei anumite instanțe de microcircuit. După încărcarea fișierului HEX în program, trebuie să introduceți manual această valoare la adresa 03FF. În acest dispozitiv, abaterea de frecvență nu este critică, dar ar trebui să știți totuși că o astfel de procedură este necesară pentru acest microcircuit. În cazuri extreme, dacă valoarea din fabrică este pierdută, nu puteți face nimic - programul a luat măsuri pentru a funcționa corect și în acest caz.

Dispozitivul este plasat într-o cutie de plastic adecvată. Pentru LED-urile din cutie și capac sunt făcute găuri corespunzătoare. In varianta mea, semaforul in sine si baza cu butonul si bateria sunt conectate printr-o bucata de conducta de apa din plastic cu diametrul de 20 mm.

Mulți oameni cred că Assembler este deja învechit și nu este folosit nicăieri, dar în cea mai mare parte aceștia sunt tineri care nu sunt implicați profesional în programarea sistemului. Dezvoltarea software, desigur, este bună, dar spre deosebire de limbajele de programare de nivel înalt, Assembler vă va învăța să înțelegeți profund funcționarea unui computer, să optimizați munca cu resurse hardware și să programați orice tehnică, dezvoltându-vă astfel în direcția învățării automate. Pentru a înțelege acest limbaj străvechi, cel mai bine este să începeți prin a exersa cu programe simple care explică cel mai bine funcționalitatea Assembler.

IDE pentru Asamblator

Prima întrebare este: în ce mediu de dezvoltare programezi în assembler? Raspunsul este clar - MASM32. Acesta este programul standard care este utilizat pentru acest PL. Îl puteți descărca de pe site-ul oficial masm32.com ca arhivă, pe care va trebui să o despachetați și apoi să rulați programul de instalare install.exe. Ca alternativă, puteți utiliza FASM, dar codul pentru acesta va fi semnificativ diferit.

Înainte de muncă, principalul lucru este să nu uitați să adăugați linia la variabila de sistem PATH:

C:\masm32\bin

Programul „Hello world” în asamblare

Se crede că acesta este programul de bază în programare, pe care începătorii îl scriu mai întâi atunci când se familiarizează cu limbajul. Poate că această abordare nu este în întregime corectă, dar într-un fel sau altul vă permite să vedeți imediat un rezultat vizual:

386 .model flat, stdcall opțiune casemap: niciunul lib/kernel32.lib .data msg_title db „Title”, 0 msg_message db „Hello world”, 0 .code start: invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK invoke ExitProcess , 0 sfârşit început

Mai întâi, lansăm editorul qeditor.exe în folderul cu MASM32 instalat și scriem codul programului în el. După ce îl salvăm ca fișier cu extensia „.asm”, și construim programul folosind elementul de meniu „Proiect” → „Build all”. Dacă nu există erori în cod, programul se va compila cu succes, iar la ieșire vom obține un fișier exe gata făcut care va afișa o fereastră Windows cu inscripția „Hello world”.

Adăugarea a două numere pe asamblator

În acest caz, căutăm să vedem dacă suma numerelor este egală cu zero sau nu. Dacă da, atunci pe ecran apare un mesaj corespunzător despre acesta, iar dacă nu, apare o altă notificare.

486 .model plat, opțiune stdcall casemap: niciunul lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov ebx, -90 add eax, ebx test eax, eax jz zero invocă MessageBox, 0, chr$("În eax nu este 0!"), chr$("Informații"), 0 jmp lexit zero: invocă MessageBox, 0, chr$ ("În eax 0!" ), chr$("Info"), 0 lexit: invoke ExitProcess, 0 end start

Aici folosim așa-numitele etichete și comenzi speciale cu utilizarea lor (jz, jmp, test). Să aruncăm o privire mai atentă:

  • test - folosit pentru a compara logic variabile (operanzi) sub formă de octeți, cuvinte sau cuvinte duble. Pentru comparație, comanda folosește înmulțirea logică și se uită la biți: dacă aceștia sunt egali cu 1, atunci bitul rezultatului va fi egal cu 1, în caz contrar - 0. Dacă am primit 0, steagurile sunt setate împreună cu ZF ( steag zero), care va fi egal cu 1. Rezultatele sunt analizate în continuare pe baza ZF.
  • jnz - dacă steagul ZF nu a fost setat nicăieri, saltul se face la această etichetă. Adesea, această comandă este utilizată dacă programul are operații de comparare care afectează cumva rezultatul ZF. Acestea includ doar test și cmp.
  • jz - dacă steagul ZF a fost încă setat, eticheta este sărită.
  • jmp - indiferent dacă există sau nu un ZF, se face un salt pe etichetă.

Programul Sumei Asamblatorului

Un program primitiv care arată procesul de însumare a două variabile:

486 .model flat, opțiune stdcall casemap: niciunul lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Titlu", 0 A DB 1h B DB 2h buffer db( 128 ?) format db „%d”,0 .code start: MOV AL, A ADD AL, B invoke wsprintf, addr buffer, addr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start

În Assembler, pentru a calcula suma, vor fi necesare o mulțime de acțiuni, deoarece limbajul de programare funcționează direct cu memoria sistemului. Aici, în cea mai mare parte, manipulăm resurse și indicăm independent cât să alocăm pentru o variabilă, sub ce formă să percepem numerele și unde să le punem.

Obținerea valorii din linia de comandă în asamblator

Una dintre acțiunile de bază importante în programare este obținerea datelor din consolă pentru procesare ulterioară. În acest caz, le obținem din linia de comandă și le afișăm în fereastra Windows:

486 .model flat, opțiune stdcall casemap: niciunul lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: call GetCommandLine ; rezultatul va fi plasat în eax push 0 push chr$("Linie de comandă") push eax ; luăm textul pentru ieșire de la eax push 0 call MessageBox push 0 call ExitProcess end start

De asemenea, puteți utiliza o metodă alternativă:

486 .model flat, opțiune stdcall casemap: niciunul lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: call GetCommandLine ; rezultatul va fi plasat în eax invoke GetCommandLine invoke MessageBox, 0, eax, chr$("Command Line"), 0 invoke ExitProcess, 0 push 0 call ExitProcess end start

Invoke este folosit aici - o macrocomandă specială care simplifică codul programului. În timpul compilării, comenzile macro sunt convertite în instrucțiuni de asamblare. Într-un fel sau altul, folosim stiva - un mod primitiv de stocare a datelor, dar în același timp foarte convenabil. Prin convenție, stdcall, în toate funcțiile WinAPI, variabilele sunt trecute prin stivă, doar în ordine inversă, și plasate în registrul eax corespunzător.

Bucle în asamblator

Utilizare caz:

Date msg_title db „Titlu”, 0 A DB 1h buffer db 128 dup(?) format db „%d”,0 .code start: mov AL, A .REPEAT inc AL .UNTIL AL==7 invoke wsprintf, addr buffer, format addr, AL invocă MessageBox, 0, buffer addr, addr msg_title, MB_OK invocă ExitProcess, 0 end start .data msg_title db „Titlu”, 0 buffer db 128 dup(?) format db „%d”,0 .code start: mov eax, 1 mov edx, 1 .WHILE edx==1 inc eax .IF eax==7 .BREAK .ENDIF .ENDW invoke wsprintf, addr buffer, addr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invocați ExitProcess, 0

Comanda de repetare este folosită pentru a crea o buclă. Mai mult, folosind inc, valoarea variabilei este incrementată cu 1, indiferent dacă este în RAM sau în procesorul însuși. Pentru a întrerupe bucla, este folosită directiva „.BREAK”. Poate să oprească ciclul și să își continue acțiunea după „pauză”. De asemenea, puteți întrerupe execuția codului programului și verificați starea de repetare și în timp, folosind directiva „.CONTINUE”.

Suma elementelor matricei de pe asamblator

Aici însumăm valorile variabilelor din matrice folosind o buclă „for”:

486 .model flat, opțiune stdcall casemap: niciunul lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Titlu", 0 A DB 1h x dd 0,1,2, 3,4,5,6,7, 8,9,10,11 n dd 12 buffer db 128 dup(?) format db „%d”,0 .code start: mov eax, 0 mov ecx, n mov ebx, 0 L: adăugați eax, x adăugați ebx, tip x dec ecx cmp ecx, 0 jne L invocă wsprintf, buffer addr, format addr, eax invocă MessageBox, 0, buffer addr, addr msg_title, MB_OK invocă ExitProcess, 0 end start

Comanda dec, ca și inc, schimbă valoarea operandului cu unul, doar în sens opus, la -1. Dar cmp compară variabile folosind metoda scăderii: scade o valoare din a doua și, în funcție de rezultat, setează steagurile corespunzătoare.

Comanda jne sare la o etichetă bazată pe rezultatul comparației variabilei. Dacă este negativă, are loc o tranziție, iar dacă operanzii nu se egalează între ei, tranziția nu este efectuată.

Asamblatorul este interesant în reprezentarea variabilelor, ceea ce vă permite să faceți tot ce doriți cu ele. Un specialist care înțelege toate complexitățile acestui limbaj de programare are cunoștințe cu adevărat valoroase care au multe moduri de a-l folosi. O problemă poate fi rezolvată într-o varietate de moduri, așa că calea va fi spinoasă, dar nu mai puțin interesantă.

Vizualizări post: 767