Sadržaj:

AVR mikrokontroler. Uključite ili isključite LED diode pomoću prekidača. Debouncing pritiskom na gumb .: 4 koraka
AVR mikrokontroler. Uključite ili isključite LED diode pomoću prekidača. Debouncing pritiskom na gumb .: 4 koraka

Video: AVR mikrokontroler. Uključite ili isključite LED diode pomoću prekidača. Debouncing pritiskom na gumb .: 4 koraka

Video: AVR mikrokontroler. Uključite ili isključite LED diode pomoću prekidača. Debouncing pritiskom na gumb .: 4 koraka
Video: ESP8266 ESP01 WI-FI-UART | Программирование LDmicro-Roboremo 2024, Srpanj
Anonim
Image
Image

U ovom odjeljku naučit ćemo Kako napraviti programski kod C za ATMega328PU za prebacivanje statusa tri LED diode prema ulazu s prekidača s gumbom. Također, istražili smo rješenja problema 'Switch Bounce'. Kao i obično, sastavit ćemo električni krug na bazi AVR ATmega328 kako bismo provjerili rad programskog koda.

Korak 1: Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7

Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7
Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7
Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7
Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7
Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7
Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7

Ako nemate Atmel Studio, trebali biste ga preuzeti i instalirati.

www.microchip.com/mplab/avr-support/atmel-studio-7

Prvih nekoliko redaka koje imamo definira neki prevoditelj.

F_CPU definira frekvenciju takta u Hertzima i uobičajeno je u programima koji koriste biblioteku avr-libc. U ovom slučaju rutine kašnjenja koriste se za određivanje načina izračunavanja vremenskih kašnjenja.

#ifndef F_CPU

#define F_CPU 16000000UL // govorna frekvencija kristala kontrolera (16 MHz AVR ATMega328P) #endif

#include // zaglavlje za omogućavanje kontrole protoka podataka preko pinova. Definira pinove, priključke itd.

Prva datoteka uključivanja dio je avr-libc i koristit će se u gotovo svim AVR projektima na kojima radite. io.h će odrediti CPU koji koristite (zato prilikom sastavljanja navodite dio) i zauzvrat uključiti odgovarajuće zaglavlje IO definicije za čip koji koristimo. Jednostavno definira konstante za sve vaše pinove, portove, posebne registre itd.

#include // zaglavlje za omogućavanje funkcije odgode u programu

Knjižnica util/delay.h sadrži neke rutine za kratka kašnjenja. Funkcija koju ćemo koristiti je _delay_ms ().

Koristimo definicije za deklariranje portova i pinova gumba i LED dioda. Korištenje ovakvih izraza defines omogućuje nam da trebamo izmijeniti samo 3 linije koje je lako pronaći ako LED premjestimo na drugi I/O pin ili koristimo drugi AVR.

#define BUTTON1 1 // prekidač gumba spojen na priključak 1 B 1

#define LED1 0 // Led1 spojen na port B pin 0 #define LED2 1 // Led2 spojen na port C pin 1 #define LED3 2 // Led3 spojen na port D pin 2

Posljednja dva definiraju vrijeme postavljanja izraza, u milisekundama, za poništavanje prekidača i vrijeme čekanja prije nego što se dopusti ponovni pritisak gumba. Vrijeme debouncea treba prilagoditi vremenu koje je potrebno za prelazak s digitalnog na digitalni najniži nivo nakon svih poskakivanja. Ponašanje odbijanja razlikovat će se od prekidača do prekidača, ali obično je dovoljno 20-30 milisekundi.

#define DEBOUNCE_TIME 25 // vrijeme čekanja dok gumb "de-bouncing"

#define LOCK_INPUT_TIME 300 // vrijeme čekanja nakon pritiska na gumb

void init_ports_mcu ()

