Början Microcontrollers del 9: Knappen och programvara Debouncing metoder (1 / 2 steg)
Steg 1: Knappen Debouncing
För att illustrera knappen debouncing, innehåller vi valt projekt två lysdioder. När knappen trycks, växla lysdioderna mellan varandra. En knapptryckning blir en off och den andra på. När släppa knappen, kan det starta processen igen och orsaka ljusdioderna till växla igen. Du kommer att märka lysdioderna kommer att växla två gånger eller mer med bara en enda knapp tryck.
Det finns två sätt att lamslå debouncing. En i-krets metod (hårdvara) med användning av en kondensator och programvara debouncing. Maskinvaran använder helt enkelt en kondensator för att eliminera debouncing, och mjukvaran kommer att skapa en variabel som mäter konfidensnivån för knappen ström av ettor eller nollor.
Varning: Denna metod som jag använder för hårdvara debouncing är en mycket enkel och fattiga mans metod. Det största problemet med denna metod är att spänningen klättrar från 0 till 5v snarare än ett omedelbart eller momentan förändring. Detta kan sätta signalen i ett område som mikrokontroller inte vet hur man handskas med spänning. Detta intervall är området mellan tröskelvärdena för höga och låga signaler, som är mellan 2 och 3 volt. Med detta sagt, har jag inte personligen sett några problem med detta med min knapp debouncing. Om du vill eliminera denna klättring, använda en schmitt-trigger.
I video bild ser du att kretsen är ansluten på bakbord sans hårdvara debouncing, så problemet kan upplevas. Två lysdioder kopplas till mikrokontroller, både på PORT B, en på stift 0 och den andra på pin 2. Båda dessa Pins sätts till utgång och eftersom lysdioderna är gröna, en 330 ohm motstånd används för varje LED. Växeln knappen är ansluten till stift 1, på port B. Detta stift anges för indata och sätta till Läs hög (stift satt till "1"). för det första "studsa" testet, kommer vi inte använda en kondensator över de två leder av knappen.
Programmet till göra två lysdioder växla när knappen trycks är mycket enkel. Först, stiften initieras: Pins utmatningen till lysdioderna är inställda att produktionen i DDR (Data riktningen Register). En av lamporna är växlas högt, så från början, en är på och en är avstängd. Sedan aldrig sinande slingan startas och koden inom det kvarteret blir avrättad tills mikrokontroller förlorar makt. Inom denna loop, PIN-koden som är ansluten till knappen är ständigt kontrolleras för att avgöra om det är på. Om det är intryckt, och ställer ut en 1, kontrolleras det om knappen var firsts släppt. Detta är viktigt, eftersom om vi inte har denna kontroll, knappen bara att växla kontinuerligt när knappen är nedtryckt. Vi vill bara på knappen för att växla om knappen är intryckt och sedan släppas.
#include < avr/io.h >
int main(void)
{
DDRB | = 1 << PINB0; Anger riktning för utdata för PINB0
PORTB ^ = 1 << PINB0; Togglande enda stift 0 på port b
DDRB | = 1 << PINB2; Ange riktning för utgång på PINB2
DDRB & = ~ (1 << PINB1); Data riktning registrera ingående PINB1
PORTB | = 1 << PINB1; Ställa in PINB1 till en hög läsning
int pressad = 0; Initiera/Declare pressade variabeln
samtidigt (1)
{
om (bit_is_clear (PINB, 1)) //Check är trycks knappen
{
Kontrollera att knappen släpptes först
om (pressad == 0)
{
PORTB ^ = 1 << PINB0; Växla LED i pin 0
PORTB ^ = 1 << PINB2; Toggle ledde på pin 2
Tryckte = 1;
}
}
annat
{
Denna kod körs när knappen inte är intryckt.
Tryckte = 0;
}
< p >} < /p >< p >} < /p >
När mikrokontroller är programmerat, och trycker på knappen flera gånger, blir det tydligt att lysdioderna kommer att växla, ibland rätt och ibland flera gånger med endast en knapptryckning. Lägg till kondensatorn och kontrollera att trycka på knappen och LED växla igen. På oscilloskopet, skapas med kondensatorn installerat, en gradvis ökning av spänning när knappen trycks, motsätter sig ett gäng upp och ner spänningar som härrör från en studs från de mekaniska delarna av knappen. Men när knappen släpps, det visar att spänningen är en direkt förändring. Detta beror på att en annan kondensator inte installeras mellan knappen och mikrokontroller.