A intra
Toate secretele computerului pentru începători și profesioniști
  • Cel mai bun jucător din World of Tanks
  • Moduri de la Nikitos pentru WoT
  • Descărcați serverul de testare Cum să descărcați serverul de testare 0
  • Sursa de alimentare stabilizata regulata simpla
  • Ce trebuie să faceți dacă radiatorul este scos din procesor Cum să scoateți răcitorul din procesor
  • LED-uri RGB: cum funcționează, structură internă, cum se conectează, LED-uri RGB și controler Arduino pentru pornirea benzii LED
  • Program în limbaj de asamblare în mediul software Algorithm Builder. Apoi, performanța dispozitivului proiectat a fost testată în mediul software proteus. Algorithm Builder pentru avr, Noțiuni introductive Asamblator grafic Programarea temporizatoarelor avr n

    Program în limbaj de asamblare în mediul software Algorithm Builder.  Apoi, performanța dispozitivului proiectat a fost testată în mediul software proteus.  Algorithm Builder pentru avr, Noțiuni introductive Asamblator grafic Programarea temporizatoarelor avr n

    Cred că în vremea noastră nu există radioamator care să nu fi întâlnit niciodată microcontrolere. Mai devreme sau mai târziu, dar asta se întâmplă. Când am văzut prima dată un circuit cu un microcontroler, am închis imediat pagina browser, cu gândul: „Oh, încă nu îl pot asambla”. Dar timpul a trecut, erau tot mai multe circuite care foloseau microcontrolere și, în sfârșit, m-am hotărât să încep. De fapt, totul s-a dovedit a nu fi deloc atât de dificil pe cât credeam.

    În primul rând, să ne dăm seama: ce este oricum un microcontroler (MK)? În esență, este un computer în miniatură conceput pentru a îndeplini sarcini simple. Tot ceea ce este necesar pentru funcționarea microcontrolerului este conținut într-o singură carcasă. Microcontrolerul are diverse periferice - porturi de intrare/ieșire, temporizatoare, interfețe de comunicare etc. Microcontrolerul are trei tipuri de memorie: RAM (memorie cu acces aleatoriu), FlashROM (memorie de program), EEPROM (memorie non-volatilă).

    Principala diferență dintre un microcontroler și un microcircuit convențional este că microcontrolerul nu funcționează conform logicii rigide instalate din fabrică, ci este programat. În mod clasic, programul este scris într-un mediu special pe un computer într-unul dintre limbajele de programare, după care este tradus în limbajul mașinii (compilat) și scris în memoria controlerului. În acest curs, totul va fi puțin diferit - programul nu va fi scris, ci literalmente desenat sub forma unei organigrame. Datorită acestei abordări, programul arată mai clar, iar timpul de dezvoltare a programului este redus de 3-5 ori comparativ cu tehnicile clasice de programare.

    Algorithm Builder - mediu de programare

    Algorithm Builder realizează un ciclu complet de dezvoltare, începând de la introducerea algoritmului, inclusiv procesul de depanare și terminând cu scrierea programului în memorie.

    Să începem cu o scurtă prezentare a interfeței programului

    Meniu principal

    • Fişier. Servește pentru a deschide, salva, închide proiecte și algoritmi individuali, precum și pentru a ieși din program.
    • Editați | ×. Acțiuni legate de editarea unui algoritm: tăiați, copiați, evidențiați etc.
    • Afişa. Algoritm de comutare/tabel cu variabile (mai multe despre el mai jos) + șabloane de operații și condiții.
    • Căutare. Nu este nevoie să explic aici.
    • Elemente. Algoritmul este extras din elemente speciale: Text, Vertex, Câmp, Etichetă, Condiție, Vector de tranziție utilizat (necondiționat), Personalizator. Pe toți îi vom cunoaște pe parcursul procesului de formare. Există mai multe elemente importante în meniu: Dezactivare, Macro, întreruperi. Dezactivați- această componentă nu se va compila. Macro- pentru a crea macrocomenzi. întreruperi- conține o listă de nume ale tuturor întreruperilor microcontrolerului. Veți afla despre această funcție în lecțiile următoare, dar acum voi spune doar că acesta este un lucru extrem de important și necesar pentru muncă.
    • Program. Acțiuni asociate programului - compilare (traducere în limbajul mașinii), simularea programului, citirea memoriei controlerului (Flash și EEPROM), etc.
    • Opțiuni. Setări de proiect și de mediu.
    • ?. Informații și ajutor pentru Algoritm Builder.

    Bara de instrumente

    Nu este nevoie de explicație. Când treceți cu mouse-ul peste elementele panoului, apar indicații.

    Proiect deschis

    Există o particularitate aici. Nu puteți deschide două proiecte în același timp. Pentru a deschide/crea un nou proiect trebuie să îl închideți pe cel vechi. După deschiderea unui proiect, puteți deschide/crea doar un fișier algoritm separat. Fișierul proiect are extensia .alp, iar fișierul algoritm separat are extensia .alg

    Lucrul cu variabile și constante

    Este organizat sub forma unui tabel special (se poate comuta folosind tasta F12, fie prin meniu, fie folosind o tastă din bara de instrumente). Astfel, algoritmul în sine este eliberat de intrări inutile.

    Un număr mare de etichete, datorită cărora sunt posibile tranzițiile de la o parte a programului la alta, încurcă foarte mult codul și se pierde claritatea programului. În Algorithm Builder, tranzițiile sunt făcute mult mai ușoare - cu o săgeată (vector). Dar tranzițiile de-a lungul etichetelor cu nume sunt, de asemenea, posibile.

    Simularea funcționării programului

    Simulatorul arată toate modificările care au loc în interiorul microcontrolerului virtual. Pentru a verifica funcționarea programului, nici măcar nu trebuie să cumpărați un microcontroler! Simularea poate fi efectuată pas cu pas (cu sau fără introducerea de funcții), la un punct de întrerupere setat sau la o zonă selectată.

    Depanare

    Algorithm Builder are un sistem de depanare pe cip (On Chip debug) care vă permite să observați conținutul memoriei unui microcontroler real în anumite puncte. În acest caz, doar un picior al microcontrolerului este utilizat pentru a comunica cu computerul și la alegerea utilizatorului. Depanarea monitorului poate fi aplicată aproape oricărui microcontroler. Aceasta este o versiune software a protocolului debugWIRE.

    Deci, de ce Algorithm Builder este puțin cunoscut printre amatorii de radio?În primul rând, până în 2010 programul a fost plătit. Astăzi, software-ul este distribuit în mod absolut gratuit. În al doilea rând, lipsa sprijinului oficial pentru program. Nu veți găsi un singur producător care să folosească Builder. Resursele de internet dedicate acestui program pot fi numărate pe de o parte.

    Merită să vorbim puțin despre materialele și instrumentele necesare

    Primul lucru de care ai nevoie este ciocan de lipit. Instrumentul principal al unui radioamator. Puterea fierului de lipit ar trebui să fie în intervalul 30-60 W. De ce nu pot fi mai multe? Un fier de lipit puternic se încălzește mai mult și deteriorează urmele plăcii și piesele uzate. Și nu este atât de convenabil pentru lipit - un astfel de fier de lipit este mult mai mare și mai greu.

    Pentru a încărca programul în microcontroler aveți nevoie programator- în cea mai simplă versiune, este format din doar câteva rezistențe și diode (pe LPT și port COM). Dacă nu aveți un port COM sau LPT pe computer, un programator USB poate fi comandat la, DealExtreame sau (Interogare de căutare „programator avr”; costă aproximativ 4-6$). Voi scrie despre alegerea și asamblarea unui programator în lecția următoare.

    Trăsături distinctive:

    • Sisteme de operare acceptate: Windows 95/98/2000/NT/ME/XP
    • Licență: Freeware
    • Limba interfeței: engleză, rusă
    • Limbaje de programare: asamblator grafic
    • Functii principale:
      • editor grafic de cod de program
      • compilator
      • simulator pentru depanarea algoritmului introdus
      • programare printr-un port COM folosind un adaptor simplu (7 rezistențe, 3 diode; vezi documentația pentru diagramă)
      • depanarea algoritmului pe un cip folosind un adaptor și mai simplu (1 sau 2 diode, 2 sau 4 rezistențe; vezi documentația pentru diagramă)
    • Adresă de asistență Internet: http://algrom.net/russian.html

    Descriere:

    Algorithm Builder este un mediu gratuit (condiții de distribuție freeware) pentru AVR MK, care oferă un ciclu complet de dezvoltare a firmware-ului, inclusiv. etape precum intrarea algoritmului, depanarea și programarea în circuit. Dezvoltarea programului poate fi efectuată atât la nivel de asamblare, cât și la nivel macro, la care este posibil să se lucreze cu cantități alternative de lungime arbitrară. Acest lucru aduce capacitățile de programare mai aproape de un limbaj de nivel înalt.

    O caracteristică distinctivă a Algorithm Builder este capacitatea de a introduce un program grafic, sub forma unui algoritm cu o structură arborescentă. Ca rezultat, întreaga structură logică a programului devine complet clară. Această metodă de programare este cât mai apropiată de natura percepției umane și, prin urmare, este mult mai ușor de învățat în comparație cu asamblatorul clasic. Reducerea așteptată a timpului de creare a firmware-ului în comparație cu asamblatorul clasic este de 3-5 ori.

    Mediul este proiectat să funcționeze sub Windows 95/98/2000/NT/ME/XP. Pentru funcționarea normală a editorului, este necesar fontul „Courier”.

    Fișiere pentru descărcare:

    • Seria AT90
      • AT90CAN128, AT90PWM3, AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S85185B AT90S85185B AT90S85185B, AT90S85185B AT90S4414, AT90S4433 90USB128, AT90USB162
    • seria ATmega
      • ATmega8, ATmega16, ATmega32, ATmega48, ATmega64, ATmega88, ATmega103, ATmega128, ATmega161, ATmega162, ATmega163, ATmega164P, ATmega165, ATmega168, ATmega168, ATmega2323, ATmega2323, ATmega2323 ga603, ATmega640, ATmega644, ATmega644P, ATmega645, ATmega1280, ATmega1281 , ATmega1284P, ATmega2560, ATmega2561, ATmega3250, ATmega6450, ATmega8515, ATmega8535
    • ATtiny
      • ATtiny10, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny24, ATtiny25, ATtiny26, ATtiny28, ATtiny44, ATtiny45, ATtiny84, ATtiny85, ATtiny261, ATtiny4861, ATtiny4861, ATtiny4861, ATtiny4861

    4.Cerințe tehnice.

    Acest releu microelectronic are anumite date tehnice.

    Acest releu microelectronic are un contact normal închis (spate) și unul normal deschis (față) pentru comutarea a două sarcini de curent pulsatoriu.

    La aplicarea tensiunii alternative externe cu o frecventa de 25, 50 si 75 Hz, functionarea este asigurata in intervalul de la 0,8V la 10V.

    Tensiunea de funcționare pe curent alternativ cu o frecvență de 25, 50 și 75 Hz este (2,9-3,2) V, iar tensiunea de întrerupere este (2,1-2,3) V.

    Notă: Declanșare - deschiderea contactului din spate și închiderea contactului frontal. Dropout – deschiderea contactului frontal și închiderea contactului din spate.

    Un indicator cu un anod comun este utilizat pentru a afișa informații despre tensiunea de intrare.

    Contactele comută tensiuni de până la 30V.

    Rata de actualizare a informațiilor de pe indicator are loc la fiecare 12,8 ms.

    Un redresor de punct mediu este utilizat pentru a redresa tensiunea de intrare.

    5.Schema funcțională a unui releu electronic.

    Un releu microelectronic cu impulsuri poate fi împărțit în mai multe unități funcționale. Schema funcțională a acestui releu este prezentată în Figura 5. În funcție de scopul funcțional din diagramă, putem distinge:


    • Redresorul este construit după un circuit cu punct comun.

    • Microprocesor (MP).

    • Indicatorul este conceput pentru a afișa informații.

    • Pereche de optocuple.
    Redresorul este proiectat pentru a rectifica semnalul analogic care ajunge la intrarea sa. La rândul său, semnalul analogic provine de la un bloc de filtru de protecție sau alt element analog și este o tensiune alternativă cu o frecvență de 25, 50 sau 75 Hz. Din ieșirea redresorului obținem o tensiune redresată care este furnizată microprocesorului.

    Microprocesorul îndeplinește funcțiile specificate în program. Ajungând la intrarea microprocesorului de la ieșirea redresorului, tensiunea redresată începe să fie analizată folosind ADC-ul încorporat în microprocesor. Apoi microprocesorul calculează valoarea medie a tensiunii măsurate și o afișează pe indicator. Perechile de optocuple sunt, de asemenea, conectate la una dintre ieșiri. Sunt analogi

    Fig. 5. Schema funcțională a unui releu microelectronic de autoblocare

    Contacte releu. În funcție de pragul de răspuns, semnalul apare pe una dintre perechile de optocuplare.

    Indicatorul vă permite să monitorizați tensiunea care vine la releul microelectronic. Acest lucru permite personalului de întreținere să măsoare și să observe funcționarea releului microelectronic.

    Optocuplere cu tranzistori, constând dintr-o diodă emițătoare bazată pe un compus arsenic-galiu-aluminiu și un fototranzistor compozit cu siliciu. Proiectat pentru utilizare ca întrerupător în circuitele electrice izolate galvanic ale echipamentelor radio-electronice. Disponibil într-o carcasă metalică. Greutatea dispozitivului nu depășește 1,5 g.

    6.Algoritm de lucru.

    Pentru a crea un releu microelectronic, este necesar să se determine sarcina principală. Mai întâi trebuie să configurați microprocesorul, să configurați toate porturile de intrare-ieșire, să setați temporizatorul și ADC. După aceasta, începe să fie finalizată sarcina principală, care este să colectăm informații folosind un ADC, după care analizăm datele primite și le afișăm. Afișajul, la rândul său, ar trebui să arate valoarea zecimală a tensiunii de intrare. Un algoritm de operare mai detaliat este prezentat în Figura 6.

    Algoritmul programului este format din cinci subrutine:


    • Configurarea microprocesorului

    • subrutină ADC

    • Rutina cronometrului

    • Afișează subrutina

    • Rutina de diviziune
    Să vedem cum funcționează setările microprocesorului. Mai întâi, setăm valoarea inițială a stivei. După aceasta, configuram ADC-ul. Aici instalăm prescaler SK/128 și setăm modul de conversie continuă, când conversiile sunt lansate continuu la anumite intervale de timp. Apoi setăm cronometrul. Am stabilit modul de funcționare al STS (resetat la coincidență). În acest mod, după atingerea valorii înscrise în registrul de comparație, numărarea continuă de la valoarea „$00”. În același ciclu, când valorile sunt resetate, are loc o întrerupere a temporizatorului. Apoi setăm o întrerupere care este declanșată de un overflow. După aceasta, porturile de intrare/ieșire sunt configurate. Apoi, setăm toate valorile steagului, locația indicației, valoarea sumei, divizorul și valoarea zero a coeficientului. Și activăm întreruperea globală, pentru care setăm steag-ul i la unu. După configurarea microprocesorului nostru, programul nostru începe. Pentru a face acest lucru, punem condiția t=1. În timp ce valoarea lui t nu este egală cu unu, are loc un ciclu; de îndată ce devine o valoare de unu, programul merge la dreapta unde merge la subrutina de indicație și, după execuția sa, setează indicatorul t la zero. și din nou se închide din nou în ciclu. Toate subrutinele ulterioare vor ieși la întrerupere și vor reveni la această buclă verificând indicatorul t.

    Acum să ne uităm la subrutina ADC. Deoarece am configurat ADC-ul mai sus și am spus că trecerea la subrutina ADC se realizează prin întrerupere printr-o anumită valoare a impulsurilor de ceas. Deoarece după configurarea microprocesorului, programul nostru s-a rotit într-o buclă în care a fost verificată valoarea steagului t și, împreună cu aceasta, au fost numărate și valorile ciclurilor de ceas al generatorului de microprocesor. După atingerea unei anumite valori a impulsurilor de ceas, are loc o întrerupere și programul trece la subrutina ADC. De îndată ce am trecut la el, am măsurat valoarea tensiunii de intrare. Pentru a stoca această valoare, folosim două registre Yl (low) pentru a stoca octeții mici și Yh (high) pentru a stoca octeții mari. După aceasta, verificăm valoarea steagului t, dacă este egală cu zero, atunci este necesar să se afișeze valoarea, iar dacă indicatorul t este unul, atunci aceasta înseamnă că este posibilă convertirea valorii ADC în zecimală. formă. După aceasta, comparăm valoarea de prag a tensiunii măsurate; dacă această valoare este peste pragul de 0,8 V, atunci scriem această valoare în registru și o adăugăm cu măsurătorile ulterioare. De fiecare dată când adăugăm valorile ADC, creștem valoarea divizorului cu unu. Apoi verificăm valoarea divizorului și dacă valoarea acestuia este 255, atunci este necesar să resetați valoarea divizorului sumei, dar dacă divizorul nu a atins valoarea 255, atunci subrutina ADC iese.

    Dar dacă, după comparare, valoarea ADC este sub pragul de 0,8V, atunci programul merge la dreapta și apoi oprim ADC-ul. Acest lucru este necesar pentru ca valoarea tensiunii să poată fi afișată pe indicator. Apoi analizăm valoarea divizorului și dacă nu este egală cu zero, atunci adăugăm valorile ADC și creștem divizorul cu unu. Apoi trecem la subrutina de diviziune. Acest lucru este necesar pentru a calcula valoarea medie a tensiunii. Dar dacă valoarea divizorului este zero, atunci programul sare imediat după subrutina de împărțire. După aceasta, comparăm valoarea pragului de răspuns ADC și dacă este mai mare decât pragul, atunci ieșim valoarea unuia în portul de intrare-ieșire, care corespunde funcționării și închiderii contactului frontal și dacă valoarea este mai mică decât pragul de răspuns, atunci valoarea zero este scoasă în port, ceea ce corespunde închiderii contactului din spate. Apoi setăm valoarea divizorului și indicatorul t la zero. De asemenea, resetam valoarea ADC și o pornim și ieșim din subrutina ADC.

    Apoi, luați în considerare subrutina de divizare, a cărei tranziție este situată în subrutina ADC. Rutina de divizare este necesară pentru a calcula valoarea medie a tensiunii măsurate. Programul de împărțire este o scădere secvențială a valorii divizorului din suma tuturor valorilor ADC. De câte ori apare această scădere va fi valoarea mediei, adică câtul. Să luăm în considerare algoritmul acestei operații în sine. După ce mergem la subrutină, resetăm valoarea coeficientului, apoi verificăm indicatorul C. Dacă valoarea acestuia nu este egală cu unu, atunci creștem valoarea coeficientului cu unul și scădem valoarea divizorului din suma tuturor Valori ADC. Valoarea 1 este scrisă în indicatorul C numai după ce valoarea sumei devine mai mică decât valoarea divizorului. De îndată ce o unitate este scrisă în flag C, programul iese din buclă. Introducem valoarea coeficientului rezultat în registrul X și resetam valoarea sumei. Acest lucru încheie programul de diviziune și îl iese.

    La fel ca o subrutină ADC, trecerea la o subrutină de cronometru are loc printr-o anumită valoare a impulsurilor de ceas. Desigur, trecerea la subrutina temporizatorului prin întrerupere se realizează în momente diferite cu întreruperea subrutinei ADC. În consecință, nu interferează unul cu celălalt. În subrutina temporizatorului, afișăm treptat informații despre indicator. Deoarece avem patru cifre, trebuie să afișăm succesiv valorile cifrelor una după alta. Pentru a face acest lucru, există n în care scriem o valoare de la 0 la 3, care corespunde fiecărei cifre. După trecerea la întrerupere, programul începe. În primul rând, verificăm valoarea lui n și dacă această valoare este zero, trecem mai departe, unde aplicăm zero pentru a opri a patra familiaritate. Trimitem un număr în portul B. După aceasta, furnizăm unitatea pentru a lumina prima familiaritate. Ca urmare, prima cifră se aprinde pe indicator. Apoi tranziția are loc de-a lungul etichetei. În continuare, creștem valoarea lui n cu unul și ieșim din subrutină. După un anumit timp, apare o altă întrerupere a temporizatorului și programul trece la subrutina temporizatorului, unde comparăm din nou valoarea lui n. Deoarece am mărit-o cu unu, tranziția are loc în consecință când n este egal cu unu. Apoi, prima familiaritate este dezactivată, valoarea celui de-al doilea număr este scoasă la portul B și a doua familiaritate este activată. Apoi, din nou, tranziția are loc de-a lungul etichetei și valoarea lui n crește cu unu. Valoarea celei de-a treia și a patra cifră este afișată în același mod, dar la ieșirea celei de-a patra cifre, setăm valoarea lui n la zero, astfel încât ieșirea primei cifre va începe din nou în viitor. Tot aici scriem valoarea lui unu la steag-ul t. După ce pe indicator este afișată a patra cifră, programul iese și intră într-un ciclu de verificare a valorii steagului t.

    Deoarece flag t este setat la unu, are loc o tranziție de la ciclul de verificare a flagului, după care are loc o tranziție la subrutina de indicație. În această subrutină determinăm valoarea miilor, sutelor, zecilor și unităților și, de asemenea, determinăm valoarea cifrei rezultate pentru a o scoate în portul B. După trecerea la subrutina de afișare, stabilim o interdicție a întreruperii globale. Apoi resetam valoarea registrului temp. Apoi comparăm valoarea medie ADC situată în registrul Z. Dacă este mai mare de o mie, atunci scădem 1000 din registrul Z. După scădere, introducem una în registrul temp. Se adaugă o unitate de fiecare dată când se scade 1000 din Z. Conținutul registrului de temperatură corespunde valorii de mii. De îndată ce registrul Z devine mai mic de 1000, programul merge mai departe. După tranziție, rescriem valoarea registrului temp în registrul r0 și o resetăm la zero. Apoi comparăm din nou valoarea registrului Z și dacă este mai mare de 100, apoi scădem din nou 100. Cu fiecare scădere, introducem câte unul în registrul temp. De îndată ce valoarea registrului Z devine mai mică de 100, programul merge mai departe. După aceasta, rescriem valoarea sutelor în registrul r1. Apoi resetam valoarea registrului temp. Apoi comparăm valoarea registrului Z și dacă este mai mare de 10, atunci scădem 10 din registrul Z. La fiecare scădere, introducem câte unul în registrul temp. De îndată ce valoarea registrului Z devine mai mică de 10, programul merge mai departe. Apoi, amintiți-vă valoarea zecilor din registrul r2. Valoarea rămasă în registrul Z este valoarea care definește valoarea celor. Această valoare este scrisă în registrul r3. Acum, valorile miilor, sutelor, zecilor și, respectiv, unilor sunt în registrele r0, r1, r2 și r3. După aceasta, introducem adresa tabelului de coduri în registrul Z, care conține semnificația numerelor de afișat. Dacă valoarea miilor în timpul măsurării este zero, atunci este necesar să suprimați valoarea zero în cifra cea mai semnificativă. După aceasta, introducem valoarea primei cifre în registrul r0, apoi valoarea celei de-a doua cifre în r1, apoi valoarea celei de-a treia cifre în r2 și valoarea ultimei cifre în registrul r3. După aceasta, activăm întreruperea globală. Acest lucru încheie programul și iese din subrutina de afișare. După aceasta, setăm indicatorul t la 0 și totul începe să se repete. Aici se termină algoritmul programului pentru microprocesor.

    7.Software.

    Înainte de a scrie un program, trebuie să selectați un microprocesor și să luați în considerare funcțiile pe care le îndeplinește. Pentru sarcina la îndemână, este recomandabil să luați microprocesorul ATmega48. Caracteristicile sale distinctive sunt:


    • Microcontroler AVR de înaltă calitate, cu putere redusă, pe 8 biți

    • Arhitectură RISC avansată
    - 130 de instrucțiuni, dintre care majoritatea sunt executate într-un singur ciclu de ceas

    32 de registre de lucru de uz general pe 8 biți

    Arhitectură complet statică

    Performanță de până la 16 MIPS la 16 MHz

    Multiplicator în două cicluri încorporat


    • Program nevolatil și memorie de date
    - 4KB de memorie de program Flash programabilă în sistem capabilă să reziste la 10.000 de cicluri de scriere/ștergere

    Secțiune de program de pornire auxiliară cu bit de protecție independent


    • Programare în sistem cu program de bootloader încorporat

    • funcție de citire reală la programare
    - EEPROM de 256 de octeți capabilă să reziste la 100.000 de cicluri de scriere/ștergere

    512 octeți de memorie SRAM încorporată (RAM statică)

    Protecție la citire programabilă


    • Caracteristici periferice
    - Două temporizatoare/contoare pe 8 biți cu prescaler și mod de comparare separat

    Un temporizator/contor pe 16 biți cu prescaler separat și moduri de comparare și capturare

    Contor în timp real cu generator separat

    Cinci canale PWM

    6 canale pe 10 biți

    2 canale pe 8 biți

    ADC cu 6 canale pentru dispozitive în pachet PDIP

    4 canale pe 10 biți

    2 canale pe 8 biți

    Serial programabil USART

    Interfață SPI master/slave

    Interfață serială cu 2 fire orientată pe octeți

    Timer programabil watchdog cu oscilator încorporat

    Comparator analogic încorporat

    Întrerupeți și treziți când starea pinului se schimbă


    • Caracteristici speciale ale microcontrolerului
    - Resetare la pornire și detector de pierdere momentană de putere

    Oscilator calibrat încorporat - Surse de întrerupere externe și interne

    Cinci moduri de consum redus: Idle, ADC Noise Reduction, Power-Save, Power-down și Standby


    • Porturi I/O și design de carcasă
    - 23 de linii de porturi I/O programabile

    Pachete TQFP și MFL cu 32 de pini


    • Gama tensiunii de alimentare
    - de la 1,8 la 5,5 V pentru ATMega48V

    De la 2,7 la 5,5 V pentru ATMega48L

    De la 4,5 la 5,5 V pentru ATMega48


    • Diferite intervale de viteză a ceasului de funcționare
    - de la 0 la 1 MHz pentru ATMega48V

    De la 0 la 8 MHz pentru ATMega48L

    De la 0 la 16 MHz pentru ATMega48


    • Consum ultra redus
    - Mod activ:

    300 µA la 1 MHz și tensiune de alimentare de 1,8 V

    20 µA la 32 kHz și tensiune de alimentare de 1,8 V

    Mod consum redus

    0,5 µA la o tensiune de alimentare de 1,8 V

    ATMega48 este un microcontroler CMOS de 8 biți de putere redusă cu arhitectură AVR RISC. Prin executarea instrucțiunilor într-un singur ciclu, ATMega48 atinge o performanță de 1 MIPS la o viteză de ceas de 1 MHz, permițând proiectantului să optimizeze raportul putere-performanță.

    Nucleul AVR integrează un set bogat de instrucțiuni și 32 de registre de lucru de uz general. Toate cele 32 de registre sunt conectate direct la unitatea logică aritmetică (ALU), permițând accesul la două registre independente în timp ce se execută o singură instrucțiune. Ca rezultat, această arhitectură permite o performanță de zeci de ori mai mare decât arhitectura standard CISC.

    ATMega48 are următoarele caracteristici: 4 KB de memorie de program Flash programabilă în sistem, 256 de octeți de memorie de date EEPROM, 512 de octeți SRAM (RAM statică), 23 de linii I/O de uz general, 32 de registre de lucru de uz general, trei temporizatoare flexibile /contoare cu circuit de comparare, surse de întrerupere interne și externe, USART serial programabil, interfață serială cu 2 fire orientată pe octeți, ADC cu 6 canale, dintre care 4 canale au rezoluție de 10 biți și rezoluție de 2 - 8 biți, temporizator watchdog programabil cu oscilator încorporat, port SPI și cinci moduri de consum redus inițializate prin software. În modul Idle, nucleul se oprește, în timp ce SRAM, temporizatoarele/contoarele, portul SPI și sistemul de întrerupere continuă să funcționeze. În modul Power-down, conținutul registrelor este păstrat, dar oscilatorul principal este oprit și toate funcțiile interne ale microprocesorului sunt dezactivate până când apare o întrerupere sau o resetare hardware. În modul de economisire a energiei, temporizatoarele asincrone continuă să funcționeze, permițând numărarea intervalelor de timp în timp ce microprocesorul este în modul de repaus. Modul de reducere a zgomotului ADC oprește nucleul de calcul și toate modulele I/O, cu excepția temporizatorului asincron și a ADC-ului însuși, care minimizează zgomotul în timpul conversiei analog-digital. În modul Standby, oscilatorul principal funcționează în timp ce restul dispozitivului este inactiv. Acest lucru vă permite să mențineți rapid capacitatea de a porni rapid dispozitivele, reducând în același timp consumul.

    Dispozitivul este fabricat folosind tehnologia de memorie nevolatilă de înaltă densitate de la Atmel. Flash-ul ISP încorporat vă permite să reprogramați memoria programului în sistem printr-o interfață serială SPI utilizând un program de încărcare care rulează în nucleul AVR sau un programator convențional de memorie nevolatilă. Programul bootloader este capabil să încarce date prin orice interfață disponibilă pe microcontroler. Programul din sectorul de boot continuă să se execute chiar și atunci când zona de memorie a aplicației este încărcată, oferind un comportament real de citire la scriere. Combinând un nucleu RISK de 8 biți cu o memorie Flash programabilă intern, Atmel a făcut din dispozitivele ATMega48 microcontrolere puternice, care oferă o flexibilitate mai mare și o eficiență a costurilor unei game largi de dispozitive de control.

    ATMega48 este susținut de o varietate de software și instrumente de dezvoltare integrate, cum ar fi compilatoare C, asamblatoare macro, depanatoare/simulatoare de software, emulatoare în circuit și kituri de evaluare.

    7.1 Dispunerea pinului ATMega48:

    Fig.7.1. Locația contractelor cu microprocesor ATmega48

    În figura 7.1. Este dat scopul pinilor microprocesorului, dar vom folosi doar o parte din ei. Deci configurăm întregul port B pentru ieșire și conectăm la acesta o indicație pentru a afișa semnificația numerelor. Portul D0-D3 este, de asemenea, configurat pentru ieșire și conectăm la el un indicator pentru a lumina cele patru cunoștințe de indicator. Pinii portului D4-D5 sunt configurați ca ieșire și LED-urile sunt conectate la acesta pentru a afișa închiderea față și deschiderea contactelor din spate și invers pentru a deschide partea frontală și a închide contactele din spate. Ieșirea portului C0 este utilizată pentru ADC. O sursă externă de tensiune de referință este conectată la pinul AREF și un condensator de filtru este conectat la pinul AVCC pentru a îmbunătăți imunitatea la zgomot.

    Odată ce v-ați decis asupra alegerii microprocesorului și a designului algoritmului de operare, trebuie să scrieți un program pentru acesta folosind acest algoritm.

    Pentru a scrie programul voi folosi un software numit Algorithm Builder. Dar înainte de a scrie programul, să aruncăm o privire la acest software.

    7.2 Mediul de dezvoltare Algorithm Builder

    Software-ul Algorithm Builder a fost scris de programatorul rus Gennady Gromov. Acest mediu oferă un ciclu complet de dezvoltare, pornind de la introducerea algoritmului, inclusiv depanarea și terminând cu programarea în circuit a cristalului. Veți avea ocazia să dezvoltați programe atât la nivel de asamblare, cât și la nivel de macro, la care este posibil să lucrați cu cantități alternative de lungime arbitrară. Acest lucru aduce capacitățile de programare mai aproape de un limbaj de nivel înalt. Puteți descărca Algorithm Builder, cea mai recentă versiune, de pe site-ul web al autorului http://algrom.net/russian.html.

    Spre deosebire de asamblatorul clasic, programul este introdus sub forma unui algoritm cu ramificare arborescentă și este afișat în plan, în două dimensiuni. Rețeaua de tranziții condiționate și necondiționate este afișată grafic într-o formă vectorială convenabilă. Acest lucru eliberează, de asemenea, programul de nenumărate nume de etichete, care în asamblarea clasică sunt inevitabile balast. Întreaga structură logică a programului devine clară.

    Tehnologiile grafice pentru crearea de programe deschid noi oportunități pentru programatori. Ele vă permit să introduceți programe pe un plan sub forma unui algoritm cu o structură arborescentă. Ca rezultat, întreaga structură logică a programului devine complet clară. Scopul principal al unor astfel de tehnologii este de a aduce interfața de dezvoltare cât mai aproape de natura percepției umane. Stăpânirea unui astfel de mediu este mult mai ușoară decât stăpânirea asamblatorului clasic. O interfață mai ușor de utilizat deschide noi oportunități de dezvoltare. Potrivit utilizatorilor, timpul de creare a software-ului este redus de 3 până la 5 ori față de clasic

    Orez. 7.2.1. Fereastra software-ului Algorithm Builder.

    Asamblator.

    Mediul este proiectat să funcționeze sub Windows 95/98/2000/NT/ME/XP.

    Pentru funcționarea normală a editorului, este necesar fontul „Courier”.

    În figura 7.2.1. arată cum arată panoul principal al programului „Algorithm Builder”.

    Proiectarea algoritmului

    Orice software poate fi împărțit în bucăți separate, complete logic. De regulă, declarația finală a acestor fragmente sunt declarații precum salt necondiționat sau întoarcere dintr-o subrutină, de exemplu. instrucțiuni după care execuția liniară a programului se oprește definitiv. Dezvoltarea software-ului în mediul Algorithm Builder se reduce la formarea unor astfel de blocuri, plasarea lor pe un plan și stabilirea conexiunilor vectoriale între ele din tranziții condiționate și necondiționate.

    Elementele algoritmului

    Pentru a construi un algoritm, Algorithm Builder oferă șapte elemente:

    DOMENIU – Câmp;

    LABEL – Etichetă;

    VERTEX – Vârful blocului;

    CONDIȚIE – Tranziție condiționată;

    JMP Vector – Salt relativ necondiționat;

    SETTER – Configurare dispozitiv periferic;

    TEXT – șir de editor de text local.

    Elementul „CÂMP” - câmp

    Reprezintă o linie centrată pe bloc. Obiectul este destinat să înregistreze majoritatea operatorilor de microcontroler. Pentru a adăuga un câmp, selectați fie elementul de meniu „Elemente\Câmp”, fie faceți clic pe butonul de pe bara de instrumente, sau tasta „Alt+F” sau tasta „Enter” (dacă cursorul se află în afara editorului de text local) .

    În exemplul algoritmului prezentat mai jos, elementele „Câmp” sunt încercuite cu ovale.

    Elementul „LABEL” - etichetă

    Este o contur verticală situată în interiorul unui bloc de instrucțiuni și un nume opțional situat în stânga sau în dreapta traseului. Eticheta este menită să indice locurile din algoritm unde sunt posibile tranzițiile condiționate și necondiționate. Pentru a adăuga o etichetă la un bloc, selectați elementul de meniu „Elemente\Etichetă”, apăsați tastele „Alt+L” sau butonul de pe bara de instrumente. Dacă este necesar, puteți atribui o anumită adresă de program. Pentru a face acest lucru, înaintea numelui (dacă acesta există), trebuie să scrieți o constantă sau o expresie algebrică care definește această adresă.

    Pentru a inversa locația numelui etichetei, apăsați tasta „Tab”.

    În exemplul de mai jos, elementul „Etichetă” este conturat într-un oval.

    De regulă, unul dintre vectorii de tranziție (cu o săgeată la sfârșit) ar trebui să fie adiacent etichetei. In aceea

    Nu este necesar să se dea cazului un nume etichetei. Dar Algorithm Builder permite adresarea clasică a tranziției folosind nume de etichete. În acest caz, trebuie să dați un nume etichetei. De exemplu:

    În plus, în instrucțiunile algoritmului, numele etichetei poate fi folosit ca o constantă care conține adresa locației corespunzătoare din memoria programului.

    Elementul „VERTEX” - partea superioară a blocului

    În afișarea și scopul său este complet identic cu eticheta, dar, spre deosebire de aceasta, specifică

    Locația blocului pe planul de lucru este întotdeauna începutul acestuia. Pentru a adăuga un nou vârf, fie selectați elementul de meniu „Elemente\Vertex”, fie apăsați tastele „Alt+V”, fie faceți clic pe butonul din bara de instrumente sau butonul stâng al mouse-ului făcând clic pe acesta în locul dorit din câmpul de lucru în combinație cu „tastele” Alt+Ctl+Shift.”

    În exemplul de mai jos, elementele „Vertex” sunt conturate în ovale:

    De obicei, un vârf este numit numai dacă este începutul unei subrutine sau al unei macrocomenzi.

    Elementul „CONDIȚIE” - tranziție condiționată

    Acest element este structural cel mai complex și este conceput pentru a implementa tranziții condiționate. Este un contur oval, în interiorul căruia sunt scrise condiția de tranziție și un posibil vector sub forma unei linii întrerupte cu o săgeată la sfârșit, lângă care există un nume de vector opțional.

    Sfârșitul unui vector trebuie fie să se termine pe o etichetă sau un vârf, fie pe un segment al altui vector, fie să aibă numele etichetei adresate.

    Pentru a muta vectorul în locația dorită, apăsați butonul stâng al mouse-ului în timp ce țineți apăsată tasta „Alt”. Pentru a edita un vector, utilizați tastele direcționale în combinație cu tasta „Alt”. Pentru a trece de la editarea unei condiții la editarea unui nume de vector, apăsați tasta „Tab”. Apăsările ulterioare ale tastei „Tab” vor inversa poziția numelui vectorului. Pentru a introduce un obiect nou, fie selectați elementul de meniu „Elemente\Condiție”, fie apăsați tastele „Alt+C” sau butonul de pe bara de instrumente.

    În exemplul de mai jos, elementele „Condiție” sunt conturate în ovale:

    Elementul „JMP Vector” - salt necondiționat

    Acest element este conceput pentru a implementa salturi scurte necondiționate (în asamblatorul de bază acesta este operatorul „RJMP”). Este o polilinie care emană din mijlocul blocului cu o săgeată la capăt, similară vectorului obiectului „Condiție”. Pentru a adăuga un nou salt necondiționat, fie selectați elementul de meniu „Elements\JMP Vector”, fie apăsați tastele „Alt+J” sau butonul de pe bara de instrumente.

    În exemplul de mai jos, elementul „JMP Vector” este conturat cu o linie.

    Element „SETTER” - personalizare

    Acest obiect este un dreptunghi gri, în interiorul căruia este scris numele unei componente periferice personalizabile a microcontrolerului, cum ar fi un Timer, ADC, registru de masca de întrerupere etc. Personalizatorul este conceput pentru a forma o secvență de operații ale microcontrolerului care asigură încărcarea constantele necesare în registrele de control I/O corespunzătoare în conformitate cu proprietățile selectate.

    Înainte de a utiliza acest element, trebuie determinat tipul de microcontroler (articolul de meniu „Opțiuni\Opțiuni proiect”, fila „Chip”)

    Pentru a adăuga un element de personalizare la algoritm, fie selectați elementul de meniu „Elemente\Setter”, fie apăsați tastele „Alt+S” sau butonul de pe bara de instrumente. Pentru a edita un personalizat deja introdus, activați editorul făcând dublu clic sau folosind tastele „Shift+Enter”.

    Obiectul „Setter” este un operator macro. După compilare, acesta este convertit într-o secvență de comenzi de microcontroler care va asigura că constantele necesare sunt încărcate în registrele de control adecvate. Trebuie avut în vedere că în aceste operațiuni se va folosi registrul intermediar r16.

    Pentru unele componente, cum ar fi ADC, personalizarea poate acționa asupra mai multor registre de control. În acest caz, dacă este necesar, efectul asupra fiecărui registru specific poate fi blocat.

    În exemplul de mai jos, elementele „Setter” sunt conturate cu o linie ovală.

    Elementul „TEXT” este un șir de editor de text local

    Acest element este un șir de text care începe de la marginea stângă a câmpului algoritm. O colecție de mai multe astfel de linii formează un editor de text local, mărginit de linii punctate. Regulile de lucru în ea sunt similare cu alte editori de text.

    Liniile sunt destinate înregistrării unui număr de directive ale compilatorului, precum și pentru comentarii. Pentru a adăuga un nou editor de text local, fie selectați elementul de meniu „Elemente\Text”, fie apăsați tastele „Alt+T” sau butonul de pe bara de instrumente.

    Comentariile trebuie să înceapă cu două bare oblice: „//”.

    În exemplul de mai jos, elementele „Text” sunt conturate cu o linie ovală.

    După ce ne-am familiarizat cu elementele de bază ale software-ului Algorithm Builder, vom începe să creăm programul. Pentru a crea un proiect nou, selectați elementul de meniu „Fișier\Nou”. În acest caz, va apărea prima filă și pe câmpul de lucru elementul „TEXT”, „VERTEX” și un element „CAMP” atașat cu un operator gol (Fig. 7.2.2.) „NOP”:

    Orez. 7.2.2. O nouă fereastră de proiect.

    Apoi setăm tipul de microprocesor, în cazul nostru este ATmega48. Pentru a seta tipul de microprocesor, selectați elementul de meniu „Opțiuni\Opțiuni proiect...” (Figura 7.2.3):

    Orez. 7.2.3. Fereastra de opțiuni de proiect.

    Aici selectăm microprocesorul nostru și facem clic pe butonul de aplicare.

    După aceasta, pe baza algoritmului de operare, compunem un program. Datorită faptului că programul aici este prezentat sub forma unui algoritm, acesta nu va diferi mult de algoritmul deja compilat și descris mai sus.

    Să luăm în considerare construcția programului. Mai întâi trebuie să setați contorul de adrese stivei la ultima celulă SRAM. Acest lucru este ușor de făcut; pentru a face acest lucru, selectați elementul SETTER unde selectăm apoi Stack Point

    Ce apare fereastra Control Register Setting (Fig. 7.2.4), unde setam

    Orez. 7.2.4 Fereastra de setări stiva.

    Bifați caseta și apăsați butonul Ok. Pe câmpul de lucru apare un dreptunghi gri SP. Apoi configurăm valorile ADC, pentru care selectăm elementul SETTER unde selectăm Analog to Digits Converter (ADC), după care apare fereastra Control Register Setting (Fig. 7.2.4.) în care este configurat ADC-ul. Aici setăm prescaler-ul CK/128. Selectăm pinul microprocesorului căruia îi vom furniza valoarea ADC. Aici selectăm modul de funcționare al microprocesorului pentru ce

    Orez. 7.2.4. Fereastra de configurare ADC.

    Instalați AVCC cu condensator extern la pinul AREF. Aceasta completează configurarea ADC.

    Acum setăm cronometrul/contorul. Pentru configurare, mergem din nou la elementul SETTER unde selectăm Timer/Counter 0, după care apare o fereastră cu setări timer/contor (Fig. 7.2.5). Aici determinăm valoarea prescalerului CK/1024 și selectăm unul dintre modurile sale de funcționare. În acest caz, selectăm modul CTC, adică resetăm dacă există o potrivire. În acest mod, registrul de numărare funcționează, de asemenea, ca un numărător de adunare obișnuit, care este incrementat cu fiecare impuls al semnalului de ceas clk T0. Cu toate acestea, valoarea maximă posibilă a registrului de contor și, prin urmare, rezoluția contorului este determinată de registrul de comparație OCRO. După atingerea valorii scrise în registrul de comparație, numărarea continuă de la valoarea „$00”. La același semnal de ceas

    Orez. 7.2.5. Fereastra cu setari temporizator/contor.

    Clk T 0, în care registrul de numărare este resetat, este setat indicatorul de întrerupere TOV0 al registrului TIFR. Scriem valoarea 100 în registrul OCRO, la atingerea căruia va apărea o întrerupere și programul se va muta la eticheta Timer_0_Compare_Match_A.

    .

    Figura 7.2.6. Fereastra de setări de întrerupere.

    Apoi configuram întreruperea și selectăm întreruperea de overflow. Pentru a face acest lucru, selectați din nou elementul SETARE unde selectăm Timer/Counter întrerupe Mask (TIMSK). În fereastra care apare, în câmpul Timer/Counter, bifați caseta pentru Output compare A match (Fig. 7.2.6). Aceasta completează configurarea întreruperii. Acum configuram porturile de intrare-ieșire, deoarece trebuie să configuram întregul port B pentru ieșire, notăm valoarea 255 și o setăm la unul. Configuram si portul D, dar aici folosim doar primii 6 pini D0 - D5, pentru asta scriem in el valoarea 127. Apoi setam valoarea 0 logic pe acest pin. Configuram portul C ca intrare pentru care scriem în el 0. Aici se termină setările de porturi de intrare-ieșire. Acum setăm indicatorul t la 0. Apoi setăm primul semn al indicatorului, scriem 0 în n. Apoi resetăm valoarea sumei pentru aceasta în sumă și scriem 0. Setăm și valoarea divizorului scriind 0 în m. Resetăm valoarea chatului privat scriind în ea 0. După Pentru a face acest lucru, activăm o întrerupere globală setând flag i la 1. Acest lucru permite ca programul să fie întrerupt după o anumită valoare a impulsurilor de ceas și accesați subrutina ADC sau temporizator/contor.

    Apoi, folosind elementul LABEL, setăm eticheta și îi atribuim numele start. Apoi, făcând clic pe elementul CONDIȚIE (salt condiționat) și introducând condiția de tranziție în interior, această condiție va fi setarea steagul t la 1. Dacă steagul t nu este egal cu 1, atunci programul merge mai jos și apoi prin elementul JMP Vector (salt necondiționat) mergem la eticheta de start. Astfel, creăm un ciclu în care programul se rotește până când steagul t este setat la 1. De îndată ce steagul t este egal cu 1, programul pleacă în direcția săgeții. Mai jos este intrarea în subrutina pentru conversia unui număr binar într-un număr zecimal, care corespunde inscripției Z_to_Digits. După executarea subrutinei de conversie a unui număr binar într-un număr zecimal, pe care îl vom considera mai jos, programul revine după inscripția Z_to_Digits, unde din nou se introduce 0 în steagul t. Apoi selectăm din nou elementul JMP Vector și mergem la eticheta de pornire.

    Acum să ne uităm la rutina de întrerupere ADC. Trecerea la subrutina ADC se efectuează după un anumit timp. De îndată ce ADC-ul a făcut măsurători, a scris datele în adcl și adch. Datele din aceste două registre trebuie să fie scrise într-un alt registru pentru conversie ulterioară. Aceste registre vor fi zl și zh. Pentru recensământ vom folosi linia adcl → zl, respectiv, următoarea linie va fi ach→ zh. Apoi folosim elementul CONDIȚIE (tranziție condiționată) cu condiția t=1. Această condiție este necesară pentru a interzice schimbarea numărului până când numărul este convertit în formă zecimală. Dacă t=0 atunci programul coboară sub locul unde este scrisă linia x → z, aceasta înseamnă că numărul stocat în registrul z se va schimba numai după ce numărul este afișat. Apoi folosind elementul CONDITION (tranziție condiționată) creăm condiția y
    Apoi, luați în considerare condiția y adc_max atunci și dacă condiția este adevărată, atunci programul urmează săgeata. Apoi trimitem informații în porturile D.5 și D.4. Acesta este scris ca 1 → D.5. Această inscripție arată că valoarea celui logic este afișată la pinul portului D.5. În următoarea linie 0 → D.4 scoatem valoarea zero logic în portul D.4. Apoi programul merge în jurul săgeții. Verificarea stării x adc_max. Apoi se scriu trei linii 0 → m, 0 → t, 0 → y una după alta. În ele resetăm valorile dividendului (m), steagului t și conținutul registrului y în care este stocată valoarea ADC măsurată. Apoi lansăm din nou ADC-ul, după care ieșim din subrutina ADC. Aceasta încheie subprogramul de măsurare a tensiunii de intrare.

    Intrarea în subprogramul de divizare este în subprogramul ADC. După ce programul s-a mutat la subrutina de divizare prin div32_8, se calculează valoarea medie a tuturor valorilor ADC măsurate. În primul rând, resetăm valoarea conținutului privat. Pentru a face acest lucru, scrieți 0 → cast. Apoi introducem condiția în care steagul C = 1. O unitate va fi introdusă în pavilionul C numai după ce conținutul sumei este mai mic decât divizorul. Dar, deoarece indicatorul C conține încă 0, programul merge mai jos. Mai jos este linia chast++ în care creștem valoarea coeficientului cu unu. Apoi scadem valoarea divizorului din registrul care contine suma valorilor ADC. Apoi, folosind elementul JMP Vector (salt necondiționat), creăm o buclă care vine înaintea condiției în care este bifat pavilionul C. Și de îndată ce valoarea sumei este mai mică decât divizorul din pavilionul C, se va scrie una și programul va urma săgeata. Apoi rescriem valoarea coeficientului în registrul x. Aceasta corespunde cu linia cast → x. Mai jos este o linie în care resetăm valoarea sumei 0 → sumă. Aici se termină subrutina de diviziune și programul iese din ea, ajungând în subrutina ADC după linia div32_8.

    Să luăm în considerare o subrutină de întrerupere a temporizatorului în care este determinată iluminarea a patru spoturi indicatoare. După ce a avut loc o întrerupere a temporizatorului și programul a trecut la eticheta Timer_0_Compare_Match_A, începe verificarea condițiilor pentru valoarea de familiaritate a indicatorului. Pentru a face acest lucru, folosind elementul CONDIȚIE (salt condiționat), verificăm condiția n=0 și dacă este adevărată, atunci programul se deplasează de-a lungul săgeții. După aceasta, scriem valoarea 0 în portul D.3 cu comanda 0 → portd.3. Apoi afisam numarul continut in digit_0 in intreaga postare.Pentru a face acest lucru scrie digit_0→ portb. Și scriem unul la portul D.0 pentru a aprinde primul semn al indicației, în program va arăta ca 1 → portd.0. Apoi, folosind elementul JMP Vector (salt necondiționat), sărim la eticheta m0. Eticheta m0 vine după toate condițiile de conținut n. Apoi creștem valoarea lui n, astfel încât următorul număr să fie afișat pe locul doi al indicatorului. După aceasta, ieșim din subrutina temporizatorului. Data viitoare când apare o întrerupere a temporizatorului, programul va reveni la acesta, dar va proceda puțin diferit, deoarece este necesar să se afișeze informații pe al doilea semn al indicatorului. Acest lucru se va întâmpla după verificarea condiției în care registrul n ar trebui să conțină o unitate care a fost scrisă după ce a fost scoasă prima cifră și creșterea valorii lui n cu unu. Deoarece n conține unul, programul decurge conform condiției n=1. După trecerea acestei condiții, este necesar să dezactivați prima familiaritate și pentru a face acest lucru scriem valoarea zero în portul D.0. În program aceasta corespunde liniei 0 → portd.0. Apoi trimitem și numărul conținut în digit_1 către întregul port. Pentru a face acest lucru, scrie digit_1→ portb. Și scrieți unul în portul D.1 pentru a aprinde primul simbol de indicație, în program va arăta ca 1 → portd.1. Apoi mergem la eticheta m0 și creștem valoarea lui n cu una, așa cum este descris mai sus. Ieșirea celei de-a treia și a patra cifră de pe indicator este similară cu cea a primelor două, dar după ce a patra cifră este scoasă, resetăm valoarea conținutului registrului n. Pentru a face acest lucru, scrieți 0→n. Și setăm valoarea steagului t la unu, ceea ce indică sfârșitul afișajului numărului. Pentru a face acest lucru, scrieți 1→t. Acest lucru completează ciclul complet de afișare a unui număr pe indicator.

    Rămâne să luăm în considerare doar subrutina de indicație, a cărei tranziție se efectuează numai după verificarea stării steagului t=1 în programul principal. Deoarece indicatorul t conține unul după ce ultima cifră este afișată pe indicator. Când interogând o condiție, programul se deplasează de-a lungul săgeții și apoi ajunge la Z_to_Digits, aceasta este condiția pentru a trece la subrutina de indicație. Programul urmează eticheta și ajunge în subrutina Z_to_Digits. După tranziție, primul lucru pe care îl facem este să dezactivăm întreruperea globală, pentru a face acest lucru, introduceți valoarea 0 în flag i. Acesta este scris ca 0→i. Mai jos introducem zero în registrul de lucru temp. în program arată ca 0→temp. Acum, folosind elementul CONDIȚIE, creăm o condiție în care registrul Z este comparat cu 1000 și de îndată ce valoarea registrului Z este mai mică de 1000, programul va urma săgeata. Între timp, registrul Z nu mai îndeplinește condiția și programul coboară. Aici scădem o mie din registrul Z și o scriem ca Z – 1000. Apoi creștem valoarea registrului temp cu unu. Folosind elementul JMP Vector, creăm o buclă care vine înaintea condiției de comparare a registrului Z. De îndată ce condiția este îndeplinită și registrul Z este mai mic de o mie, programul pleacă într-o săgeată. Acum rescriem conținutul registrului temp în registrul r0 și acum stochează valoarea de mii a numărului. Intrarea arată ca temp→r0. După aceasta, resetam valoarea registrului temp scriind în el 0. Acum programul se repetă ca în calcularea miilor, dar acum este necesar să se calculeze valoarea sutelor. Setăm din nou condiția Z
    După ce ați scris un program, îl puteți testa în simulatorul oferit de mediul software Algorithm Builder. Pentru a executa algoritmul în simulator, apăsați tasta „F9” sau butonul de pe bara de instrumente.

    În acest caz, compilarea va avea loc la început și, dacă nu există erori, simulatorul va porni. Deschiderea ferestrelor necesare pentru componentele microcontrolerului se face prin elementul de meniu „Vizualizare...”. Pentru a observa procesele din algoritmul introdus, este suficient să deschideți ferestrele „Procesor”, „PortD”, „Registre de lucru”, „ADC”, „Timer/Counter 0” și „Process time #0” (Fig. 7.2). .7).

    Fig.7.2.7.Vio al simulatorului Algorithm Builder.

    Marcajul de lângă operator indică poziția curentă a contorului de programe. Eticheta este plasată înaintea instrucțiunii care trebuie executată în pasul următor. Imediat după lansare, se află pe prima declarație a programului, situată la adresa 0000 USD. Când pornește simulatorul, conținutul registrelor de lucru și al SRAM-ului este întotdeauna umplut cu valori aleatorii, deoarece într-un microcontroler real conținutul lor este imprevizibil după aplicarea puterii. Execuția pas cu pas a algoritmului cu intrarea în subrutine se realizează folosind butonul „F7” sau un buton de pe bara de instrumente. Execuție pas cu pas fără a introduce subrutine - folosind tasta sau butonul „F8”.

    Fig 7.2.8 Fereastra de programare Crystal.

    Acest software are capacitatea de a programa microprocesorul. Algorithm Builder conține un programator încorporat în circuit care oferă programarea secvențială a microcircuitelor. Selectarea elementului de meniu „Program\Run with Chip” sau apăsarea tastelor „Ctrl+Shift+F9” sau făcând clic pe butonul de pe bara de instrumente pornește compilarea algoritmului și, dacă nu există erori, deschide fereastra de programare (Figura 7.2). .8).

    Microprocesorul este programat prin portul COM.

    Mediu de programare grafic pentru dezvoltarea aplicațiilor pentru microcontrolere cu arhitectură AVR.

    Algorithm Builder este un instrument puternic care vă permite să efectuați un ciclu complet de creare și verificare a codului programului. Mediul include: un editor grafic, un simulator de microcip pentru depanarea algoritmului, un compilator și un programator în circuit pentru încărcarea codului în cip. Programul este un analog intern al Assembler și este potrivit atât pentru dezvoltatorii experimentați, cât și pentru cei care abia încep să stăpânească firmware-ul dispozitivului.

    Crearea algoritmilor poate avea loc la nivel de asamblare sau la nivel de macro, pe baza operarii cu valori multibyte, tinand cont de semn. Mai mult, operatorii macro includ cele mai comune seturi de comenzi.

    Toate programele dezvoltate sunt prezentate sub formă de diagrame bloc de arbore ramificat, rețelele de tranziție sunt afișate grafic în formă vectorială. Dacă, conform condiției, este necesar să mergeți într-un loc în codul programului, atunci este suficient să desenați un vector acolo. În acest fel, software-ul este eliberat de mai multe nume de etichete. În cazul în care ramura este prea lungă, există întotdeauna opțiunea de a adresa ramura la numele etichetei. Claritatea unei astfel de structuri logice, potrivit dezvoltatorilor, reduce semnificativ timpul de scriere a codului și reduce numărul de erori.

    Fereastra principală vă permite să plasați obiectele necesare și să le schimbați, inserați, mutați etc., ca în orice editor grafic. Într-o parte separată a ecranului, o fereastră cu o listă a tuturor constantelor și variabilelor este formată sub forma unui tabel, eliberând astfel algoritmul de intrări suplimentare. Pentru a configura parametrii dispozitivelor periferice (UART, SPI, ADC, cronometre), este furnizat un element special cu o interfață cu fereastră derulantă. Compilatorul generează independent un set de instrucțiuni care furnizează parametrii de funcționare ale dispozitivului selectați. În plus, este acceptată conversia automată a codurilor Windows ANSI în coduri LCD alfanumerice în limba rusă. Programul acceptă o gamă largă de familii de microcontrolere: ATtiny, ATmega, AT90.

    Simulatorul arată toate modificările care apar în diferite registre, celule de memorie și temporizatoare. Simularea poate fi efectuată pas cu pas (cu sau fără introducerea de funcții), până la un punct de întrerupere sau la o zonă selectată.
    Pentru a opera programatorul în circuit, trebuie să asamblați independent un adaptor simplu prin care microcontrolerul este conectat la portul COM al computerului. În plus, este posibilă conectarea prin intermediul unui conector USB. Programatorul numără numărul de reprograme de bază și stochează contorul în cip propriu-zis.

    Monitorizarea modului de depanare pe nucleu folosind un alt adaptor (toate diagramele sunt disponibile în documentația software-ului) vă permite să monitorizați starea internă a unui cristal real la orice punct de întrerupere. Pentru comunicarea între controler și computer, o singură ieșire este alocată la discreția utilizatorului. On Chip debug se aplică oricărui tip de cip care are memorie SRAM.

    În ciuda avantajelor sale evidente, Algorithm Builder este puțin cunoscut în comunitatea de radio amatori. Acest lucru se datorează parțial faptului că până în 2010 mediul de programare vizuală era plătit, versiunea demo gratuită a limitat codul la doi kiloocteți. Astăzi, software-ul este distribuit în mod absolut gratuit. Dosarul cu programul instalat poate fi copiat pe alte medii și poate fi portabil de lucru. Software-ul vine cu un manual de utilizare. Articolul discută o serie de lucrări simple și oferă diagrame ale programatorilor pentru porturile USB și COM.

    Autorii programului Algorithm Builder sunt un grup de programatori autohtoni sub conducerea meșterului popular Gennady Leonidovich Gromov din Nijni Novgorod. Programul continuă să se dezvolte până în prezent, sunt adăugate noi funcții și o mică selecție de biblioteci a apărut pe site-ul web al autorului.

    Interfața programului Algorithm Builder și manualul de utilizare sunt prezentate în rusă și engleză.

    Software-ul este compatibil cu sistemele de operare Microsoft Windows 95, 98, 2000, NT, ME, XP, Vista și 7.

    Distributie program: gratuit

    Materialele articolului au fost pregătite la Departamentul de Automatizare, Informatică și Sisteme de Control (AIiSU) al Universității Industriale de Stat din Moscova (GOU MGIU).
    (Din 2011, MGIU a fost numită Instituția de învățământ superior bugetar de stat „MGIU”).
    Autori: Kryukov A.I., Shubnikova I.S., Troikov S.M.

    Departamentul de AI&CS formează profesioniști în domeniul dezvoltării și exploatării sistemelor electronice, cu microprocesoare, computere, robotice, mecatronice și de control al informațiilor pentru tehnologia auto și aerospațială, inginerie mecanică și afaceri de mai bine de 35 de ani. Activitatea de cercetare a angajaților departamentului se desfășoară în domenii legate de dezvoltarea sistemelor de sprijinire a deciziilor bazate pe tehnologii de inteligență artificială, analiza și sinteza proceselor de gestionare a sistemelor complexe, monitorizarea și detectarea inteligentă a defecțiunilor echipamentelor. Un domeniu important de activitate științifică a departamentului este efectuarea de cercetări în domeniul sistemelor automate și electronice ale vehiculelor.
    Există un număr mare de aplicații diverse pentru scrierea programelor de control pentru Atmel MK - acestea sunt medii de dezvoltare și depanare în limbaje de nivel scăzut (de exemplu, pachetul gratuit AVR Studio pentru dezvoltarea de programe în limbajul AVR Assembler), medii de dezvoltare în limbaje de nivel înalt (cum ar fi mediul WinAVR pentru dezvoltarea de programe într-un limbaj asemănător C) și există chiar și un mediu grafic de dezvoltare și depanare a software-ului numit „Algorithm Builder”.

    Algorithm Builder se deosebește de toate celelalte medii și pe asta ne vom concentra. Punctul culminant al acestei aplicații nu este nici măcar că este gratuită, ci că codul din ea nici măcar nu este scris, ci este desenat sub formă de diagrame de flux ale algoritmilor, ceea ce reduce semnificativ timpul de dezvoltare a aplicației. Acest mediu oferă un ciclu complet de dezvoltare, pornind de la introducerea algoritmului, inclusiv depanarea și terminând cu programarea în circuit a cristalului. Ca rezultat, întreaga structură logică a programului devine complet clară.

    Dezvoltarea software-ului în mediul Algorithm Builder se reduce la formarea unor astfel de blocuri de sarcini, plasarea lor într-un plan și stabilirea conexiunilor între ele din tranziții condiționate și necondiționate.

    Pentru a nu rescrie întregul manual de lucru cu mediul Algorithm Builder, vă sfătuiesc să îl citiți singur, mai ales că aplicația este produsă pe plan intern și conține descriere detaliată în limba rusă bazată pe exemple la lucrul cu el. Pe baza experienței personale, putem spune cu încredere că acest manual (apropo, este departe de a fi voluminos - doar 20-30 de minute de studiu) este suficient pentru a înțelege și înțelege pe deplin acest produs software.

    Puteți descărca Algorithm Builder de la http://algrom.net/russian.html. Iar procesul de dezvoltare a unui program de control poate fi vizualizat la legătură. Astfel, vom prezenta acum programul terminat în mediul de dezvoltare descris cu comentarii detaliate despre acesta.

    În primul rând, trebuie să selectați tipul de cristal (în cazul nostru, Atmega8) în meniul Opțiuni/Opțiuni de proiect și să setați frecvența de ceas la 8.000.000 Hz (8 MHz) acolo. Apoi, resetăm cristalul la pornire (Elemente/Întreruperi/Resetare). Apoi inițializam stiva selectând Elements/Customer…/Stack Pointer (SP), se va deschide o fereastră cu care trebuie doar să fiți de acord făcând clic pe „OK” (Fig. 2).

    Orez. 2. Stack Customizer

    Următorul pas este inițializarea transceiver-ului USART (nu fi surprins de apariția literei „S” în abreviere - aceasta este o versiune mai modernă a UART, care diferă de aceasta prin capacitatea de a transmite/primi date nu numai în modul asincron, dar și în modul sincron) prin selectarea meniului Elemente / Personalizare... /USART. În fereastra care se deschide (Fig. 3), în secțiunea Receiver, bifați casetele de lângă Activare (porniți receptorul de date) și Activare întrerupere completă (activați întreruperile la primirea datelor), apoi bifați caseta de lângă Viteză dublă , setați dimensiunea caracterului Dimensiunea caracterului: 8 – biți și setați rata de transfer de date la Baud Rate = 9615 bps (când faceți clic pe selectarea ratei de transfer de date din meniu, ar trebui să selectați 9600 bps, 9615 bps se obține datorită recalcularea frecvenței de ceas la 8 MHz).


    Orez. 3. Configurator USART

    Corpul principal al programului va consta dintr-o succesiune de verificări ale codurilor de control (Lista nr. 1). Ideea este că PC-ul va trimite un cod de operare prin UART, iar MK-ul îl va primi și va genera acțiunile de control corespunzătoare pe unitatea palelor ventilatorului și servomotor. Vor exista trei astfel de coduri în total (puteți găsi absolut orice cod):

  • 31 $ - porniți unitatea palelor ventilatorului;
  • 20 USD - opriți unitatea palelor ventilatorului;
  • $A1 - acces la servomotor.

  • Dacă totul este clar cu primele două coduri, atunci cu al treilea nu este atât de simplu - $A1 este doar o comandă pentru a accesa servomotor, atunci trebuie să obțineți codul unghiului de rotație. Sa constatat experimental că variază de la 05 USD la 154 USD. Mai mult, vom trimite de pe PC și, în consecință, vom primi de la MK începând de la byte-ul mic. De asemenea, vom dezactiva întreruperile pentru primirea datelor prin USART pe durata executării comenzii - altfel se poate dovedi a fi o „mizerie” de date.

    Lista #1

    Lista nr. 2 arată codul pentru subrutina de întârziere (Delay). Întârzierea este necesară pentru procesarea corectă și completă a comenzii și se formează prin buclarea programului pentru N cicluri (prin încercare și eroare, am calculat că în cazul nostru cel mai reușit număr de cicluri este 84FF în sistemul numeric hexazecimal).

    Lista #2

    Sfârșitul primirii datelor prin UART determină întreruperea USART_Receive_Complete (dacă nu este dezactivată în prezent în corpul principal al programului), care poate fi setată în cod prin meniul Elements/Interrupts/USART_Receive_Complete. În corpul handler-ului, ar trebui să salvați toate registrele utilizate în el pe stivă, iar la sfârșitul handler-ului, să le restaurați din stivă. De asemenea, în acest handler puteți obține octetul de stare (registrul UCSRA) pentru a verifica datele pentru erori și, bineînțeles, datele în sine din registrul UDR (Listing Nr. 3).

    Lista #3

    Unghiul de rotație al servomotorului depinde de lățimea impulsului furnizat acestuia, menținând constantă perioada (perioada este de 20 ms, iar durata impulsului de control este de la 0,8 la 2,2 ms, deși pentru diferite servo aceste valori ​​pot diferi ușor) pentru aceasta avem nevoie de o subrutină.unghiul de rotație a servomotor (Listing nr. 4). Timpul pulsului de control și timpul de pauză vor fi setate în mod similar subrutinei de întârziere. După cum am scris mai sus, experimental pentru o frecvență a cristalului de 8 MHz am determinat că timpul pulsului este specificat de cod în intervalul de la $05AF la $154F. Astfel, cunoscând timpul întregii perioade - $9E3C (determinat și experimental), putem calcula timpul de pauză ca diferență între durata perioadei și durata pulsului. Tot ce rămâne este să calculăm timpul pulsului și timpul de pauză în secvență, similar subrutinei de întârziere, și apoi să repeți un astfel de semnal de mai multe ori (în cazul nostru, am repetat semnalul $ de 10 ori, adică de 16 ori în sistemul de notație zecimală). )

    Lista #4

    După ce ați scris codul (desenul algoritmului) al programului de control, este necesar să îl compilați și să îl introduceți în microcontroler. Programul poate fi compilat apăsând Ctrl+F9 sau prin meniul Program/Compile. Dacă compilarea are succes, va apărea o fereastră de informare în care va fi indicată cantitatea de memorie ocupată a MK.

    Apoi, trebuie să flashizați rezultatul compilației (un fișier cu extensia *.hex fără prefixul „EE_” la început, situat în același folder cu sursa programului) în controler. Acest lucru se poate face folosind utilitarul gratuit AvrProg, inclus și în pachetul gratuit AVR Studio. Îl puteți descărca de pe site-ul mymcu.ru sau de pe atmel.com (site-ul englez).

    Pe lângă utilitarul pentru intermiterea firmware-ului MK, veți avea nevoie și de un programator. Puteți fie să-l cumpărați (versiunile simple sunt relativ ieftine) fie să îl lipiți singur.

    Orez. 4. Circuit programator LPT
    Cel mai simplu pe care îl cunosc este un programator LPT, dar, prin urmare, va necesita un port LPT pe computer, ceea ce devine o raritate în acest moment. Ideea programatorului este simplă și constă în conectarea directă a portului LPT la interfața ISP și a liniei Reset a controlerului (Fig. 4).

    O altă opțiune pentru un programator pentru auto-asamblare este un programator USB (diagrama este prezentată în Fig. 5), este, desigur, mai complicat, dar în viitor se poate dovedi a fi mult mai convenabil. Cu toate acestea, există un „dar” - pentru a-l asambla, veți avea nevoie de un programator LPT, deși o singură dată. Va fi necesar să clipească controlerul de control al programatorului însuși pentru a clipi biții FUSE. Este necesar ca biții SPIEN, CKOPT și SUT0 să fie programați (setați la „0”). De obicei, MK-uri care vin din fabrică, de exemplu. altele noi au bitul SPIEN deja programat. De asemenea, este de dorit (dar nu necesar) să programați (setat la „0”) bitul BODEN. Biții rămași trebuie să fie neprogramați (setați la „1”). Acest lucru poate necesita aplicația Codevision AVR V2.03.4. O descriere detaliată a asamblarii programatorului USB poate fi citită aici.