Innholdsfortegnelse:

AVR mikrokontroller. Veksle lysdioder med en trykknappbryter. Trykknapp -debouncing .: 4 trinn
AVR mikrokontroller. Veksle lysdioder med en trykknappbryter. Trykknapp -debouncing .: 4 trinn

Video: AVR mikrokontroller. Veksle lysdioder med en trykknappbryter. Trykknapp -debouncing .: 4 trinn

Video: AVR mikrokontroller. Veksle lysdioder med en trykknappbryter. Trykknapp -debouncing .: 4 trinn
Video: Birdie 23 - Atmel 8-bitars AVR föreläsning 2024, Juli
Anonim
Image
Image

I denne delen lærer vi hvordan du lager program C -kode for ATMega328PU for å veksle statusen til de tre lysdiodene i henhold til inngangen fra en knappbryter. Vi har også utforsket en løsning på problemet med "Switch Bounce". Som vanlig vil vi montere den elektriske kretsen på basen av AVR ATmega328 for å kontrollere arbeidet med programkoden.

Trinn 1: Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7

Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7
Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7
Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7
Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7
Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7
Skrive og bygge AVR -mikrokontrollerprogram i C -kode ved hjelp av den integrerte utviklingsplattformen Atmel Studio 7

Hvis du ikke har Atmel Studio, bør du laste det ned og installere det.

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

De første linjene har vi noen kompilatordefinisjoner.

F_CPU definerer klokkefrekvensen i Hertz og er vanlig i programmer som bruker avr-libc-biblioteket. I dette tilfellet brukes det av forsinkelsesrutinene for å bestemme hvordan man skal beregne forsinkelser.

#ifndef F_CPU

#define F_CPU 16000000UL // forteller kontrolleren krystallfrekvens (16 MHz AVR ATMega328P) #endif

#include // header for å aktivere dataflytkontroll over pins. Definerer pinner, porter, etc.

Den første inkluderer-filen er en del av avr-libc og vil bli brukt i stort sett alle AVR-prosjekter du jobber med. io.h vil bestemme CPU -en du bruker (det er derfor du angir delen når du kompilerer) og vil deretter inkludere den riktige IO -definisjonsoverskriften for brikken vi bruker. Den definerer ganske enkelt konstantene for alle dine pinner, porter, spesielle registre osv.

#include // header for å aktivere forsinkelsesfunksjon i programmet

Biblioteket util/delay.h inneholder noen rutiner for korte forsinkelser. Funksjonen vi skal bruke, er _delay_ms ().

Vi bruker definisjoner for å deklarere vår knapp og LED -porter og pinner. Ved å bruke definisjonene som dette tillater vi bare å endre tre linjer som er lett å finne hvis vi flytter lysdioden til en annen I/O-pinne eller bruker en annen AVR.

#define BUTTON1 1 // knappbryter koblet til port B pin 1

#define LED1 0 // Led1 koblet til port B pin 0 #definere LED2 1 // Led2 koblet til port C pin 1 #definere LED3 2 // Led3 koblet til port D pin 2

De to siste definerer setningstidspunktene for oppsett, i millisekund, for å avbryte bryteren og tid til å vente før du trykker på knappen igjen. Avvisningstiden må justeres til tiden det tar bryteren for å gå fra en digital høy til en digital lav etter all hopp. Sprettadferden vil variere fra bryter til bryter, men 20-30 millisekunder er vanligvis ganske tilstrekkelig.

#define DEBOUNCE_TIME 25 // tid til å vente mens "de-bouncing" -knappen

#define LOCK_INPUT_TIME 300 // tid å vente etter et knappetrykk

ugid init_ports_mcu ()

