Hej!
Jag har införskaffat mig en STK500 och har en liten fråga!
Jag vill andvända en switch för att tända en lysdiod och i AVR Studio funkar allt som det ska.
Men när jag provar på STK 500 kortet så bara fladdrar det, det känns som att man måste ha någon slags "key debounce" för att det ska fungera eller?
Hur gör man en sån för AVR i assambler / macro??
Jag skulle ju helst vilja göra det som ett macro så jag kan andvända det till andra switchar åxå.
Jag har sökt en massa på internet för att hitta uppslag men jag ger upp det verkar bara var i C kod och det vill ja inte skriva i
//Michaël
Du kan fokusera på att detektera flankerna på knapptryckningarna istället. Använd en variabel för att spara undan knapparnas staus förra cykeln, och när du kollar om något hänt XORar du ihop dem. Då får du ut flankerna. Sen kan du meka lite till för att diskriminera de negativa flankerna, eller vilka du nu inte vill veta av.
Eftersom du har fått det att funka i AVR-studio så antar jag att din flankdetektering fungerar som den skall.
För att göra en enkel debounce så kan du helt enkelt göra en delay på 10-20 ms i programmet då du har detekterat en knapptryckning.
Detta är dock något som du inte kommer att ha mycket nytta av vid mer avancerade projekt då hela processorn låses upp varje gång du trycker, vilket kan ställa till med oreda.
En lite bättre lösning är att endast scanna knappen med vissa intervaller, t.ex. 20 ms. Problemet är då att om du har knappar som är väldigt "studsiga" av sig, så att du tvingas ha för lång intervaller, så kan programmet råka missa en knapptryckning.
Det allra snyggaste är då att ha koll på när man senaste bytte tillstånd på knappen, och sedan ignorera forsatt förändring fram till en viss tid.
Då scannas knapparna så ofta MCU:n hinner och på så sätt så är det i praktiken omöjligt för den att missa en tryckning, oavsett om du så låter den vänta en hel sekund innan den har studsat av sig.
I alla projekter där jag använder knapper för att justera eller ge värden har jag en timer som ger interrupt med 10Hz.
Vid varje interrupt läser jag sedan knappsatsen in i en variabel, MEN: jag läser den enbart 1 gg. per interrupt! Sedan använder jag den variabel som definition av knappsatsen.
Därefter diskriminera jag så att jag hitta ändring (KnappÄndring = KnappFörr EXOR KnappVariabel, därefter: KnappFörr = KnappVariabel) och gör sedan vad som behövs. Ofta tar jag sedan enbart den positiva flanken (KnappNya = KnappÄndring AND KnappVariabel) och lägger det resultat i en FIFO-buffer av lämplig storlek men då är det ett större projekt, det kan räcka fint med att göra vad som ska göras eller peta resultatet in i en variabel och se till att ingen knapptryckning kan ge ett noll.
Då kan "huvudprogrammet" kolla om senaste tryckta knappen är noll eller inte och är den inte noll kan funktionen utföras och knappen nollas, därmed kommer knapperna att vara debouncad och bara fungera 1 gång.
Det blir lite svårare när man ska ha det att ha dubbla funktioner (kort tryck = 1 typ knapptryckning, 3 sek. långt tryck = annat knappvärde t.ex.) men då har man ju de 10Hz att stödja sig till och kan basera sig på det, jag använder ofta att ha en '+' och en '-' knapp som kan autorepetera, då väntar den först 0,5 sek innan den repeterar med 10Hz.
Jag hittade en sida som behandlar PIC och knappar, där finns eett macro som jag gillar!
Kan inet nån vänlig skäl hjälpa mig att översätta detta till AVR?