miércoles, 2 de marzo de 2011

Contador de Pulsaciones

Programa para PIC16F84A

Programa que cuenta la cantidad pulsaciones en decimal (0-9).
La cuenta se muestra en BCD mediante 4 leds y en Decimal mediante un Display.

-Interrupciones por el pin RB0/INT
-Tabla de datos de conversión Hexadecinal a 7 segmentos

Diagrama de Conexión:


Funcionamiento:

  • Ocurre una interrupción cuando se oprime el pulsador (Flanco de subida).
  • La rutina de interrupción incrementa la cuenta en 1. 
  • En la misma rutina de interrupción se comprueba si la cuenta llegó a 10, cuando esto ocurre la cuenta se reinicia.
 Prueba:


 Programa en Assembler:


;-------------------------------------------------------------------
;Autor: LONELY113
;       http://lonely113.blogspot.com
;
;Programa contador de pulsaciones mediante rutina de interrupcion
;Entrada de pulsos: Pin RB0 
;Salida en codigo BCD: Puerto A (RA0-RA3)
;Salida a display 7 segmentos catodo comun: Puerto B (RB1-RB7)
;
;-------------------------------------------------------------------
include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

COUNT equ 0x0C
TEMP equ 0x0D
TEMP2 equ 0x0E

 org 0x00  ; Inicio de programa 
 goto BEGIN
 org 0x04  ; Dirección de inicio de rutina de interrupcion
 movwf TEMP  ; Mover registro W a memoria temporal TEMP
 movf STATUS,0
 movwf TEMP2  ; Salva el estado de flags
 incf COUNT,1  ; Incrementar COUNT y guardar en memoria
 movlw 0x0A  ; mover d'10' a W
 subwf COUNT,0
 btfss STATUS,0 ; Si COUNT=10 saltar a CLEAR
 goto RESUME  ; Si COUNT<10 saltar a RESUME
 goto CLEAR
RESUME: bcf INTCON,1 ; Habilita interrupciones por RB0
 movf TEMP2,0
 movwf STATUS
 movf TEMP,0  ; Mover TEMP a W
 retfie   ; Retorno de interrupcion
CLEAR: clrf COUNT  ; Borrar COUNT
 movf TEMP2,0
 movwf STATUS
 movf TEMP,0
 bcf INTCON,1 ; Permitir interrupciones
 retfie   ; Retorno de interrupcion

;Principal

BEGIN: bsf INTCON,7 ; Habilitacion global de interrupciones
 bsf INTCON,4 ; Interrupciones por RB0
 bcf INTCON,1 ; Permitir interrupciones por RB0
 bsf STATUS,5 ; Configurar puertos E/S
 movlw 0x01  ; b'00000001' 
 movwf PORTB  ; RB0 como entrada RB1-RB7 como salidas
 clrf PORTA  ; PORTA como salida
 bcf STATUS,5 ; Fin configuracion E/S
LOOP: movf COUNT,0
 movwf PORTA  ; Mueve COUNT a PORTA. La cuenta se muestra en BCD
 call CONV  ; Llama a subrutina CONV
 movwf PORTB  ; Mueve W a PORTB. La cuenta se muestra en display de 7 segmentos
 goto LOOP  ; Bucle infinito
  
;SUBRUTINAS

CONV addwf PCL  ; Conversion Hexadecimal a 7 segmentos
 retlw 0x7E  ; 0
 retlw 0x0C  ; 1
 retlw 0xB6  ; 2
 retlw 0x9E  ; 3
 retlw 0xCC  ; 4
 retlw 0xDA  ; 5
 retlw 0xFA  ; 6
 retlw 0x0E  ; 7
 retlw 0xFE  ; 8
 retlw 0xDE  ; 9

 end   ; Fin de programa
  

Archivos .ASM y .HEX
Descargar

6 comentarios:

  1. tendrias el contador de pulsaciones para el ATmega328p

    ResponderEliminar
  2. no, pero tengo programas similares en mis otras publicaciones para atmega8, tendrías que realizar los cambios e implementar la rutina de interrupción.

    ResponderEliminar
  3. Genial es justo lo que necesitaba ! Te felicito y muchas gracias por compartir tu conocimiento!!! José Víquez - Costa Rica

    ResponderEliminar
    Respuestas
    1. Muchas gracias por el comentario. Cualquier duda, estoy para responderte.

      Saludos.

      Eliminar
  4. Thank u man, your code really works, you help me to finish my final proyect!!!

    ResponderEliminar
  5. Hola podeis facilitar un programa que me permita leer la entrada A0 ,analogica, en un PIC 16F716 y que la conversión aparezca en la puerta "B"
    Gracias

    ResponderEliminar