Cronometro Con Pic

CRONOMETRO CON PIC ;############################################################# ; Fichero : Atimer2.0.asm ; Autor : I

Views 222 Downloads 0 File size 136KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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.