CRONOMETRO CON PIC ;############################################################# ; Fichero : Atimer2.0.asm ; Autor : I
Views 222 Downloads 0 File size 136KB
CRONOMETRO CON PIC
;############################################################# ; Fichero : Atimer2.0.asm ; Autor : Ivan E.G. ; Fecha: Marzo 2002. ; Version:0.0 ; Sistema RAD-MICROS. ; Placa Microcontroladora: micro-p1684. ; Placa de Aplicaciones: apli-timercc. ; Placa de programacion: Programador Universal Superpro II/P. ( XELTEK ) ; Bus: bus-40. ; Codigo para: PIC16C84 y PIC16F84
; Clock: 4MHz , XT. -> Ciclo = 1 uS. ; Reset: Power On Reset. ; Watch dog: Inhabilitado. ; Proteccion de codigo: Inhabilitado. ; Ficheros requeridos: H16f84a.inc ; Funcion : Genera TEMPORIZADOR DIGITAL con BCD to 7 segment. ;############################################################# ;#################### CABEZERAS ############################## LIST
p=PIC16F84A
; Directiva para definir micro.
#include
; Fichero standard de cabezera.
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;#################### DEFINICIONES ###########################
w_temp
EQU
status_temp
0x0C
EQU
; Variable para guardar W.
0x0D
; Variable para guardar STATUS.
con0
EQU
0x0E
; Variable de temporizacion.
con1
EQU
0x0F
; Variable de temporizacion.
con2
EQU
0x10
; Variable de temporizacion.
u_s
EQU
0x11
; Unidades de segundo.
d_s
EQU
0x12
; Decenas de segundo.
c_s
EQU
0x13
; Centenas de segundo.
m_s
EQU
0x14
; Millares de segundo.
start
EQU
0x15
; start=1 decrementa.
; start=0 se para. ;################ COMIENZO DEL PROGRAMA #####################
ORG
0x00
GOTO inicio
; Vector de Reset. ; Programa Principal.
;########## TRATAMIENTO DE INTERRUPCIONES ####################
ORG
0x04
; Vector de interrupcion.
MOVWF w_temp
; Guarda W.
MOVF STATUS,W MOVWF status_temp
DECFSZ con0,F
; Guarda STATUS.
; Salta si tiempo = 1 seg.
GOTO salir MOVLW 0x3D
; Variable para temporizar.
MOVWF con0
; con0 x divisor x TMR0 = 1 segundo.
; Tratamos unidades de segundos. DECF u_s,F MOVF u_s,W SUBLW 0xFF BTFSS STATUS,Z
; 11111111 - (u_s) --> W ; Si Z=1 => (u_s) = 0
GOTO salir MOVLW 0x09 MOVWF u_s
; 9 --> u_s
; Tratamos decenas de segundos. DECF d_s,F MOVF d_s,W SUBLW 0xFF BTFSS STATUS,Z
; 11111111 - (d_s) --> W ; Si Z=1 => (d_s) = 0
GOTO salir MOVLW 0x09 MOVWF d_s
; 9 --> d_s
; Tratamos centenas de segundos. DECF c_s,F MOVF c_s,W
SUBLW 0xFF
; 11111111 - (c_s) --> W
BTFSS STATUS,Z
; Si Z=1 => (c_s) = 0
GOTO salir MOVLW 0x09 MOVWF c_s
; 9 --> c_s
; Tratamos millares de segundos. DECF m_s,F MOVF m_s,W SUBLW 0xFF
; 11111111 - (m_s) --> W
BTFSS STATUS,Z
; Si Z=1 => (m_s) = 0
GOTO salir MOVLW 0x09 MOVWF m_s
salir
; 9 --> m_s
MOVF status_temp,W MOVWF STATUS
; Recupera STATUS.
SWAPF w_temp,F SWAPF w_temp,W BCF
INTCON,T0IF
RETFIE
; Recupera W. ; Bajamos Bandera T0IF.
; Retorno de interrupcion.
;########## FIN DE TRATAMIENTO DE INTERRUPCIONES ############# ;################ PROGRAMA PRINCIPAL ######################### inicio
BSF
STATUS,RP0
; Banco 1
MOVLW B'10000101'
; Divisor = 64
MOVWF OPTION_REG
; Configuramos TMR0
MOVLW B'11110000' MOVWF TRISB MOVLW B'00000000' MOVWF TRISA
; Configuramos I/O PORTB ; ; Configuramos I/O PORTA
BCF
STATUS,RP0
BCF
PORTA,4
; Banco 0
MOVLW 0x3D
; Variable para temporizar.
MOVWF con0
; con0 x divisor x TMR0 = 1 segundo.
CLRF TMR0
; TMR0 = 0
MOVLW 0x09 MOVWF u_s
; u_s = 9
MOVWF d_s
; d_s = 9
MOVWF c_s
; c_s = 9
MOVWF m_s CLRF start
; m_s = 9 ; temporizador parado
MOVLW B'10100000'
; Habilitamos Interrupciones TOIE.
MOVWF INTCON
bucle
BTFSS PORTB,6 CALL mas_cs
; Se ha pulsado centenas de segundos
BTFSS PORTB,5 CALL mas_ds
; Se ha pulsado decenas de segundos
BTFSS PORTB,4 CALL mas_us
; Se ha pulsado unidades de segundos
BTFSS PORTB,7 CALL start_stop CALL todo_0 CALL display GOTO bucle ;############### FIN DE PROGRAMA PRINCIPAL ################## ;#################### RUTINAS ############################### ;************************************************************ ; RUTINA: display
; Funcion: Muestra informacion en displays 7 segmentos. ; Entrada: u_s, d_s, c_s, m_s ; Salida: nada. ; Variables utilizadas: nada. ;************************************************************ display
MOVF u_s,W
; Visualizo unidades de segundos.
MOVWF PORTA BSF
PORTB,0
CALL delay BCF
PORTB,0
MOVF d_s,W
; Visualizo decenas de segundos.
MOVWF PORTA BSF
PORTB,1
CALL delay BCF
PORTB,1
MOVF c_s,W
; Visualizo centenas de segundos.
MOVWF PORTA BSF
PORTB,2
CALL delay BCF
PORTB,2
MOVF m_s,W
; Visualizo millares de segundos.
MOVWF PORTA BSF
PORTB,3
CALL delay BCF
PORTB,3
RETURN ;************************************************************ ; FIN DE RUTINA: display
;************************************************************ ;************************************************************ ; RUTINA: start_stop ; Funcion: Establece el COMIENZO o la PARADA del TEMPORIZADOR. ; Entrada: nada ; Salida: nada ; Variables utilizadas: start ;************************************************************ start_stop
CALL delay_r
; Eliminamos rebotes del PULSADOR.
MOVLW 0x01 XORWF start,F MOVF start,W BTFSS STATUS,Z GOTO cuenta MOVLW B'00100000'
; Inhabilitamos Interrupciones GIE.
MOVWF INTCON GOTO fuera
cuenta
MOVLW B'10100000'
; Habilitamos Interrupciones GIE.
MOVWF INTCON fuera
RETURN
;************************************************************ ; FIN DE RUTINA: start_stop ;************************************************************
;************************************************************ ; RUTINA: mas_us ; Funcion: Modifica UNIDADES DE SEGUNDOS.
; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ mas_us ; Tratamos unidades de segundos. INCF u_s,F MOVF u_s,W SUBLW 0x0A BTFSS STATUS,Z
; 10 - (u_s) --> W ; Si Z=1 => (u_s) = 10
GOTO salus MOVLW 0x00 MOVWF u_s salus
CALL delay_r
; 0 --> u_s ; Eliminamos rebotes del PULSADOR.
RETURN ;************************************************************ ; FIN DE RUTINA: mas_us ;************************************************************ ;************************************************************ ; RUTINA: todo_0 ; Funcion: Para el temporizador si todas las unidades est n a 0 ; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ todo_0
MOVF u_s,W BTFSS STATUS,Z
; Movemos u_s al registro de trabajo ; Si Z=1,u_s es 0 y salta una l¡nea
GOTO sal MOVF d_s,W
; Movemos d_s al registro de trabajo
BTFSS STATUS,Z
; Si Z=1,u_s es 0 y salta una l¡nea
GOTO sal
MOVF c_s,W
; Movemos c_s al registro de trabajo
BTFSS STATUS,Z
; Si Z=1,u_s es 0 y salta una l¡nea
GOTO sal MOVF m_s,W
; Movemos m_s al registro de trabajo
BTFSS STATUS,Z
; Si Z=1,u_s es 0 y salta una l¡nea
GOTO sal MOVLW B'00100000'
; Inhabilitamos Interrupciones GIE.
MOVWF INTCON BSF
PORTA,4
; Se activa el zumbador.
CALL zumba BCF sal
PORTA,4
RETURN
;************************************************************ ; FIN DE RUTINA: todo_0 ;************************************************************ ;************************************************************ ; RUTINA: zumba ; Funcion: zumba ; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ zumba
MOVLW 0x3D MOVF con1
zumba_1
DECFSZ con2,F
GOTO zumba_1 Return
;************************************************************ ; FIN DE RUTINA: todo_0 ;************************************************************
;************************************************************ ; RUTINA: mas_ds ; Funcion: Modifica DECENAS DE SEGUNDOS. ; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ mas_ds ; Tratamos decenas de segundos. INCF d_s,F MOVF d_s,W SUBLW 0x0A BTFSS STATUS,Z
; 10 - (d_s) --> W ; Si Z=1 => (d_s) = 10
GOTO salds MOVLW 0x00 MOVWF d_s salds
CALL delay_r
; 0 --> d_s ; Eliminamos rebotes del PULSADOR.
RETURN ;************************************************************ ; FIN DE RUTINA: mas_ds ;************************************************************ ;************************************************************ ; RUTINA: mas_cs ; Funcion: Modifica CENTENAS DE SEGUNDOS. ; Entrada: nada ; Salida: nada ; Variables utilizadas: nada ;************************************************************ mas_cs ; Tratamos centenas de segundos. INCF c_s,F
MOVF c_s,W SUBLW 0x0A BTFSS STATUS,Z
; 10 - (c_s) --> W ; Si Z=1 => (c_s) = 10
GOTO salcs MOVLW 0x00 MOVWF c_s
; 0 --> c_s
INCF m_s,F MOVF m_s,W SUBLW 0x0A BTFSS STATUS,Z GOTO salcs MOVLW 0x00 MOVWF m_s salcs
CALL delay_r
; Eliminamos rebotes del PULSADOR.
RETURN ;************************************************************ ; FIN DE RUTINA: mas_cs ;************************************************************ ;************************************************************ ; RUTINA: delay ; Funcion: Produce un retardo para displays. ; Entrada: nada ; Salida: nada ; Variables utilizadas: con1, con2 ;************************************************************ delay
CLRF con1 MOVLW 0x05 MOVWF con2
loop
DECFSZ con1,F GOTO loop
DECFSZ con2,F GOTO loop RETURN ;************************************************************ ; FIN DE RUTINA: delay ;************************************************************ ;************************************************************ ; RUTINA: delay_r ; Funcion: Produce un retardo para evitar rebotes en PULSADORES. ; Entrada: nada ; Salida: nada ; Variables utilizadas: con1, con2 ;************************************************************ delay_r
MOVLW 0x2D MOVWF con1
loop_r
DECFSZ con1,F GOTO loop_r RETURN
;************************************************************ ; FIN DE RUTINA: delay_r ;************************************************************ ;################## FIN DE RUTINAS ########################## ;################## FIN DE PROGRAMA ######################## END
; Fin de programa.