Sei sulla pagina 1di 12

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 <H16f84a.inc>

; 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 lnea

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 lnea

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 lnea

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 lnea

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.

Potrebbero piacerti anche