;############################################################# ; 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 0x0C ; Variable para guardar W. status_temp EQU 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 ; Vector de Reset. GOTO inicio ; Programa Principal. ;########## TRATAMIENTO DE INTERRUPCIONES #################### ORG 0x04 ; Vector de interrupcion. MOVWF w_temp ; Guarda W. MOVF STATUS,W MOVWF status_temp ; Guarda STATUS. DECFSZ con0,F ; 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 ; 11111111 - (u_s) --> W BTFSS STATUS,Z ; 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 ; 11111111 - (d_s) --> W BTFSS STATUS,Z ; 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 ; 9 --> m_s salir MOVF status_temp,W MOVWF STATUS ; Recupera STATUS. SWAPF w_temp,F SWAPF w_temp,W ; Recupera W. BCF INTCON,T0IF ; Bajamos Bandera T0IF. RETFIE ; 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 ; Configuramos I/O PORTB MOVLW B'00000000' ; MOVWF TRISA ; Configuramos I/O PORTA BCF STATUS,RP0 ; Banco 0 BCF PORTA,4 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 ; m_s = 9 CLRF start ; 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 ; 10 - (u_s) --> W BTFSS STATUS,Z ; Si Z=1 => (u_s) = 10 GOTO salus MOVLW 0x00 MOVWF u_s ; 0 --> u_s salus CALL delay_r ; 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 ; Movemos u_s al registro de trabajo BTFSS STATUS,Z ; 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 PORTA,4 sal 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 ; 10 - (d_s) --> W BTFSS STATUS,Z ; Si Z=1 => (d_s) = 10 GOTO salds MOVLW 0x00 MOVWF d_s ; 0 --> d_s salds CALL delay_r ; 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 ; 10 - (c_s) --> W BTFSS STATUS,Z ; 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.