avstudsning
avstudsning
Funderar på om det går att göra en enkel avstudsningsrutin, så här:
Vänta 5 ms
Läs av ingångs pinne kopplad till tangent.
Returnera resultat
Vad sägs, räcker det med så enkel rutin ?
Vänta 5 ms
Läs av ingångs pinne kopplad till tangent.
Returnera resultat
Vad sägs, räcker det med så enkel rutin ?
Re: avstudsning
Det beror ju lite på vad du vill visa (känna av).
Sen så kan en tangent nog studsa mer än 5 ms,
det beror på hur bra (hur dyr) tangent/knapp du har.
Sen tillkommer logik för att känna av "tryck och släpp",
"repetering" (om du vill ha det) o.s.v.
Slutligen så är det generellt inte bra att ha en rutiner
som "väntar", det bör vara t.ex timerstyrt.
Jag skulle gissa att 3-4 värden med samma "läge" (tryckt
eller otryckt) efter varande med t.ex 10 ms intervall sannolikt
kan vara en bra indikation på knappens läge. Så länge som
det inte blir 4 lika värden i rad så börjar man bara att
räkna om på 1 igen...
Sen så kan en tangent nog studsa mer än 5 ms,
det beror på hur bra (hur dyr) tangent/knapp du har.
Sen tillkommer logik för att känna av "tryck och släpp",
"repetering" (om du vill ha det) o.s.v.
Slutligen så är det generellt inte bra att ha en rutiner
som "väntar", det bör vara t.ex timerstyrt.
Jag skulle gissa att 3-4 värden med samma "läge" (tryckt
eller otryckt) efter varande med t.ex 10 ms intervall sannolikt
kan vara en bra indikation på knappens läge. Så länge som
det inte blir 4 lika värden i rad så börjar man bara att
räkna om på 1 igen...
Re: avstudsning
EDN har en väldigt läsvärd artikel
Ultimate contact debouncer
http://www.edn.com/design/components-an ... -debouncer
Ultimate contact debouncer
http://www.edn.com/design/components-an ... -debouncer
Re: avstudsning
I detta fall är det ett enkelt program: Ett antal ingångar ska "skannas", när en ingång ger signal ska en 7-segment display tändas med ingångens nummer, och efter det ska programmet gå i en vänteslinga tills knappen trycks in.
När knappen hålls intryckt körs en annan typ av skanningsrutin på ingångarna, tills den är klar eller knappen släpps.
Behövs ingen repetering i detta fall.
Vad är skälen till att fördröjningar bör göras med timer ?
När knappen hålls intryckt körs en annan typ av skanningsrutin på ingångarna, tills den är klar eller knappen släpps.
Behövs ingen repetering i detta fall.
Vad är skälen till att fördröjningar bör göras med timer ?
Re: avstudsning
Jag filtrerar alltid tryckknappar externt, för att göra de programatiska rutinerna snabbare och enklare
Re: avstudsning
Persika: Om det bara rör sig om att kolla huruvida en knapp/sensor har blivit påverkat är avstutsning ganska onödigt!
Avstutsningen gör man för att samma knapp inte ska räknas fler gångar. Det är ganska irriterande om man ska välja en menypunkt ich knappen man väljer att stega i menyn med stutsar, då kan man få fler steg för varje tryck och jag kan lova dig att man säger fina ord då när menyn har 20+ punkter!
Jag har testat en del olika modeller och har sedan länge spolat hårdvaran för detta, det är bara onödiga komponenter!
Numera har jag en timer interrupt (som jag nästan alltid har) på kanske 20Hz eller mer. Sedan läser jag porten en gång per interrupt.
Detta värde sparar jag om det behövs och jag jämför det sedan med den förra avläsningen. Är de identiska är det en knapptryckning (om det är tryckt på något alltså) och det ska göras vad som ska göras. Sedan maskar jag ut den i et "har redan gjort"-register (googla på "n-key rollover") och den nollas först när knappen släpps. Vill man vara synnerligen säker kan man göra 3-5 avläsningar efter varandra och när de är identiska är saken biff.
En "total" avläsning ska ske på max. 100ms, ska man alltså läsa av 3 gg innan det kan vara rätt måste man alltså avläsa 3 gg under 100ms vilket ger 33ms mellan varje avläsning, på detta vis känns knappen inte "trög" i reaktionen.
Då man ju sällan ska utföra knapptryckningar i en interrupt-rutin har jag en bufferplats där knapptryckningen rapporteras, ibland lägger jag in en ring-buffer för dessa tryckningar men det är sällan jag behöver det.
När knapptryckningen är "använd" av vad det nu måste vara nollas den och det är klart att upprepa.
Avstutsningen gör man för att samma knapp inte ska räknas fler gångar. Det är ganska irriterande om man ska välja en menypunkt ich knappen man väljer att stega i menyn med stutsar, då kan man få fler steg för varje tryck och jag kan lova dig att man säger fina ord då när menyn har 20+ punkter!
Jag har testat en del olika modeller och har sedan länge spolat hårdvaran för detta, det är bara onödiga komponenter!
Numera har jag en timer interrupt (som jag nästan alltid har) på kanske 20Hz eller mer. Sedan läser jag porten en gång per interrupt.
Detta värde sparar jag om det behövs och jag jämför det sedan med den förra avläsningen. Är de identiska är det en knapptryckning (om det är tryckt på något alltså) och det ska göras vad som ska göras. Sedan maskar jag ut den i et "har redan gjort"-register (googla på "n-key rollover") och den nollas först när knappen släpps. Vill man vara synnerligen säker kan man göra 3-5 avläsningar efter varandra och när de är identiska är saken biff.
En "total" avläsning ska ske på max. 100ms, ska man alltså läsa av 3 gg innan det kan vara rätt måste man alltså avläsa 3 gg under 100ms vilket ger 33ms mellan varje avläsning, på detta vis känns knappen inte "trög" i reaktionen.
Då man ju sällan ska utföra knapptryckningar i en interrupt-rutin har jag en bufferplats där knapptryckningen rapporteras, ibland lägger jag in en ring-buffer för dessa tryckningar men det är sällan jag behöver det.
När knapptryckningen är "använd" av vad det nu måste vara nollas den och det är klart att upprepa.
Re: avstudsning
> ...när en ingång ger signal ska en 7-segment display tändas med ingångens nummer,
Som Icecap sa, om det studsar så kommer bara samma siffra att blinka
väldigt snabbt (rellativt ögats uppfattningsförmåga) innan det blir stabilt,
sannolikt för snabbt för att uppfattas/synas.
Studsarna blir bara rellevanta om *antalet* tryck är viktigt, vilket
de ju inte är i detta fall.
Som Icecap sa, om det studsar så kommer bara samma siffra att blinka
väldigt snabbt (rellativt ögats uppfattningsförmåga) innan det blir stabilt,
sannolikt för snabbt för att uppfattas/synas.
Studsarna blir bara rellevanta om *antalet* tryck är viktigt, vilket
de ju inte är i detta fall.
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: avstudsning
Minst 10 ms mellan avläsningarna säger min erfarenhet.
Vilken plattform kodar du för? Att göra det i avbrott på AVR är runt 10 rader kod, ingen raketprojekt alltså...
Vilken plattform kodar du för? Att göra det i avbrott på AVR är runt 10 rader kod, ingen raketprojekt alltså...
Re: avstudsning
> Vad är skälen till att fördröjningar bör göras med timer ?
Att koden/processorn är ledig att göra annat under tiden.
Men just i *detta* fall handlar det ju enbart om att "spegla"
ett antal ingångar till en 7-seg display. Det behövs varken
fördröjningar, timers eller avstudsning. Gör en enkel loop
som scannar ingångarna och uppdatterar 7-seg displayen.
Denna loop kan köras kontinuerligt och hur snabbt som helst...
Jag antar att det ska vara något slaga prio mellan ingångarna
i det fall att flera är aktiverade samtidigt.
Att koden/processorn är ledig att göra annat under tiden.
Men just i *detta* fall handlar det ju enbart om att "spegla"
ett antal ingångar till en 7-seg display. Det behövs varken
fördröjningar, timers eller avstudsning. Gör en enkel loop
som scannar ingångarna och uppdatterar 7-seg displayen.
Denna loop kan köras kontinuerligt och hur snabbt som helst...
Jag antar att det ska vara något slaga prio mellan ingångarna
i det fall att flera är aktiverade samtidigt.
Re: avstudsning
Denna är rätt elegant:
http://www.piclist.com/techref/microchi ... m?key=Core
Annars finns det ju dedikerade debouncers som kretsar.
http://www.piclist.com/techref/microchi ... m?key=Core
Annars finns det ju dedikerade debouncers som kretsar.
Re: avstudsning
För ett tag sedan mätte jag upp studs på några pulsgivare med typnummer EC12D1524403 från Alps. Jag gjorde ett tiotal mätningar där allra värsta var runt 800 µs medan vanligast var inget alls eller runt 50 µs. Programvaran skrev jag sedan med en externtavbrottsrutin som väntade i 100 µs för att sedan läsa in värdet, vilket fungerade bra då sannolikheten inte är allt för stor att det ska bli fel. Tiden för att vänta var något kritiskt då nya signaler från pulsgivarena kommer inom kort, tror det handlade om ms iaf.
Re: avstudsning
Jag tycker man ska skilja på avstörning och avstudsning.
Det här med att man ska läsa ett antal ggr för att se att värdet är stabilt behövs inte vid avstudsning, bara vid avstörning, dvs då det finns risk att en störning kan tolkas som en signal. För t ex en kretskortsmonterad knapp i närheten av processorn brukar inte detta vara ett problem. Då vet du att varje signal som kommer in beror på att du tryckt på knappen. Alltså kan du göra det du ska så snart du tagit emot första signalen. Sen "väntar" du en stund innan du kollar efter ev nya signaler, för att inte reagera på studsarna. Detta gör att du får omedelbar respons från systemet.
Det här med att man ska läsa ett antal ggr för att se att värdet är stabilt behövs inte vid avstudsning, bara vid avstörning, dvs då det finns risk att en störning kan tolkas som en signal. För t ex en kretskortsmonterad knapp i närheten av processorn brukar inte detta vara ett problem. Då vet du att varje signal som kommer in beror på att du tryckt på knappen. Alltså kan du göra det du ska så snart du tagit emot första signalen. Sen "väntar" du en stund innan du kollar efter ev nya signaler, för att inte reagera på studsarna. Detta gör att du får omedelbar respons från systemet.
Re: avstudsning
Jag förstår inte heller värdet av att läsa en signal flera gånger vid enbart kontaktstuds. Det gäller att vänta tillräckligt länge tills studsandet har försvunnit för att läsa av signalen. Att börja läsa tidigt och i flera omgångar vet jag inte vad som tjänas in?