Indholdsfortegnelse:

AVR mikrokontroller. Skift LED'er ved hjælp af en trykknapkontakt. Push Button Debouncing .: 4 trin
AVR mikrokontroller. Skift LED'er ved hjælp af en trykknapkontakt. Push Button Debouncing .: 4 trin

Video: AVR mikrokontroller. Skift LED'er ved hjælp af en trykknapkontakt. Push Button Debouncing .: 4 trin

Video: AVR mikrokontroller. Skift LED'er ved hjælp af en trykknapkontakt. Push Button Debouncing .: 4 trin
Video: ESP8266 ESP01 WI-FI-UART | Программирование LDmicro-Roboremo 2024, November
Anonim
Image
Image

I dette afsnit lærer vi, hvordan man laver program C -kode til ATMega328PU for at skifte status for de tre lysdioder i henhold til input fra en knapkontakt. Vi har også undersøgt en løsning på problemet med 'Switch Bounce'. Som normalt samler vi det elektriske kredsløb på basen af AVR ATmega328 for at kontrollere programmets kode.

Trin 1: Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7

Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7
Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7
Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7
Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7
Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7
Skrivning og opbygning af AVR -mikrokontrollerprogram i C -kode ved hjælp af den integrerede udviklingsplatform Atmel Studio 7

Hvis du ikke har Atmel Studio, skal du downloade og installere det.

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

De første par linjer har vi nogle kompilerdefiner.

F_CPU definerer urfrekvensen i Hertz og er almindelig i programmer, der bruger avr-libc-biblioteket. I dette tilfælde bruges det af forsinkelsesrutinerne til at bestemme, hvordan man beregner forsinkelser.

#ifndef F_CPU

#define F_CPU 16000000UL // fortæller controller krystalfrekvens (16 MHz AVR ATMega328P) #endif

#include // header for at aktivere dataflowkontrol over pins. Definerer stifter, porte osv.

Den første include-fil er en del af avr-libc og vil blive brugt i stort set ethvert AVR-projekt, du arbejder på. io.h bestemmer den CPU, du bruger (derfor angiver du delen, når du kompilerer) og inkluderer igen det relevante IO -definitionsoverskrift til den chip, vi bruger. Det definerer simpelthen konstanterne for alle dine pins, porte, specielle registre osv.

#include // header for at aktivere forsinkelsesfunktion i programmet

Biblioteket util/delay.h indeholder nogle rutiner for korte forsinkelser. Den funktion, vi vil bruge, er _delay_ms ().

Vi bruger definer til at erklære vores knap og LED's porte og pins. Ved at bruge de definerede udsagn som denne giver vi kun brug for at ændre 3 linjer, der er let at finde, hvis vi flytter LED'en til en anden I/O-pin eller bruger en anden AVR.

#define BUTTON1 1 // knapkontakt tilsluttet port B pin 1

#defineret LED1 0 // Led1 tilsluttet port B pin 0 #defineret LED2 1 // Led2 tilsluttet port C pin 1 #defineret LED3 2 // Led3 tilsluttet port D pin 2

De sidste to definerer opsætningstider for udsagn, i millisekund, for at afbryde kontakten og tiden til at vente, før der tillades endnu et tryk på knappen. Nedbrydningstiden skal justeres til den tid, det tager omskifteren at gå fra en digital høj til en digital lav efter al afvisning. Afvisningsadfærden vil variere fra switch til switch, men 20-30 millisekunder er typisk ganske tilstrækkelig.

#define DEBOUNCE_TIME 25 // tid til at vente, mens knappen "de-bouncer"

#define LOCK_INPUT_TIME 300 // tid til at vente efter et tryk på en knap

ugid init_ports_mcu ()