{

Denne funksjonen kalles bare en gang i begynnelsen av programmet vårt for å initialisere inngangspinnene som vi skal bruke.

For knappen bruker vi PORT- og PIN -registerene for skriving og lesing. Med AVRer leser vi en pin ved å bruke PINx -registeret, og vi skriver til en pin med PORTx -registeret. Vi må skrive til knappregisteret for å aktivere pull-ups.

For LED -en trenger vi bare å bruke PORT -registeret til å skrive til, men vi trenger også dataretningsregisteret (DDR) ettersom I/O -pinnene er konfigurert som innganger som standard.

Først setter vi LEDs I/O -pinner som en utgang ved å bruke dataretningsregisteret.

DDRB = 0xFFu; // Sett alle pinnene på PORTB som utgang.

Deretter angir du knappenålen som en inngang.

DDRB & = ~ (1 <

Deretter settes PORTB -pinnene høyt (+5 volt) for å slå den på. Utgangspinnene er i utgangspunktet høye, og siden LED-en vår er aktiv-høy, er den slått på med mindre vi eksplisitt slår den av.

Og til slutt aktiverer vi den interne opptrekksmotstanden på inngangspinnen vi bruker til knappen vår. Dette gjøres ganske enkelt ved å legge ut en til porten. Når det er konfigurert som en inngang, resulterer det i å muliggjøre pull-ups, og når det konfigureres som en utgang, vil det ganske enkelt sende ut en høyspenning.

PORTB = 0xFF; // Sett alle pinnene på PORTB som HØY. LED er slått på, // også den interne Pull Up -motstanden til den første pinnen PORTB er aktivert. DDRC = 0xFFu; // Sett alle pinnene på PORTC som utgang. PORTC = 0x00u; // Sett alle pinnene på PORTC lavt som slår den av. DDRD = 0xFFu; // Sett alle pinnene på PORTD som utgang. PORTD = 0x00u; // Sett alle pinnene på PORTD lavt som slår den av. }

usignert char button_state ()

{

Denne funksjonen returnerer en boolsk verdi som indikerer om knappen ble trykket eller ikke. Dette er blokkeringen av kode som kontinuerlig blir utført i den uendelige løkken, og dermed undersøkes knappen til knappen. Det er også her vi avbryter bryteren.

Husk nå at når vi trykker på bryteren, trekkes inngangspinnen til bakken. Dermed venter vi på at pinnen skal gå lavt.

/ * knappen trykkes når BUTTON1 bit er klar */

hvis (! (PINB & (1 <

Vi gjør det ved å sjekke om biten er klar. Hvis biten er klar, noe som indikerer at knappen er trykket ned, forsinker vi først den tidsperioden som er definert av DEBOUNCE_TIME, som er 25 ms, og kontrollerer deretter knappen til knappen igjen. Hvis knappen er trykket ned etter 25 ms, regnes bryteren for å være avstoppet og klar til å utløse en hendelse, og derfor går vi tilbake 1 til vår ringerutine. Hvis knappen ikke er trykket ned, går vi tilbake til ringe -rutinen 0.

_forsinkelse_ms (DEBOUNCE_TIME);

hvis (! (PINB & (1 <

int main (ugyldig)

{

Vår viktigste rutine. Hovedfunksjonen er unik og skilt fra alle andre funksjoner. Hvert C -program må ha nøyaktig én hovedfunksjon (). main er der AVR begynner å utføre koden din når strømmen først går på, så det er inngangspunktet for programmet.

usignert tegn n_led = 1; // LED -nummeret er opprinnelig på nå

Anrop av funksjonen for å initialisere I/O -pinner som brukes:

init_ports_mcu ();

uendelig sløyfe der programmet vårt kjører:

mens (1)

{

Når button_state returnerer en som indikerer at knappen ble trykket og debounced, og deretter bytte den nåværende statusen til LED -er etter tur i henhold til n_led -parameteren.

if (button_state ()) // Hvis du trykker på knappen, bytt LED -status og forsinkelse i 300 ms (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); gå i stykker;

Disse utsagnene bruker C bitvise operatører. Denne gangen bruker den den eksklusive OR -operatøren. Når du XORER PORTEN med bitverdien til biten du vil bytte, endres den ene biten uten å påvirke de andre bitene.

sak 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); gå i stykker; sak 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // tilbakestill LED -nummerbrudd; } n_led ++; // neste LED er slå på _delay_ms (LOCK_INPUT_TIME); }} retur (0); }

Så nå, når du kjører dette programmet, bør du være i stand til å trykke på trykknappen for å slå av lysdioder. På grunn av forsinkelsen vår definert av LOCK_INPUT_TIME, kan du trykke og holde inne knappen som vil føre til at lysdiodene slås av og på med en konstant hastighet (litt mer enn hver 275 ms).

Programmeringen er fullført.

Neste trinn er å bygge prosjektet og programmere hex -filer i mikrokontrolleren ved hjelp av avrdude -programmet.

Du kan laste ned main.c -filen med programmet i c -kode:

Trinn 2: Overføring av HEX -filen til programmet til flashminnet til brikken

Overføring av HEX -filen til programmet til flashminnet til brikken
Overføring av HEX -filen til programmet til flashminnet til brikken
Overføring av HEX -filen til programmet til flashminnet til brikken
Overføring av HEX -filen til programmet til flashminnet til brikken

Last ned og installer AVRDUDE. Den siste tilgjengelige versjonen er 6.3: Last ned zip -filen

Kopier først hex -filen til programmet til AVRDUDE -katalogen. I mitt tilfelle er det ButtonAVR.hex

Skriv deretter inn kommandoen DOS -ledetekst: avrdude –c [navn på programmerer] –p m328p –u –U flash: w: [navn på hex -filen].

I mitt tilfelle er det: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Denne kommandoen skriver hex -fil til mikrokontrollerens minne.

Se videoen med en detaljert beskrivelse av brenning av mikrokontroller -flashminne:

Mikrokontroller blitsminne brenner …

Ok! Nå fungerer mikrokontrolleren i henhold til instruksjonene i programmet vårt. La oss sjekke det ut!

Trinn 3: Debontering av maskinvarebryter

Maskinvarebryter Debouncing
Maskinvarebryter Debouncing

I tillegg til Software switch debouncing kan vi bruke hardware switch debouncing technique. Grunntanken bak slik teknikk er å bruke en kondensator for å filtrere ut raske endringer i brytesignalet.

Hvilken verdi kondensator bør velges? Dette vil til syvende og sist avhenge av hvor dårlig knappen fungerer når det gjelder dette problemet. Noen knapper kan vise en enorm sprettadferd, men andre vil ha veldig lite. En lav kondensatorverdi som 1,0 nanofarader vil reagere veldig raskt, med liten eller ingen effekt på hoppet. Motsatt vil en høyere kondensatorverdi som 220 nanofarader (som fortsatt er ganske liten når det gjelder kondensatorer) gi en langsom overgang fra start til sluttspenning (5 volt til 0 volt). Overgangen sett med en 220 nanofarad-kapasitet er imidlertid fortsatt ganske rask i virkeligheten, og kan dermed brukes på knapper med dårlig ytelse.

Trinn 4: Elektrisk krets

Elektrisk krets
Elektrisk krets
Elektrisk krets
Elektrisk krets
Elektrisk krets
Elektrisk krets

Koble til komponenter i henhold til skjematisk diagram.

Anbefalt: