Lecția # 2

Obiectiv: de a dezvolta un dispozitiv de control cu ​​LED-uri cu ajutorul unui singur buton. De fiecare dată când butonul este apăsat, ieșirea portului la care este conectat LED-ul trebuie să-și schimbe starea la alta. Această problemă este rezolvată cu ușurință cu ajutorul declanșatorului D, dar mai ia în considerare modul în care poate fi rezolvată cu ajutorul unui microcontroler.







Schema dispozitivului este aceeași ca în lecția 1. Algoritmul programului este simplu. Mai întâi, configurați porturile I / O. Verificați starea portului de descărcare Jr. D (PD0), care este conectat la buton, iar apoi efectuați operațiunea comparație, în cazul în care PD0 este verificat pentru egalitate unul. În cazul în care condiția este îndeplinită programul sare la partea de sus a buclei, în cazul în care nu se efectuează apoi o altă operațiune de comparație, dar linia PB0. Mai întâi comparație controalele operatorului PB0 să fie egală cu zero, dacă rezultatul este adevărat (PB0 = 0), apoi descărcată în unitatea de descărcare (PB0 = 1). Dacă fals, setat la zero (PB0 = 0). Apoi, am pus procedura de așteptare în program, fără ca LED-ul nostru să clipească atât de des încât ochiul nostru nu o va observa. Ciclul principal al programului va fi suspendat de îndată ce LED-ul se va comuta și va fi reluat de îndată ce butonul este eliberat.

Configurarea porturilor I / O ca în task 1:

DDRD = 0x00; // port D - intrare

PORTD = 0xFF; // conectați rezistențele de sarcină

DDRB = 0xFF; // portul B - ieșire

PORTB = 0x00; // setați ieșirea la 0







Scriem ciclul principal al programului. Aici vom folosi instrucțiunea condiționată if else. Acest operator efectuează diverse operațiuni în funcție de o anumită condiție și este scris astfel:

O condiție este orice expresie logică. Dacă rezultatul acestei expresii este adevărat, atunci "setul de operatori A" este îndeplinit, altfel "setul de operatori B"

Procedura de așteptare pentru un clic pe buton este o buclă goală în timp ce. iar acest ciclu va fi executat până când condiția este adevărată. Condiția este egalitatea liniei PD0 cu unitatea, adică până la apăsarea butonului.

în timp ce ((PIND (1 <

Verificăm starea liniei PB0 cu următoarea expresie

dacă ((PINB (1 <

Schimbați starea PB0 la contrariul

PORTB | = (1 <

În caz contrar, lăsăm zero în PB0

(1 <

Apoi verificați din nou starea butonului

în timp ce ((PIND (1< // Dacă butonul este apăsat, va fi executată o buclă goală

De asemenea, în acest program, puteți rezolva problema sarcinii de contact. Cea mai ușoară modalitate de a introduce întârzieri speciale în program. Săritura are ca rezultat o serie de impulsuri la bitul corespunzător al portului D în loc de o tranziție simplă de la un la zero. Pentru a scăpa de acest program, trebuie să intrați în modul de așteptare de îndată ce detectează primul nivel zero la intrare. În modul de așteptare, programul suspendă toate acțiunile sale și efectuează întârzierea. Pentru a introduce o întârziere, folosim biblioteca standard a procedurii de întârziere util / delay.h.

Folosim funcția care implementează întârzierea:

_delay_ms (200); // o întârziere de 200 de milisecunde

Acesta oferă o întârziere în orice număr întreg de microsecunde. Mai mult, această funcție este introdusă pur și simplu după fiecare buclă.

Codul programului va fi:

În acest articol am folosit materiale din cartea lui AV Belov. "Dezvoltator auto-dezvoltat pe AVR"







Articole similare

Trimiteți-le prietenilor: