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.
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
tendrias el contador de pulsaciones para el ATmega328p
ResponderEliminarno, pero tengo programas similares en mis otras publicaciones para atmega8, tendrías que realizar los cambios e implementar la rutina de interrupción.
ResponderEliminarGenial es justo lo que necesitaba ! Te felicito y muchas gracias por compartir tu conocimiento!!! José Víquez - Costa Rica
ResponderEliminarMuchas gracias por el comentario. Cualquier duda, estoy para responderte.
EliminarSaludos.
Thank u man, your code really works, you help me to finish my final proyect!!!
ResponderEliminarHola 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"
ResponderEliminarGracias