Sadržaj:
- Korak 1: Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću integrirane razvojne platforme Atmel Studio 7
- Korak 2: Prijenos HEX datoteke programa u flash memoriju čipa
- Korak 3: Debouncing sklopke hardvera
- Korak 4: Električni krug
Video: AVR mikrokontroler. Uključite ili isključite LED diode pomoću prekidača. Debouncing pritiskom na gumb .: 4 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:35
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
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
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
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
Spojite komponente u skladu sa shematskim dijagramom.
Preporučeni:
Prekidač pritiskom na gumb: 31 korak
Prekidač pritiskom na gumb: Prekidač na gumb je još jedna varijanta pomoćnog prekidača. Namijenjen je djeci s teškoćama u razvoju kako bi ih se osnažilo da koriste svakodnevne potrepštine
Bežični prekidač svjetla za kućnu automatizaciju s ESP-01 i relejnim modulom s pritiskom na gumb: 7 koraka
Kućna automatizacija Prekidač svjetla za WiFi s ESP-01 i relejnim modulom s gumbom: Dakle, u prethodnim uputama programirali smo ESP-01 s Tasmotom pomoću ESP Flashera i povezali ESP-01 na naše WiFi mreže. Sada ga možemo početi programirati za uključivanje/isključivanje prekidača za svjetlo pomoću WiFi -a ili gumba za pritiskanje. Za električne radove
Atolički TrueStudio-Uključite LED pritiskom pritiskom na gumb pomoću STM32L100: 4 koraka
Atolički TrueStudio-Uključite LED pritiskom pritiskom na gumb pomoću STM32L100: U ovom tutorialu o STM32 ću vam reći kako čitati GPIO pin STM32L100, pa ću ovdje napraviti jedan na ploči Led glow by just pritiskom na gumb
Uključite i isključite računalo pomoću Google Home & Blynk: 6 koraka
Uključite i isključite svoje računalo pomoću usluge Google Home & Blynk: Pozdrav, momci, dobrodošli u ovaj vodič! Ovaj put ću vam pokazati kako uključiti računalo pomoću svoje Google početne PROČITAJTE !!: 1. Svakako izolirajte povezivanja! Odabrao sam 3D ispis kućišta kako bih riješio ovaj problem 2. Ako priključite napajanje na
LED, s pritiskom na gumb Start i Fade Out: 5 koraka
LED, s pritiskom na gumb Start i Fade Out: Ovo će opisati jednostavan sklop koji dopušta 9 v. Bateriji da napaja LED, a zatim nestaje nakon što se gumb otpusti. Nešto vrlo slično zatraženo je u jednom pitanju na forumima. Nadam se da je ovo korisno kao prototip