Innehållsförteckning:

AVR -mikrokontroller. Växla lysdioder med en tryckknappsbrytare. Push Button Debouncing .: 4 steg
AVR -mikrokontroller. Växla lysdioder med en tryckknappsbrytare. Push Button Debouncing .: 4 steg

Video: AVR -mikrokontroller. Växla lysdioder med en tryckknappsbrytare. Push Button Debouncing .: 4 steg

Video: AVR -mikrokontroller. Växla lysdioder med en tryckknappsbrytare. Push Button Debouncing .: 4 steg
Video: LDmicro 7: Simple Intruder Alarm Logic (Microcontroller PLC Ladder Programming with LDmicro) 2024, Juli
Anonim
Image
Image

I det här avsnittet lär vi oss hur man gör program C -kod för ATMega328PU för att växla status för de tre lysdioderna enligt ingången från en knappomkopplare. Vi har också undersökt lösningar på problemet med "Switch Bounce". Som vanligt kommer vi att montera den elektriska kretsen på basen av AVR ATmega328 för att kontrollera hur programkoden fungerar.

Steg 1: Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7

Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7
Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7
Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7
Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7
Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7
Skriva och bygga AVR -mikrokontrollerapplikation i C -kod med hjälp av den integrerade utvecklingsplattformen Atmel Studio 7

Om du inte har Atmel Studio bör du ladda ner och installera det.

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

De första raderna har vi några kompilatordefinieringar.

F_CPU definierar klockfrekvensen i Hertz och är vanlig i program som använder avr-libc-biblioteket. I detta fall används det av fördröjningsrutinerna för att bestämma hur man beräknar tidsfördröjningar.

#ifndef F_CPU

#define F_CPU 16000000UL // berättar styrenhetens kristallfrekvens (16 MHz AVR ATMega328P) #endif

#include // header för att möjliggöra dataflödeskontroll över stift. Definierar stift, portar etc.

Den första inkluderar-filen är en del av avr-libc och kommer att användas i nästan alla AVR-projekt du arbetar med. io.h kommer att avgöra vilken processor du använder (det är därför du anger delen vid kompilering) och i sin tur inkludera lämplig IO -definitionhuvud för det chip vi använder. Det definierar helt enkelt konstanterna för alla dina stift, portar, specialregister, etc.

#include // header för att aktivera fördröjningsfunktion i programmet

Biblioteket util/delay.h innehåller några rutiner för korta förseningar. Funktionen vi ska använda är _delay_ms ().

Vi använder definierar för att deklarera våra knappar och LED: s portar och stift. Genom att använda definierade påståenden som detta kan vi bara behöva ändra 3 lätt att hitta linjer om vi flyttar lysdioden till en annan I/O-stift eller använder en annan AVR.

#define BUTTON1 1 // knappomkopplare ansluten till port B pin 1

#define LED1 0 // Led1 ansluten till port B stift 0 #definierad LED2 1 // Led2 ansluten till port C pin 1 #definierad LED3 2 // Led3 ansluten till port D pin 2

De två sista definierar inställningstider för påståenden, i millisekund, för att avbryta omkopplaren och tiden att vänta innan ytterligare ett tryck på knappen. Avbrottstiden måste justeras till den tid det tar omkopplaren att gå från en digital hög till en digital låg efter all studs. Avvisningsbeteendet kommer att skilja sig från switch till switch, men 20-30 millisekunder är vanligtvis ganska tillräckligt.

#define DEBOUNCE_TIME 25 // tid att vänta medan knappen "avstängs"

#define LOCK_INPUT_TIME 300 // tid att vänta efter ett knapptryck

ogiltig init_ports_mcu ()