{

Ova se funkcija poziva samo jednom na početku našeg programa za inicijalizaciju ulaznih izlaznih pinova koje ćemo koristiti.

Za gumb ćemo koristiti PORT i PIN registre za pisanje i čitanje. S AVR -ovima čitamo pin pomoću registra PINx i upisujemo pin pomoću registra PORTx. Moramo pisati u registar gumba kako bismo omogućili povlačenje.

Za LED samo trebamo koristiti PORT registar za pisanje, međutim, također nam je potreban registar smjera podataka (DDR) jer su I/O pinovi prema zadanim postavkama postavljeni kao ulazi.

Prvo postavljamo I/O pinove LED -a kao izlaz pomoću registra smjera podataka.

DDRB = 0xFFu; // Postavite sve pinove PORTB -a kao izlaz.

Zatim izričito postavite pin tipke kao ulaz.

DDRB & = ~ (1 <

Zatim su pinovi PORTB postavljeni visoko (+5 volti) za uključivanje. Izlazni pinovi su u početku visoki, a budući da je LED dioda aktivno ožičena, bit će uključena ako je izričito ne isključimo.

I na kraju, omogućujemo unutarnji pull-up otpornik na ulaznom pinu koji koristimo za naš gumb. To se postiže jednostavnim ispisivanjem jednog u port. Kad se konfigurira kao ulaz, to dovodi do omogućavanja povlačenja, a kad se konfigurira kao izlaz, jednostavno bi se dao visoki napon.

PORTB = 0xFF; // Sve pinove PORTB -a postavite kao VISOKE. Led je uključen, // također je omogućen unutarnji pull -up otpornik prvog pina PORTB. DDRC = 0xFFu; // Postavite sve pinove PORTC -a kao izlaz. PORTC = 0x00u; // Sve pinove PORTC -a postavite na nisko što ga isključuje. DDRD = 0xFFu; // Postavi sve pinove PORTD -a kao izlaz. PORTD = 0x00u; // Postavi sve pinove PORTD -a na nisko što ga isključuje. }

unsigned char button_state ()

{

Ova funkcija vraća logičku vrijednost koja pokazuje je li tipka pritisnuta ili ne. Ovo je blok koda s kojim se neprestano izvršava u infinatnoj petlji, pa se time vrši ispitivanje stanja gumba. Ovdje također odbacujemo prekidač.

Zapamtite da kad pritisnemo prekidač, ulazni izlazni pin je povučen na masu. Dakle, čekamo da se pin spusti.

/ * tipka se pritisne kada je BUTTON1 bit jasan */

ako (! (PINB & (1 <

To činimo provjerom je li bit jasan. Ako je bit jasan, što ukazuje na to da je gumb pritisnut, prvo odgađamo vrijeme koje je definirano DEBOUNCE_TIME, a to je 25 ms, a zatim ponovno provjeravamo stanje gumba. Ako je gumb pritisnut nakon 25 ms, smatra se da je sklopka oslobođena i spremna za pokretanje događaja, pa se vraćamo 1 u rutinu pozivanja. Ako gumb nije pritisnut, vraćamo se 0 u rutinu pozivanja.

_kašnjenje_ms (DEBOUNCE_TIME);

ako (! (PINB & (1 <

int main (void)

{

Naša glavna rutina. Glavna funkcija je jedinstvena i izdvaja se od svih ostalih funkcija. Svaki C program mora imati točno jednu glavnu () funkciju. main je mjesto gdje AVR počinje izvršavati vaš kôd kad se napajanje uključi, pa je to ulazna točka programa.

unsigned char n_led = 1; // u početku je LED broj sada uključen

Poziv funkcije za inicijalizaciju I/O pinova koji se koriste:

init_ports_mcu ();

beskonačna petlja u kojoj se izvodi naš program:

dok (1)

{

Kada button_state vraća jedan koji označava da je gumb pritisnut i otkinut, tada se izmjenjuje trenutni status LED dioda prema parametru n_led.

if (button_state ()) // Ako je gumb pritisnut, promijenite stanje LED diode i odgodite 300 ms (#define LOCK_INPUT_TIME)

{prekidač (n_led) {slučaj 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); pauza;

Ovi izrazi koriste C bitovne operatore. Ovaj put koristi ekskluzivni operator OR. Kada XOR PORT unesete u bitnu vrijednost bita koji želite prebaciti, taj se bit mijenja bez utjecaja na ostale bitove.

slučaj 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); pauza; slučaj 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // resetiranje prekida broja LED -a; } n_led ++; // sljedeća LED dioda je uključena _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Dakle, sada, kada pokrenete ovaj program, trebali biste moći pritisnuti gumb za prebacivanje LED dioda. Zbog našeg kašnjenja definiranog LOCK_INPUT_TIME, možete pritisnuti i držati tipku zbog koje će se LED diode konstantno gasiti i uključivati (malo više od svakih 275 ms).

Programiranje je dovršeno.

Sljedeći korak je izgradnja projekta i programiranje hex datoteke u mikrokontroler pomoću programa avrdude.

Main.c datoteku s programom možete preuzeti u c kodu:

Korak 2: Prijenos HEX datoteke programa u flash memoriju čipa

Prijenos HEX datoteke programa u flash memoriju čipa
Prijenos HEX datoteke programa u flash memoriju čipa
Prijenos HEX datoteke programa u flash memoriju čipa
Prijenos HEX datoteke programa u flash memoriju čipa

Preuzmite i instalirajte AVRDUDE. Najnovija dostupna verzija je 6.3: Preuzmite zip datoteku

Prvo kopirajte heksadecimalnu datoteku programa u direktorij AVRDUDE. U mom slučaju to je ButtonAVR.hex

Zatim u prozor DOS upita upišite naredbu: avrdude –c [ime programera] –p m328p –u –U flash: w: [naziv vaše heksadecimalne datoteke].

U mom slučaju to je: avrdude –c ISPProgv1 –p m328p –u –U bljeskalica: w: ButtonAVR.hex

Ova naredba zapisuje heksadecimalnu datoteku u memoriju mikrokontrolera.

Pogledajte video s detaljnim opisom snimanja flash memorije mikrokontrolera:

Snimanje flash memorije mikrokontrolera …

U redu! Sada mikrokontroler radi u skladu s uputama našeg programa. Idemo provjeriti!

Korak 3: Debouncing sklopke hardvera

Debouncing hardverskog prekidača
Debouncing hardverskog prekidača

Osim uklanjanja softverskih prekidača, možemo koristiti i tehniku uklanjanja hardverskih prekidača. Osnovna ideja takve tehnike je korištenje kondenzatora za filtriranje brzih promjena signala prekidača.

Koju vrijednost kondenzatora treba odabrati? To će u konačnici ovisiti o tome koliko loše gumb radi u vezi s ovim problemom. Neki gumbi mogu prikazati ogromno ponašanje poskakivanja, dok će drugi imati vrlo malo. Niska vrijednost kondenzatora poput 1,0 nanofarada reagirat će vrlo brzo, s malim ili nikakvim učinkom na odskakanje. Nasuprot tome, veća vrijednost kondenzatora, poput 220 nanofarada (što je još uvijek prilično malo u smislu kondenzatora) omogućit će spor prijelaz s početnog na krajnji napon (5 volti na 0 volti). Prijelaz viđen s kapacitetom od 220 nanofarada ipak je prilično brz u stvarnom smislu pa se stoga može koristiti na gumbima sa lošim performansama.

Korak 4: Električni krug

Strujni krug
Strujni krug
Strujni krug
Strujni krug
Strujni krug
Strujni krug

Spojite komponente u skladu sa shematskim dijagramom.

Preporučeni: