Sadržaj:

AVR mikrokontroler. Uključite LED diode pomoću prekidača na dugme. Izdvajanje dugmeta: 4 koraka
AVR mikrokontroler. Uključite LED diode pomoću prekidača na dugme. Izdvajanje dugmeta: 4 koraka

Video: AVR mikrokontroler. Uključite LED diode pomoću prekidača na dugme. Izdvajanje dugmeta: 4 koraka

Video: AVR mikrokontroler. Uključite LED diode pomoću prekidača na dugme. Izdvajanje dugmeta: 4 koraka
Video: Объяснение прошивки Marlin 2.0.x 2024, Juli
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 smo istražili rješenja problema „Switch Bounce“. Kao i obično, sastavit ćemo električno kolo 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 definira neki kompajler definira.

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

#ifndef F_CPU

#define F_CPU 16000000UL // kristalna frekvencija regulatora kazivanja (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 određujete dio prilikom kompajliranja) i zauzvrat će 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 deklarisanje portova i pinova dugmeta i LED dioda. Korištenje ovako definiranih izraza 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č dugmeta spojen na port B pin 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 dozvoli još jedan pritisak na dugme. Vrijeme debouncea treba prilagoditi vremenu koje je potrebno za prelazak sa digitalnog na digitalni najniži nivo nakon svih poskakivanja. Ponašanje odbijanja će se razlikovati od prekidača do prekidača, ali obično je dovoljno 20-30 milisekundi.

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

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

void init_ports_mcu ()

{

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

Za dugme ćemo koristiti PORT i PIN registre za pisanje i čitanje. Sa AVR -ovima čitamo pin koristeći njegov PINx registar i upisujemo pin koristeći njegov PORTx registar. Moramo pisati u registar dugmadi kako bismo omogućili povlačenje.

Za LED samo trebamo koristiti PORT registar za pisanje, međutim, potreban nam je i registar 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 eksplicitno postavite pin dugmeta 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še dugme. To se postiže jednostavnim ispisivanjem jednog na port. Kada se konfigurira kao ulaz, to rezultira omogućavanjem povlačenja, a kada se konfigurira kao izlaz, jednostavno bi se dao visoki napon.

PORTB = 0xFF; // Sve pinove PORTB -a postavite kao VISOKE. LED dioda je uključena, // omogućen je i unutrašnji 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; // Postavite sve pinove PORTD -a kao izlaz. PORTD = 0x00u; // Sve pinove PORTD -a postavite 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 sa kojim se neprestano izvršava u infinitnoj petlji i tako se vrši ispitivanje stanja dugmeta. Ovdje se također odričemo prekidača.

Sada zapamtite da kada pritisnemo prekidač, ulazni izlazni pin je povučen na masu. Dakle, čekamo da pin padne.

/ * dugme se pritisne kada je BUTTON1 bit čist */

ako (! (PINB & (1 <

To činimo provjerom je li bit jasan. Ako je bit jasan, što ukazuje na to da je tipka pritisnuta, prvo odgađamo za vrijeme koje je definirano DEBOUNCE_TIME, a to je 25ms, a zatim ponovo provjeravamo stanje dugmeta. Ako je dugme pritisnuto nakon 25 ms, smatra se da je prekidač otpušten i spreman za pokretanje događaja, pa se vraćamo 1 u rutinu pozivanja. Ako dugme nije pritisnuto, vraćamo se 0 u rutinu pozivanja.

_delay_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 tačno jednu glavnu () funkciju. main je mjesto gdje AVR počinje izvršavati vaš kôd kada 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 vrati jedan koji označava da je dugme pritisnuto i debounce, tada se redom mijenja trenutni status LED dioda prema parametru n_led.

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

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

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 jedan bit mijenja bez utjecaja na ostale bitove.

slučaj 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); break; slučaj 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // resetiranje prekida broja LED -a; } n_led ++; // uključivanje sljedeće LED diode _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 završeno.

Sljedeći korak je izgradnja projekta i programiranje heksadecimalne 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 blic: w: ButtonAVR.hex

Ova naredba zapisuje heksadecimalnu datoteku u memoriju mikrokontrolera.

Pogledajte video s detaljnim opisom snimanja flash memorije mikrokontrolera:

Snimanje fleš memorije mikrokontrolera …

Uredu! Sada mikrokontroler radi u skladu s uputama našeg programa. Hajde da provjerimo!

Korak 3: Debouncing hardverskog prekidača

Debouncing hardverskog prekidača
Debouncing hardverskog prekidača

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

Koju vrijednost kondenzatora treba odabrati? To će na kraju ovisiti o tome koliko loše dugme radi u vezi s ovim problemom. Neki gumbi mogu prikazati ogromno odskočno ponašanje, 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 sa kapacitetom od 220 nanofarada je ipak prilično brz u stvarnom smislu pa se stoga može koristiti na tipkama sa slabim performansama.

Korak 4: Električno kolo

Električno kolo
Električno kolo
Električno kolo
Električno kolo
Električno kolo
Električno kolo

Spojite komponente u skladu sa shematskim dijagramom.

Preporučuje se: