Stap 1: De knoop van de Debouncing
Om te illustreren knop debouncing, bevat het project dat we geselecteerd twee LED's. Wanneer de knop wordt ingedrukt, wordt de LEDs schakelen tussen elkaar. Een druk op de knop schakelt men vandoor en anderzijds over. Bij het loslaten van de knop, kan het proces opnieuw starten en veroorzaken de LEDs opnieuw in-of uitschakelen. U zult merken dat de LEDs schakelen twee keer of meer met alleen een enkele knop druk op.
Er zijn twee manieren om verlamde debouncing. Een in-circuit methode (hardware) met gebruik van een condensator, en software debouncing. De hardware simpelweg maakt gebruik van een condensator om te elimineren debouncing, en de software zal maken een variabele die het betrouwbaarheidsniveau van de knop-stream van degene of nullen maatregelen.
Disclaimer: Deze methode die ik gebruik voor hardware debouncing is een zeer eenvoudig en armen mans methode. Het belangrijkste probleem met deze methode is dat de spanning van 0 tot 5v in plaats van een onmiddellijke of ogenblikkelijke verandering klimt. Dit kan het signaal in een bereik dat de microcontroller weet niet hoe om te gaan met de spanning zetten. Dit bereik is het gebied tussen de drempels van hoge en lage signalen, die tussen 2 en 3 volt. Met dit gezegd, heb ik niet persoonlijk gezien een probleem met dit met mijn knop debouncing. Als je elimineren deze klimmen willen zou, gebruik een schmitt trigger.
In de video afbeelding ziet u dat het circuit is aangesloten op het breadboard sans de hardware debouncing, zodat het probleem kan worden ervaren. Twee LED's zijn gekoppeld aan de microcontroller, zowel op poort B, op pin 0 en de andere op pin 2. Beide van deze pinnen aan output zal worden ingesteld en omdat de LED's groen zijn, een weerstand van 330 ohm wordt gebruikt voor elke LED. De knop switch is aangesloten op pin 1, op poort B. Deze pin wordt ingesteld voor invoer- en set naar Lees high (pin ingesteld op een "1"). voor de eerste test van de "bounce", zullen we niet een condensator gebruiken over de twee leidt van de knop.
Het programma wil twee LEDs in-/ uitschakelen wanneer u op de drukknop drukt is zeer eenvoudig. Ten eerste, de pinnen zijn geïnitialiseerd: Pins uitvoeren naar de LED's zijn ingesteld voor de uitvoer van in de DDR (Data richting registreren). Een van de LED's zijn van een knevel gevoorzid hoog, dus aan het begin, is een op en een uitstaat. Vervolgens de nooit eindigende lus wordt gestart en de code in dat blok wordt uitgevoerd totdat de microcontroller macht verliest. Binnen deze lus, de pin dat is aangesloten op de drukknop wordt voortdurend gecontroleerd om te bepalen als het brandt. Als het wordt gedrukt, en een 1 vertoont, vervolgens wordt gecontroleerd of de knop primeurs uitgebracht was. Dit is belangrijk, want als wij niet over deze controle, de knop gewoon schakelen continu terwijl de knop is ingedrukt. We willen alleen de knop om te schakelen als de knop is ingedrukt en vervolgens vrijgelaten.
#include <avr/io.h> int main(void) { DDRB |= 1 << PINB0; //Set Direction for output on PINB0 PORTB ^= 1 << PINB0; //Toggling only Pin 0 on port b DDRB |= 1 << PINB2; //Set Direction for Output on PINB2 DDRB &= ~(1 << PINB1); //Data Direction Register input PINB1 PORTB |= 1 << PINB1; //Set PINB1 to a high reading int Pressed = 0; //Initialize/Declare the Pressed variable
while (1) { if (bit_is_clear(PINB, 1)) //Check is the button is pressed { //Make sure that the button was released first if (Pressed == 0) { PORTB ^= 1 << PINB0; //Toggle LED in pin 0 PORTB ^= 1 << PINB2; //Toggle LED on pin 2 Pressed = 1; } } else { //This code executes when the button is not pressed. Pressed = 0; } <p> }</p><p>}</p>
Wanneer de microcontroller is geprogrammeerd en de knop wordt ingedrukt herhaaldelijk, blijkt dat de LEDs, soms goed en soms meerdere keren met slechts één knop drukt schakelen. Voeg de condensator en controleer de knop te drukken en de LED schakelen weer. Op de oscilloscoop, wordt met de condensator geïnstalleerd, een geleidelijke stijging van de spanning gemaakt wanneer de knop wordt ingedrukt, tegengesteld aan een bos van op en neer de spanningen die voortvloeien uit een bounce van de mechanische onderdelen van de knop. Maar wanneer de knop wordt losgelaten, blijkt dat de spanning een directe verandering is. Dit komt omdat een ander condensator niet tussen de knop en de microcontroller is geïnstalleerd.