Jag har sökt på "debounce" och hittade bl.a den här och den här men jag ser inte koden för själva avstuds-hanteringen.
Flera har skrivit att de använder timers och liknande för att läsa av knapparna flera gånger.
Jag kan inte riktigt se koden för timer-lösningen framför mig.
Min senaste variant bygger inte på timers:
Kod: Markera allt
isr_rutin
;Knapp-interrupt.
banksel INTCON
btfsc INTCON, RAIF ;PORTA change interrupt? Om inte: Hoppa över nästa rad.
;--
debounce
btfss PORTA, 4 ;Intryckt knapp? Isåfall: Hoppa över nästa rad.
goto knappslut
incf rakna_knapp, 1 ;Öka rakna_knapp med 1.
btfss rakna_knapp, 7 ;Bit 7 satt (dvs rakna_knapp >=128) Isåfall: Hoppa över nästa rad.
goto debounce
comf PORTC, 1 ;Toggla PORTC
;--
knappslut
clrf rakna_knapp ;Rensa
banksel INTCON
bcf INTCON, RAIF ;Clerara PORTA change interrupt.
bsf INTCON, RAIE
Jag är medveten om att det är dumt att ha en såndär loop i ISR-rutinen,
men så länge jag bara exprimenterar med avstudsningen så gör det ju inget.

Jag satte några lysdioder på PORTC och en knapp med pulldown till PORTA.4.
Koden fungerar, men som avstuds är den ganska dålig. Man får oftast trycka 2-3 gånger för att PORTC ska ändras.
Testade att sätta en rad NOP i avstuds-rutinen och det blev bättre, men jag är lite tveksam till att det är en bra metod...
Jag skulle behöva lite råd på vad jag ska göra annorlunda. Det vore trevligt att se en avstuds-rutin för PIC.
Språk kvittar, men gärna assembler eftersom jag har återupptagit det.

edit: Det slog mig just.. Det är inte så att det krävs en lite annan lösning just eftersom jag använder "interrupt on change" ?