Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Filtrar els rebots d'un polsador

Els polsadors i els interruptors tenen el problema que quan canvien d'estat els contactes reboten i, per això, sovint el microcontrolador no veu només una activació entrada sinó unes quantes. Quan només volem saber l'estat del polsador o interruptor això no sol ser important però sí quan volem comptar les activacions o fer que cada activació canviï l'estat del sistema.

El que cal fer és assegurar-nos que l'estat de l'entrada és estable. El programa que es proposa mira el polsador (o interruptor), aproximadament, cada mil·lisegon. Si N vegades seguides el troba igual ho considera estable. El diagrama de flux del programa seria el següent, on en verd hi tenim el nom de les etiquetes de cada part del programa.

Filtrat dels rebots

El programa mira el polsador de la placa (connectat a RA3). Recordem que l'entrada RA3 està habitualment activada i es desactiva quan es prem el polsador. En el programa hem considerat que N és 4 i fem servir la funció xor tant per comparar dos valors com per invertir un bit.

Polsador EQU 0x20  ; Una variable amb l'estat del polsador (1 = premut)
Previ EQU 0x21  ; I una amb l'estat previ del polsador
Compta EQU 0x22  ; Una variable per comptar iteracions
Retard1 EQU 0x23  ; Variable per al bucle de retard
PSECT code, class=CODE, delta=2, abs
main:
  bsf RP0  ; Tria el banc 1
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf TRISA  ; Posa tots els bits del port A com a entrada
  bcf RP0
  clrf Compta  ; Posa el comptador d'iteracions a valor zero
  clrf Previ  ; L'estat previ del polsador és no premut
BucleR:
  movlw 00000001B
  movwf Polsador  ; Activem polsador abans de comprovar
  btfsc PORTA,3  ; Mira si està desactivada l'entrada A3
                 ; Si desactivat (premut), no fa la instrucció següent
  clrf Polsador  ; Si no està premut, desactiva polsador
  movf Previ,w  ; Copia Previ a l'acumulador
  xorwf Polsador,w  ; Compara Previ amb Polsador, si són iguals s'activa Z
  btfsc ZERO  ; Si són iguals va a Final
  goto Esborra
  incf Compta,f  ; Si són iguals, incrementa el valor de Compta
  movf Compta,w  ; Copia Compta a l'acumulador
  xorlw 4  ; Comprova si val 4, si ho val s'activa Z
  btfss ZERO  ; Si val 4 no fa la instrucció següent
  goto Final  ; Si no era 4 va a Final
  movf Polsador,w  ; Copia Polsador a W, si val 0 s'activa Z
  btfsc ZERO  ; Si Polsador valia 1 (Z=0) no fa la instrucció següent
  goto Invert  ; Si no està premut, ja estem
Accions:  ; Aquí anirien les accions que cal fer cada cop
          ; que es prem el polsador
Invert:
  movf Previ,w  ; Copia Previ a l'acumulador
  xorlw 00000001B  ; Inverteix el valor
  movwf Previ  ; I ho guarda a Previ
Esborra:
  clrf Compta  ; Posa el comptador d'iteracions a valor zero
Final:  ; Funció de retard 1 ms
  nop
  decfsz Retard1,f	
  goto Final
  goto BucleR  ; Repetim-ho...
END main

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.