"Cleara" InterruptOnChange flagga på en PIC 12F629

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: "Cleara" InterruptOnChange flagga på en PIC 12F629

Inlägg av Icecap »

Jag har en enkel avstutsning som jag har märkt fungerar ypperligt:
Anta att det rör sig om en enda port (för enklare exempel) som knapparna är kopplade till.
Steg 1: starta en timer-interrupt på kanske 20-50Hz. Kan vara högre också.
Steg 2: I timer-ISR'n läsas porten en gång! Detta värde jämförs med förra avläsningen som har sparats och är de två avläsningar identiska är det bra, annars hopp till steg 4.
Steg 3: Behandla knapptryckningen som det ska göras.
Steg 4: Kopiera avläsningen till "Förra Avläsningen"-variabeln.

Klart! Jag brukar använda en n-key-rollover rutin till knapptryckningar men det kan vara överkurs.

Fördelen med detta sätt är att det inte finns någon vänttid i ISR'n och är knapptryckningen inte "stabil" sker det inget, programmet fladdrar bara förbi som hastigast.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: "Cleara" InterruptOnChange flagga på en PIC 12F629

Inlägg av PopUnoNkoK »

Vad använder ni av för "instruction" när ni kollar om den är i samma läge som föregående omgång.
Jag kör bara med BTFSS & BTFSC men på Icecap låter det som att han kollar en hel port med en (eller ett fåtal) instruktioner.
Skulle juh vara gött om man kunde ha ett register där varje bit motsvarar en registrerad knapptryckning. Alltså ett register som man kan polla i mainloopen utan att bry sig om kontaktstudsar där. 1 på en viss bit betyder registrerad knapptryckning på den knappen osv.

Mvh Peter
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Cleara" InterruptOnChange flagga på en PIC 12F629

Inlägg av sodjan »

Ja, det finns ju flera sätt att kolla om något är likadant som innan.
50-50 = 0, alltså är 50=50.
50-60 <> 0 alltså är 50 <> 60.

Att testa om något är noll eller inte är väldigt enkelt på processorer.

> Skulle juh vara gött om man kunde ha ett register där varje bit motsvarar en registrerad knapptryckning.

Visst, det kan representera 8 knappars (eller andra ingångars) "senaste kända läge".
Om du sedan har ett register med det aktuella läget (efter avstudsning) så kan du göra en
XORWF mellan dom och få ett 8 bitars resultat där varje "1" anger att en ingång har ändrat
läge (om det var 1=>0 eller 0=>1 bryr vi oss inte om i detta läge) och en flagga
för just den funktionen kan sättas. Sen får den rutin som har till uppgift att ta hand
om just den ingången kolla om det nya läget är 1 eller 0 och göra det den ska. Den
rutinen kan anropas från main() när main() triggar på flaggan från ISR'en.

Om XORWF ger noll som resultat (enkelt att kolla med BTFSx mot STATUS, Z) så
har ingenting ändrats på ingångarna och men gör ingenting alls.
Asko
Inlägg: 1
Blev medlem: 28 oktober 2011, 14:37:19

Re: "Cleara" InterruptOnChange flagga på en PIC 12F629

Inlägg av Asko »

mit förslag:
läs av kulan med optogaffel,(kan tillämpningsanpassas)
(ex.vis weaklaser på bpw34).

då lär du slippa debounca obefintliga signalartifakter.
och kan fritt använda dig av avbrott.

mvh Asko
Skriv svar