{

Denna funktion kallas bara en gång i början av vårt program för att initiera ingångar som vi kommer att använda.

För knappen kommer vi att använda PORT- och PIN -registren för att skriva och läsa. Med AVR läser vi en pin med hjälp av PINx -registret och vi skriver till en pin med PORTx -registret. Vi måste skriva till knappregistret för att aktivera pull-ups.

För lysdioden behöver vi bara använda PORT -registret för att skriva till, men vi behöver också datariktningsregistret (DDR) eftersom I/O -stiften är inställda som ingångar som standard.

Först ställer vi in lysdiodernas I/O -stift som en utgång med dess datariktningsregister.

DDRB = 0xFFu; // Ställ in alla stift på PORTB som utgång.

Ställ sedan in knappstiftet som en ingång.

DDRB & = ~ (1 <

Därefter sätts PORTB -stiften högt (+5 volt) för att slå på den. Utgångsstiften är initialt höga, och eftersom vår lysdiod är aktiv-hög kopplad, kommer den att slås på om vi inte uttryckligen stänger av den.

Och slutligen aktiverar vi det interna uppdragningsmotståndet på ingångsstiftet vi använder för vår knapp. Detta görs helt enkelt genom att mata ut en till porten. När det konfigureras som en ingång resulterar det i att möjliggöra pull-ups och när det konfigureras som en utgång, skulle det helt enkelt mata ut en hög spänning.

PORTB = 0xFF; // Ställ in alla stift på PORTB som HÖG. LED är tänd, // även det interna Pull Up -motståndet på första stift PORTB är aktiverat. DDRC = 0xFFu; // Ställ in alla stift på PORTC som utgång. PORTC = 0x00u; // Ställ in alla stift på PORTC som stänger av den. DDRD = 0xFFu; // Ställ in alla stift på PORTD som utgång. PORTD = 0x00u; // Ställ in alla stift på PORTD som stänger av den. }

osignerad char button_state ()

{

Denna funktion returnerar ett booleskt värde som anger om knappen trycktes eller inte. Detta är kodblocket med som kontinuerligt körs i den oändliga slingan och därmed undersöker knappens tillstånd. Det är också här vi avbryter omkopplaren.

Kom nu ihåg att när vi trycker på strömbrytaren dras ingångsuttaget till marken. Således väntar vi på att stiftet ska gå ner.

/ * knappen trycks in när BUTTON1 bit är klar */

om (! (PINB & (1 <

Vi gör det genom att kontrollera om biten är klar. Om biten är klar, vilket indikerar att knappen är nedtryckt, fördröjer vi först den tid som definieras av DEBOUNCE_TIME som är 25 ms och kontrollerar sedan knappens tillstånd igen. Om knappen trycks ned efter 25 ms anses omkopplaren vara avstängd och redo att utlösa en händelse och så återgår vi 1 till vår samtalsrutin. Om knappen inte är nedtryckt återgår vi 0 till vår samtalsrutin.

_delay_ms (DEBOUNCE_TIME);

om (! (PINB & (1 <

int main (void)

{

Vår huvudsakliga rutin. Huvudfunktionen är unik och skiljer sig från alla andra funktioner. Varje C -program måste ha exakt en huvudfunktion (). main är där AVR börjar köra din kod när strömmen först går på, så det är ingångspunkten för programmet.

osignerad tecken n_led = 1; // LED -numret är ursprungligen tänt nu

Anrop av funktionen för att initiera I/O -stift som används:

init_ports_mcu ();

oändlig loop där vårt program körs:

medan (1)

{

När button_state returnerar en som indikerar att knappen trycktes ned och avstängdes, växlade den aktuella statusen för lysdioder i tur och ordning enligt n_led -parametern.

if (button_state ()) // Om knappen trycks in, växla lysdiodens status och fördröjning i 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); ha sönder;

Dessa påståenden använder C bitvisa operatörer. Den här gången använder den exklusiva OR -operatören. När du XOR PORTEN med bitvärdet för den bit du vill växla, ändras den ena biten utan att påverka de andra bitarna.

fall 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); ha sönder; fall 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // Återställ LED -nummeravbrott; } n_led ++; // nästa lysdiod slås på _delay_ms (LOCK_INPUT_TIME); }} retur (0); }

Så nu, när du kör det här programmet, ska du kunna trycka på tryckknappen för att lysdioderna ska växla. På grund av vår fördröjning definierad av LOCK_INPUT_TIME kan du hålla knappen intryckt vilket gör att lysdioderna slås av och på med en konstant hastighet (lite mer än var 275 ms).

Programmeringen är klar.

Nästa steg är att bygga projektet och programmera hex -filer i mikrokontrollen med hjälp av avrdude -programmet.

Du kan ladda ner main.c -filen med programmet i c -kod:

Steg 2: Överföring av programmets HEX -fil till flashminnet för chip

Överföring av programmets HEX -fil till flashminnet för chip
Överföring av programmets HEX -fil till flashminnet för chip
Överföring av programmets HEX -fil till chipets flashminne
Överföring av programmets HEX -fil till chipets flashminne

Ladda ner och installera AVRDUDE. Den senaste tillgängliga versionen är 6.3: Ladda ner zip -filen

Kopiera först hex -filen för programmet till AVRDUDE -katalogen. I mitt fall är det ButtonAVR.hex

Skriv sedan in kommandot: avrdude –c [namn på programmerare] –p m328p –u –U flash: w: [namn på din hexfil].

I mitt fall är det: avrdude –c ISPProgv1 –p m328p –u –U blixt: w: ButtonAVR.hex

Detta kommando skriver hex -fil till mikrokontrollerns minne.

Titta på videon med en detaljerad beskrivning av mikrokontrollerens flashminne:

Mikrokontroller flashminne brinner …

Ok! Nu fungerar mikrokontrollern i enlighet med instruktionerna i vårt program. Låt oss kolla upp det!

Steg 3: Debutering av hårdvaruomkopplare

Hardware Switch Debouncing
Hardware Switch Debouncing

Förutom Software switch debouncing kan vi använda hardware switch debouncing teknik. Grundtanken bakom sådan teknik är att använda en kondensator för att filtrera bort snabba förändringar i omkopplingssignalen.

Vilket värde kondensator bör väljas? Detta beror i slutändan på hur dåligt knappen fungerar när det gäller detta problem. Vissa knappar kan visa ett enormt studsande beteende, men andra kommer att ha väldigt lite. Ett lågt kondensatorvärde som 1,0 nanofarader reagerar mycket snabbt, med liten eller ingen effekt på studsningen. Omvänt kommer ett högre kondensatorvärde som 220 nanofarader (som fortfarande är ganska litet när det gäller kondensatorer) att ge en långsam övergång från start till slutspänning (5 volt till 0 volt). Övergången med en kapacitet på 220 nanofarader är dock fortfarande ganska snabb i verkligheten och kan därför användas på knappar som inte fungerar så bra.

Steg 4: Elektrisk krets

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

Anslut komponenter enligt schematiskt diagram.

Rekommenderad: