;############################################################# ; Fichero : revol.asm ; Autor : angel sereno rodriguez. ; Fecha: Enero del 2002. ; Version: 0.0 ; Sistema RAD-MICROS. ; Placa Microcontroladora: micro-p1684. ; Placa de Aplicaciones: apli-miniclock. ; Placa de programacion: Programador 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 : Similador de un cuenta revoluciones digital. ;############################################################# 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 para guardar contador 0. con1 EQU 0x0F ; Variable para guardar contador 1. u_rpm EQU 0x11 ; Unidades rpm. d_rpm EQU 0x12 ; Decenas rpm. c_rpm EQU 0x13 ; Unidades rpm. u_m_rpm EQU 0x14 ; Decenas rpm. u_t EQU 0x16 ; Unidades de segundo. d_t EQU 0x17 ; Decenas de segundo. c_t EQU 0x18 ; Unidades de minuto. u_m_t EQU 0x19 ; Decenas de minuto. con_0 EQU 0x1A ; ;################ 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. BCF INTCON,GIE ; Inhabilito interrupciones. ;Pregunto quien realiza la interrupcion BTFSS INTCON,T0IF ; TOIF sube bandera?? CALL es_RB4 ; No sube. RBIF sube bandera. CALL tiempo ; Si sube bandera TOIF. GOTO fuera ; Rutina para salir al P.P. ;************************************************************ ;Rutina: es_RB4 ;Funcion: Incrementa cuando sube bandera RBIF ;Entradas: ;Salidas: u_t, d_t, c_t, u_m_t ;Variables utilizadas: ;************************************************************ es_RB4 BTFSS PORTB,4 GOTO es_RB4 ;Incremento d_t INCF d_t,F ; d_t + 1 = d_t MOVF d_t,W ; W = d_t SUBLW 0x0A ; 10 - W = STATUS BTFSS STATUS,Z ; Z = ?? GOTO sal ; Z = 0 MOVLW 0x00 ; Z = 1 y W = L(0x00) MOVWF d_t ; d_t = 0x00 ;Incremento c_t INCF c_t,F ; c_t + 1 = c_t MOVF c_t,W ; W = c_t SUBLW 0x0A ; 10 - W = STATUS BTFSS STATUS,Z ; Z = ?? GOTO sal ; Z = 0 MOVLW 0x00 ; Z = 1 y W = L(0x00) MOVWF c_t ; c_t = 0x00 ;Incremento u_m_t INCF u_m_t,F ; u_m_t + 1 = u_m_t MOVF u_m_t,W ; W = u_m_t SUBLW 0x0A ; 10 - W = STATUS BTFSS STATUS,Z ; Z = ?? GOTO sal ; Z = 0 MOVLW 0x00 ; Z = 1 y W = L(0x00) MOVWF u_m_t ; u_m_t = 0x00 GOTO sal ; Salta a la rutina de salida sal RETURN ;************************************************************* ;FIN DE LA RUTINA ;************************************************************* ;************************************************************ ;Rutina: tiempo ;Funcion: tiempo para 500mS ;Entradas: ;Salidas: ;Variables utilizadas:con0 ;************************************************************ tiempo DECFSZ con0,F ; con0 - 1 = con0 GOTO sal_1 ; Z = 0 DECFSZ con_0,F GOTO sal_1 MOVLW 0xFF ; Z = 1 , W = L = 0xFF MOVWF con0 ; con0 = W MOVLW 0x04 ; Z = 1 , W = L = 0x04 MOVWF con_0 ; con_0 = W CALL cambio ; Salto a la rutina cambio. sal_1 RETURN ;************************************************************* ;FIN DE LA RUTINA ;************************************************************* ;************************************************************ ;Rutina: cambio ;Funcion: Cambia valores para refrescar el display ;Entradas: u_t, d_t, c_t, u_m_t ;Salidas: u_rpm, d_rpm, c_rpm, u_m_rpm ;Variables utilizadas: u_t, d_t, c_t, u_m_t, u_rpm, d_rpm, c_rpm, u_m_rpm ;************************************************************ cambio MOVF u_t,W ; W = u_t MOVWF u_rpm ; u_rpm = u_t CLRF u_t ; Reset de u_t MOVF d_t,W ; W = d_t MOVWF d_rpm ; d_rpm = d_t CLRF d_t ; Reset de d_t MOVF c_t,W ; W = c_t MOVWF c_rpm ; c_rpm = c_t CLRF c_t ; Reset de c_t MOVF u_m_t,W ; W = u_m_t MOVWF u_m_rpm ; u_m_rpm = u_m_t CLRF u_m_t ; Reset de u_m_t RETURN ;************************************************************* ;FIN DE LA RUTINA ;************************************************************* fuera MOVF status_temp,W ; W = satatus_temp MOVWF STATUS ; Recupera STATUS. SWAPF w_temp,F SWAPF w_temp,W ; Recupera W. BCF INTCON,RBIF ; Bajo bandera de RBIF BCF INTCON,T0IF ; Bajamos Bandera T0IF. BSF INTCON,GIE ; Habilitamos interrupciones RETFIE ; Retorno de interrupcion. ;************************************************************* ;FIN DE LA INTERRUPCION ;************************************************************* ;############################################################# ;############################################################# ;############################################################# ;############################################################# ;############################################################# ;############################################################# ;############################################################# ;################ PROGRAMA PRINCIPAL ######################### inicio BSF STATUS,RP0 ; Banco 1 MOVLW B'10000001' ; Divisor = 4 MOVWF OPTION_REG ; Configuramos TMR0 MOVLW B'00010000' ; W = L = 0x10 MOVWF TRISB ; Configuramos I/O PORTB CLRF TRISA ; Configuramos I/O PORTA BCF STATUS,RP0 ; Banco 0 CLRF PORTB ; Pongo como entrada el PORTB MOVLW 0xFF ; Variable para temporizar. MOVWF con0 ; con0 x divisor x TMR0 = X segundo. MOVLW 0x04 ; Variable para temporizar. MOVWF con_0 ; con0 x divisor x TMR0 = X segundo. MOVLW 0x3F ; Variable para temporizar. MOVWF con1 ; con0 x divisor x TMR0 = X segundo. CLRF u_t ; Reset u_t CLRF d_t ; Reset d_t CLRF c_t ; Reset c_t CLRF u_m_t ; Reset u_m_t CLRF TMR0 ; TMR0 = 0 MOVLW B'10101000' ; Habilitamos RBIE,GIE,TOIE. MOVWF INTCON bucle CALL display ; Rutina que visualiza el display GOTO bucle ; Rutina de retorna al bucle ;################### FIN DEL PROGRAMA PRINCIPAL ############## ;############################################################# ;************************************************************ ;Rutina: display ;Funcion: Visualizar en los displays ;Entradas: ;Salidas: PORTB,X ;Variables utilizadas: u_rpm, d_rpm, c_rpm, u_m_rpm ;************************************************************ display MOVF u_rpm,W ; W = u_rpm MOVWF PORTA ; PORTA = W BSF PORTB,0 ; PORTB,0 = ACTIVO CALL delay ; Rutina de retardo BCF PORTB,0 ; PORTB,0 = DESACTIVO MOVF d_rpm,W ; W = d_rpm MOVWF PORTA ; PORTA = W BSF PORTB,1 ; PORTB,1 = ACTIVO CALL delay ; Rutina de retardo BCF PORTB,1 ; PORTB,1 = DESACTIVO MOVF c_rpm,W ; W = c_rpm MOVWF PORTA ; PORTA = W BSF PORTB,2 ; PORTB,2 = ACTIVO CALL delay ; Rutina de retardo BCF PORTB,2 ; PORTB,2 = DESACTIVO MOVF u_m_rpm,W ; W = u_m_rpm MOVWF PORTA ; PORTA = W BSF PORTB,3 ; PORTB,3 = ACTIVO CALL delay ; Rutina de retardo BCF PORTB,3 ; PORTB,3 = DESACTIVO RETURN ; Retorno al bucle inicial ;************************************************************* ;FIN DE LA RUTINA ;************************************************************* ;************************************************************ ;Rutina: delay ;Funcion: Realiza un retardo en los displays ;Entradas: ;Salidas: ;Variables utilizadas: con1 ;************************************************************ delay MOVLW 0x3F ; W = 0x4F MOVF con1 ; con1 = W loop DECFSZ con1,F ; con1 - 1 = con1 GOTO delay ; Z = 0 RETURN ; z = 1 ;************************************************************* ;FIN DE LA RUTINA ;************************************************************* END ; Fin de programa.