07-07-2014, 09:43 PM
Buenos dias, estoy embarcado en un pequeño proyecto que me pidio un familiar, desarrollar un temporizador de 0-60 minutos, que active una alarma. Empleo un 16F873, llevaba buen camino, pero jodi el PIC por un error, y ando esperando a que me llege otro....., sin mas distraccion, dejo el esquematico que prepare.
Lleva dos displays multiplexados, manejados por el puerto B, un par de interruptores y un rele para el BUZZER, poco mas, la aplicacion en si es sencilla. Lo estoy programando en ASM, pero como sabemos, tiene su chicha.....
Esto es todo por ahora, el codigo no es del todo funcional, ya cuenta correctamente y se puede establecer la cuenta. Queda hacer que suene el buzzer, el antirrebote de un pulsador, que en ASM no es moco de pavo.... y alguna cosilla mas. Uso dos TIMERS del PIC, uno para la multiplexacion de los displays, y otro para la cuenta.
Espero que a alguien le sirva
Lleva dos displays multiplexados, manejados por el puerto B, un par de interruptores y un rele para el BUZZER, poco mas, la aplicacion en si es sencilla. Lo estoy programando en ASM, pero como sabemos, tiene su chicha.....
Código:
;Alarma para despertar, a intervalos de un minuto
;===============================================================================
;Configuramos el procesador
list p=16F873A ;Definimos el tipo de procesador
include "P16F873A.inc" ;Incluimos la libreria
; CONFIG
; __config 0xFF3A
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;===============================================================================
;MACROS
;Macro para situarnos en el banco de memoria 0
BNK_0 macro
bcf STATUS,5
endm
;Macro para situarnos en el banco de memoria 1
BNK_1 macro
bsf STATUS,5
endm
;Macro para guardar status y registro de trabajo
PUSH macro
movwf salv_w
swapf salv_w,F ;Hacemos un swap para no modificar F
swapf STATUS,W ;Hacemos swap y guardamos en W
movwf salv_s ;Guardamos
endm
;Macro para cargar status y registro de trabajo
POP macro
swapf salv_s,W
movwf STATUS
swapf salv_w,W
endm
;GUARDAR las unidades y decenas
GUARDAR macro
movf unidades,0
movwf salv_un
movf decenas,0
movwf salv_de
endm
;CARGAR las unidades y decenas
CARGAR macro
movf salv_un,0
movwf unidades
movf salv_de,0
movf decenas
endm
;===============================================================================
;Variables
salv_w equ 0x20
salv_s equ 0x21
display equ 0x22
unidades equ 0x23
decenas equ 0x24
pulsador1 equ 0x26
antirebote1 equ 0x25
pulsador2 equ 0x27
tempo1 equ 0x28
tempo2 equ 0x29
salv_un equ 0x30
salv_de equ 0x31
;===============================================================================
org 0x00 ;Vector de reset
goto Start
org 0x04 ;Interrupcion
goto Display
;===============================================================================
;Tabla para mostrar los valores en los displays
TABLA addwf PCL,1 ;Busca posicion del digito en la tabla
retlw b'11000000' ;Digito 0
retlw b'11110110' ;Digito 1
retlw b'10100001' ;Digito 2
retlw b'10100100' ;Digito 3
retlw b'10010110' ;Digito 4
retlw b'10001100' ;Digito 5
retlw b'10011000' ;Digito 6
retlw b'11100110' ;Digito 7
retlw b'10000000' ;Digito 8
retlw b'10000110' ;Digito 9
;===============================================================================
;Rutina de multiplexacion de display
Display PUSH
bcf INTCON,2 ;Limpiamos flag de interrupcion
movlw 0xD8 ;Recargamos el timer0
movwf TMR0
movf display,0
xorlw 0x00
btfsc STATUS,Z ;Si display es 0, actualizamos el primero
call print0
movf display,0
xorlw 0x01
btfsc STATUS,Z ;Si display es 1, actualizamos el segundo
call print1
movlw 0x01 ;Alternamos el display
xorwf display,F
movf pulsador1,0
xorlw 0x01
btfsc STATUS,Z
incf antirebote1
bcf STATUS,Z
movf antirebote1,0
xorlw 0x20
btfsc STATUS,Z
call configu
POP
retfie
;===============================================================================
;Impresion en el primer display (Decenas)
print0 movf decenas,0
call TABLA
bsf PORTA,0
bcf PORTA,1
movwf PORTB
bcf STATUS,Z
return
;Impresion en el segundo display (Unidades)
print1 movf unidades,0
call TABLA
bsf PORTA,1
bcf PORTA,0
movwf PORTB
bcf STATUS,Z
return
;===============================================================================
;Configuracion del tiempo a contar
incdec bcf STATUS,Z
incf decenas
clrf unidades
movf decenas,W
xorlw 0x06
btfsc STATUS,Z
clrf decenas
return
configu clrf antirebote1
bcf pulsador1,0
movf PORTA,0
andlw b'00001000'
btfsc STATUS,Z
return
bcf STATUS,Z
incf unidades
movf unidades,0
xorlw 0x0A
btfsc STATUS,Z
call incdec
return
;===============================================================================
tempor GUARDAR
goto tempor_next
tempor_next
bcf PIR1,0
movlw b'01100011'
movwf TMR1H
movlw b'11000000'
movwf TMR1L
movlw b'00000001'
movwf T1CON
movlw 0x00
movwf PIE1
incf tempo1
temp btfsc PIR1,0 ;Si desbordamos el contador
goto tempor_next
movf tempo1,0
xorlw 0xFF
btfsc STATUS,Z
call recall
movf tempo2,0
xorlw 0x0C
btfsc STATUS,Z
call restarmin
goto temp
;===============================================================================
recall incf tempo2
clrf tempo1
return
;===============================================================================
restarmin NOP
clrf tempo2
clrf tempo1
decf unidades,F
movf unidades,0
xorlw 0xFF
btfsc STATUS,Z
call decrement
movf unidades,0
iorwf decenas,0
btfsc STATUS,Z
goto alarma
goto tempor
;===============================================================================
decrement bcf STATUS,Z
decf decenas,F
movlw 0x09
movwf unidades
return
;===============================================================================
alarma movf PORTA,0
andlw b'00010000'
btfss STATUS,Z
goto stop
goto alarma
;===============================================================================
stop CARGAR
NOP
goto Loop
;===============================================================================
Start
BNK_0
clrf PORTB ;Puertos A y B inicialmente a 0
clrf PORTA
BNK_1
movlw b'10000111' ;Prescaler de 256 asignado a timer0
movwf OPTION_REG
movlw b'00000110' ;Configuramos puerto A como digitales
movwf ADCON1
clrf TRISB
movlw b'00011000' ;Puerto A tres salidas dos entradas (Interruptores)
movwf TRISA
BNK_0
movlw b'10100000'
movwf INTCON
movlw 0xD8 ;Cargamos el timmer para tener 10ms
movwf TMR0
clrf display
clrf unidades
clrf decenas
Loop
movf PORTA,0
andlw b'00010000' ;Comprobamos si esta pulsado el pulsador 2
btfss STATUS,Z
goto tempor
bcf STATUS,Z
movf PORTA,0 ;Cargamos el valor de PORTA
andlw b'00001000' ;Comprobamos si esta pulsado el pulsador 1
btfss STATUS,Z ;Si esta pulsado activamos pulsador1
bsf pulsador1,0
bcf STATUS,Z
goto Loop
end
Esto es todo por ahora, el codigo no es del todo funcional, ya cuenta correctamente y se puede establecer la cuenta. Queda hacer que suene el buzzer, el antirrebote de un pulsador, que en ASM no es moco de pavo.... y alguna cosilla mas. Uso dos TIMERS del PIC, uno para la multiplexacion de los displays, y otro para la cuenta.
Espero que a alguien le sirva