encontre un contador que se adecuaa mi circuito.
el problema es que al compilar en mplab me marca 1 Error
[141] C:\contador\..\Users\cross-had\Downloads\contador fin.asm; 3.30 can't open include file "H16f84a.inc": No such file or directory
esta es la pag http://www.iesleonardo.info/ele/pro/CURSO 2001-2002/p02-timer/
i el codigo
el problema es que al compilar en mplab me marca 1 Error
[141] C:\contador\..\Users\cross-had\Downloads\contador fin.asm; 3.30 can't open include file "H16f84a.inc": No such file or directory
esta es la pag http://www.iesleonardo.info/ele/pro/CURSO 2001-2002/p02-timer/
i el codigo
Código:
;#################### 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 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.
Última edición por un moderador: