Början Microcontrollers del 9: Knappen och programvara Debouncing metoder (2 / 2 steg)
Steg 2: Mjukvara Debouncing
Så varför behöver vi gå över en ny metod när annan verkade fungera bra? Tja, är programvara debounce metoden i grunden gratis om utrymme och mikrokontroller programcykeln gör det möjligt. Med bara några rader kod, kan du ge mycket mer kontroll över hur de debouncing metoderna fungerar med knappen du använder. Debouncing i maskinvaran kan lägga till ytterligare kostnader till varje utvecklade ombord, och det är svårare att fastställa en bra debouncing för alla tryckknapp växlarna som används. Om du vill bevara programmet utförande cykler, är det dock bäst att gå med hårdvara rutten.
Min metod av debouncing med programvara använder endast två variabler som mäter konfidensnivån för den faktiska knapptryckning. Med hjälp av variabeln pressade infördes i knappen Debouncing, kommer det att finnas en ström av 1: s när knappen trycks, och en ström av 0 är när knappen släpps. Om det studsar pågår, att ström av 1 eller 0 är vara mycket kort, så vi kan dra nytta av detta genom att införa två variabler att mäter längden på dessa strömmar. Variablerna kallas, Pressed_Confidence_Level, att mäta på knappen intryckt staten och Released_Confidence_Level att mäta släppta knappläge.
Så, om du trycker på knappen, Pressed_Confidence_Level kommer att stiga, och samma med Released_Confidence_Level när knappen släpps. Men dessa variabler också bli återställs till 0 om det motsatta villkoret finns. Till exempel säga knappen trycktes under en tid och Pressed_Confidence_Level blev ett mycket stort antal, som 153,356. Om knappen släpptes (eller en studsande hände), skulle variabeln återställas till 0. Tricken till dessa variabler är att bestämma en bra tröskel att fastställa en god knapptryckning eller släppa staten. Säga, om Pressed_Confidence_Level visar att efter att ha stigit till 500, att detta nummer är en stark indikation på en knapptryckning, då lysdioderna kommer att växla en gång. Detsamma gäller för Released_Confidence_Level eftersom studsande kunde också hända på en knapp release. Så, låt oss se hur vi gör detta i koden:
int main(void)
{
DDRB | = 1 << PINB0; För anteckningar om vad dessa åtgärder menar
PORTB ^ = 1 << PINB0;
DDRB | = 1 << PINB2;
DDRB & = ~ (1 << PINB1);
PORTB | = 1 << PINB1;
int pressad = 0;
int Pressed_Confidence_Level = 0; Åtgärd knapp tryck på förtroende
int Released_Confidence_Level = 0; Mäta knapp release förtroende samtidigt (1)
{om (bit_is_clear (PINB, 1))
{Pressed_Confidence_Level ++; //Increase tryckte förtroende
Released_Confidence_Level = 0; Återställ släppt knappen förtroende eftersom det inte finns en knapptryckning
om (Pressed_Confidence_Level > 500) //Indicator av bra knapptryckning
{om (pressad == 0)
{PORTB ^ = 1 << PINB0;
PORTB ^ = 1 << PINB2;
Tryckte = 1;
}
Noll det så en ny pressade villkor kan utvärderas
Pressed_Confidence_Level = 0;
}
}
annat
{Released_Confidence_Level ++; //This fungerar precis som den pressade
Pressed_Confidence_Level = 0; Reset trycks knappen förtroende eftersom knappen är släppt
om (Released_Confidence_Level > 500
{Tryckte = 0;
Released_Confidence_Level = 0;
}
}
}
}