{

Denne funktion kaldes kun én gang i starten af vores program for at initialisere input output pins, som vi vil bruge.

Til knappen bruger vi PORT- og PIN -registre til at skrive og læse. Med AVR'er læser vi en pin ved hjælp af dens PINx -register, og vi skriver til en pin ved hjælp af dets PORTx -register. Vi skal skrive til knapregistret for at muliggøre pull-ups.

For LED'en behøver vi kun at bruge PORT -registeret til at skrive til, men vi har også brug for data direction -registret (DDR), da I/O -benene er konfigureret som input som standard.

Først indstiller vi LED's I/O -ben som en udgang ved hjælp af dets dataretningsregister.

DDRB = 0xFFu; // Indstil alle stifter på PORTB som output.

Indstil derefter eksplicit knappestiften som input.

DDRB & = ~ (1 <

Derefter sættes PORTB -benene højt (+5 volt) for at tænde det. Outputstifterne er oprindeligt høje, og da vores LED er aktiv-høj, er den tændt, medmindre vi eksplicit slukker den.

Og endelig aktiverer vi den interne pull-up-modstand på input-pin, vi bruger til vores knap. Dette gøres ganske enkelt ved at sende en til porten. Når det konfigureres som en indgang, resulterer det i aktivering af pull-ups, og når det konfigureres som et output, ville det ganske enkelt udsende en højspænding.

PORTB = 0xFF; // Sæt alle stifter på PORTB'en som HØJ. LED er tændt, // også den interne Pull Up -modstand på den første pin PORTB er aktiveret. DDRC = 0xFFu; // Indstil alle stifter i PORTC som output. PORTC = 0x00u; // Sæt alle stifter i PORTC lavt, hvilket slukker det. DDRD = 0xFFu; // Indstil alle pins på PORTD som output. PORTD = 0x00u; // Sæt alle stifter på PORTD lavt, hvilket slukker. }

unsigned char button_state ()

{

Denne funktion returnerer en boolsk værdi, der angiver, om der blev trykket på knappen eller ej. Dette er kodeblokken med, der løbende udføres i den uendelige loop og derfor poller tilstanden af knappen. Det er også her, vi afbryder kontakten.

Husk nu, at når vi trykker på kontakten, trækkes input -udgangsstiften til jorden. Således venter vi på, at stiften går lavt.

/ * der trykkes på knappen, når BUTTON1 bit er klar */

hvis (! (PINB & (1 <

Det gør vi ved at kontrollere, om bitten er klar. Hvis bitten er klar, hvilket indikerer, at knappen er trykket ned, forsinker vi først det tidsrum, der er defineret af DEBOUNCE_TIME, som er 25 ms, og kontrollerer derefter tastens tilstand igen. Hvis knappen er trykket ned efter de 25 ms, anses kontakten for at være afbrudt og klar til at udløse en begivenhed, og derfor vender vi 1 tilbage til vores opkaldsrutine. Hvis knappen ikke er trykket ned, vender vi 0 tilbage til vores opkaldsrutine.

_forsinkelse_ms (DEBOUNCE_TIME);

hvis (! (PINB & (1 <

int main (tomrum)

{

Vores vigtigste rutine. Hovedfunktionen er unik og adskilt fra alle andre funktioner. Hvert C -program skal have nøjagtigt en hovedfunktion (). main er, hvor AVR begynder at eksekvere din kode, når strømmen først går på, så det er programmets indgangspunkt.

usigneret tegn n_led = 1; // LED -nummeret er oprindeligt tændt nu

Opkald af funktionen til at initialisere I/O -ben, der bruges:

init_ports_mcu ();

uendelig loop, hvor vores program kører:

mens (1)

{

Når button_state returnerer en, der angiver, at der blev trykket på knappen og blev frakoblet, skiftede den aktuelle status for LED'er igen efter n_led -parameteren.

if (button_state ()) // Hvis der trykkes på knappen, skifter LED'ens tilstand og forsinkelse i 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); pause;

Disse udsagn bruger C bitvise operatører. Denne gang bruger den den eksklusive OR -operatør. Når du XOR PORTEN med bitværdien af den bit, du vil skifte, ændres den ene bit uden at påvirke de andre bits.

sag 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); pause; sag 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // nulstil LED -nummerbrud; } n_led ++; // næste LED tænder _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Så nu, når du kører dette program, skal du være i stand til at trykke på trykknappen for at LED'er skifter. På grund af vores forsinkelse defineret af LOCK_INPUT_TIME kan du trykke på knappen og holde den nede, hvilket får LED'erne til at slukke og tænde med en konstant hastighed (lidt mere end hver 275 ms).

Programmeringen er fuldført.

Næste trin er at bygge projektet og programmere hex -fil i mikrokontrolleren ved hjælp af avrdude -programmet.

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

Trin 2: Overførsel af programmets HEX -fil til Chips flashhukommelse

Overførsel af programmets HEX -fil til chiphukommelsen
Overførsel af programmets HEX -fil til chiphukommelsen
Overførsel af programmets HEX -fil til chiphukommelsen
Overførsel af programmets HEX -fil til chiphukommelsen

Download og installer AVRDUDE. Den seneste tilgængelige version er 6.3: Download zip -filen

Kopier først programmets hex -fil til AVRDUDE -biblioteket. I mit tilfælde er det ButtonAVR.hex

Indtast derefter kommandoen: avrdude –c [navn på programmør] –p m328p –u –U flash: w: [navn på din hex -fil].

I mit tilfælde er det: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Denne kommando skriver hex -fil til mikrokontrollerens hukommelse.

Se videoen med en detaljeret beskrivelse af mikrokontrollerens flash -hukommelse, der brænder:

Mikrokontroller flash -hukommelse brænder …

Okay! Nu fungerer mikrokontrolleren i overensstemmelse med instruktionerne i vores program. Lad os tjekke det ud!

Trin 3: Hardware Switch Debouncing

Hardware Switch Debouncing
Hardware Switch Debouncing

Ud over Software switch debouncing kan vi bruge hardware switch debouncing teknik. Grundtanken bag en sådan teknik er at bruge en kondensator til at filtrere hurtige ændringer i switch -signalet.

Hvilken værdikondensator skal vælges? Dette vil i sidste ende afhænge af, hvor dårligt knappen klarer sig med hensyn til dette særlige problem. Nogle knapper kan vise en enorm hoppende adfærd, mens andre vil have meget lidt. En lav kondensatorværdi som 1,0 nanofarader reagerer meget hurtigt, med ringe eller ingen effekt på hoppet. Omvendt vil en højere kondensatorværdi som 220 nanofarader (som stadig er ret lille med hensyn til kondensatorer) give en langsom overgang fra start- til slutspændingen (5 volt til 0 volt). Overgangen set med en 220 nanofarads-kapacitet er dog stadig temmelig hurtig i virkeligheden og kan dermed bruges på knapper, der ikke fungerer godt.

Trin 4: Elektrisk kredsløb

Elektrisk kredsløb
Elektrisk kredsløb
Elektrisk kredsløb
Elektrisk kredsløb
Elektrisk kredsløb
Elektrisk kredsløb

Tilslut komponenter i henhold til skematisk diagram.

Anbefalede: