Stap 2: Software Debouncing
Dus waarom moeten we om te gaan over een nieuwe methode wanneer de andere één scheen om boete te werken? Nou, is de software ontdendering methode in wezen gratis als de programma ruimte en microcontroller-cyclus zal toelaten. Met slechts een paar regels code, kunt u bieden veel meer controle over hoe de debouncing methoden werken met de knop die u gebruikt. Debouncing in hardware kan extra kosten toevoegen aan elk ontwikkelde bord, en het is moeilijker om een goede debouncing voor alle schakelaars van de drukknop die zal worden gebruikt. Echter, als u bewaren van de programma uitvoering cycli wilt, is het beste om te gaan met de route van de hardware.
Mijn methode van debouncing met software maakt gebruik van slechts twee variabelen die het betrouwbaarheidsniveau van de werkelijke knooppers meten. Met de hulp van de geperste variabele geïntroduceerd in de knop Debouncing, zal er een stroom van 1's wanneer de knop wordt gedrukt, en een stroom van 0 wanneer de knop wordt losgelaten. Als er stuitert gaande, de stream van 1's of 0's worden zeer kort, zodat we van dit profiteren kunnen door de invoering van de twee variabelen die de lengte van deze stromen meet. De variabelen worden genoemd, Pressed_Confidence_Level, voor het meten van de knop gedrukt staat, en Released_Confidence_Level voor het meten van de knop vrijgegeven staat.
Dus, als de knop is ingedrukt, de Pressed_Confidence_Level stijgen zal, en hetzelfde met Released_Confidence_Level wanneer de knop wordt losgelaten. Maar deze variabelen zal ook worden teruggesteld aan 0 als de tegenovergestelde voorwaarde bestaat. Bijvoorbeeld, zeggen de knop werd ingedrukt voor een tijd en de Pressed_Confidence_Level werd een zeer groot aantal, zoals 153,356. Als de knop werd uitgebracht (of een stuiterend gebeurd), zou de variabele worden teruggesteld aan 0. De truc om deze variabelen is het bepalen van een goede drempel vrij staat te bepalen van een goede knooppers. Zeggen, indien uit de Pressed_Confidence_Level blijkt dat na een stijging tot 500, dat dit nummer is een sterke aanwijzing voor een druk op de knop en de LEDs schakelen eenmaal. Hetzelfde geldt voor de Released_Confidence_Level omdat stuiteren ook op een knop-release gebeuren kan. Dus, laten we eens kijken hoe we dit doen via programmacode:
int main(void) { DDRB |= 1 << PINB0; //For Notes on what these actions mean PORTB ^= 1 << PINB0; DDRB |= 1 << PINB2; DDRB &= ~(1 << PINB1); PORTB |= 1 << PINB1; int Pressed = 0; int Pressed_Confidence_Level = 0; //Measure button press confidence int Released_Confidence_Level = 0; //Measure button release confidence while (1) { if (bit_is_clear(PINB, 1)) { Pressed_Confidence_Level ++; //Increase Pressed Confidence Released_Confidence_Level = 0; //Reset released button confidence since there is a button press if (Pressed_Confidence_Level >500) //Indicator of good button press { if (Pressed == 0) { PORTB ^= 1 << PINB0; PORTB ^= 1 << PINB2; Pressed = 1; } //Zero it so a new pressed condition can be evaluated Pressed_Confidence_Level = 0; } } else { Released_Confidence_Level ++; //This works just like the pressed Pressed_Confidence_Level = 0; //Reset pressed button confidence since the button is released if (Released_Confidence_Level >500 { Pressed = 0; Released_Confidence_Level = 0; } } } }