Anda di halaman 1dari 7

list

#include

p=16f877A
<p16f877A.inc>

;Comando que indica el Pic usado


;Etiquetas genricas para el Pic16

F877
;==============================================================================
;
DEFINICIN DE BITS, PINES Y CONSTANTES
=
;==============================================================================
#define
CONF_OPT
H'F8'
; Valor a escribir en el
registro de configuracion del TMR0
#define
LIMITE
D'10'
;EQU 0x0A ; Limi
te de la cuenta
#define
PB_PULSOS
PORTB,0 ;pulsante n.o. generador de puls
os
#define
LED_PULSOS
PORTC,0 ;led activo durante el pulso
;==============================================================================
;
DEFINICIN DE VARIABLES
=
;==============================================================================
CONT_UNI
EQU 0x120
;Variable tempor
al para contador del TMR0
CONT_DECE
EQU
0x121
;varible para el
contar en decenas
CONT_CENT
EQU
0x122
;variable para c
ontar en centenas
CONT_MIL1
EQU
0x123
CONT_MIL2
EQU
0x124
CONT_MIL3
EQU
0x125
TEMP_US
EQU
0x128
;variable que contiene m
icrosegundos para un retardo
TEMP_MS
EQU
0x129
;variable que contiene m
ilisegundos para un retardo
TEMP_CRO
retardo del cronometro

EQU

0x27

; variable para

;==============================================================================
;
VECTORES DE RESET, PGINA Y DE INTERRUPCIN
;==============================================================================
ORG

0x00

;vector de reset (pgina 0

GOTO

main

;va al programa principa

ORG
GOTO

0x04
SUB_INTERRUPCION

)
l
;

;vector de interrupcin
;va al programa de interrupcion

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;SUBRUTI
NA PARA EL MODO CONTADOR CON EL TMR0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MODO_CONTADOR
UNIDADES
;call

ANTI_REBOTE_CONT

movf

TMR0,W

;W=TMR0

movwf
CONT_UNI
;TEMP=W
movlw
LIMITE
;W=10
xorwf
CONT_UNI,W
;W XOR TEMP
btfss
STATUS,Z
;EL resultado de la ante
rior instruccion es 0?
call
VISUALIZA
;Z=0, NO es diferente de
0, TMRO = 0,1,2,3,4,5,6,7,8,9; VISUALIZAMOS LOS DATOS
btfss
STATUS,Z
;EL resultado de la ante
rior instruccion es 0?
goto
UNIDADES
call
CERO_UNI
DECENAS
incf
emento en 1 la decenas
movlw
xorwf
btfss
rior instruccion es 0?
call
btfss
rior instruccion es 0?
goto
call

CONT_DECE,F

;Inicion el incr

LIMITE
CONT_DECE,W
STATUS,Z

; W=10
;W XOR CONT
;EL resultado de la ante

VISUALIZA
STATUS,Z

;EL resultado de la ante

UNIDADES
CERO_DECE

CENTENAS
; Aqui viene las decenas
incf
CONT_CENT,F
emento en 1 la decenas
movlw
LIMITE
xorwf
CONT_CENT,W
btfss
STATUS,Z
rior instruccion es 0?
call
VISUALIZA
btfss
STATUS,Z
rior instruccion es 0?
goto
UNIDADES
call
CERO_CENT
goto

UNIDADES

return
programa principal

;Inicion el incr
; W=10
;W XOR CONT
;EL resultado de la ante
;EL resultado de la ante

; Agregamos la centenas
; Aqui retorna hacia el

;*******************************************************************************
*******
;Subrutinas para el clear (limpiar) de los display luego de pasar el 9
;*******************************************************************************
****
CERO_UNI
clrf
TMR0
;Z=1, SI vale 10, TMRO >
9, TMR0=0
clrf
CONT_UNI
;Temp=0
call
VISUALIZA
return
CERO_DECE
clrf

CONT_DECE

call
return
CERO_CENT
clrf
call
return

VISUALIZA

CONT_CENT
VISUALIZA

;
FIN DE LA SUBRUTINA EN MODO CONTADOR
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;************************************************************
; RUTINA: VISUALIZA_CRONO
; Funcion: Visualiza el tiempo en los displays de 7 segmentos.
;************************************************************
VISUALIZA
;*************************************************************
;Visualizo la miles
movf
CONT_MIL3,W
;Cargar el valor de CONTA en W
call
DISPLAY
;Llama a la tabla _display
movwf
PORTC
;Al retornar de la subrutina el valor de
W se saca
;por el PORTC
bcf
PORTD,5
; enciendo por 4ms el display1
call
delay
bsf
PORTD,5
;*************************************************************
;Visualizo la de cenas de miles
movf
CONT_MIL2,W
;Cargar el valor de CONTA en W
call
DISPLAY
;Llama a la tabla _display
movwf
PORTC
;Al retornar de la subrutina el valor de
W se saca
;por el PORTC
bcf
PORTD,4
; enciendo por 4ms el display1
call
delay
bsf
PORTD,4
;*************************************************************
;Visualizo la centenas demiles
movf
CONT_MIL3,W
;Cargar el valor de CONTA en W
call
DISPLAY
;Llama a la tabla _display
movwf
PORTC
;Al retornar de la subrutina el valor de
W se saca
;por el PORTC
bcf
PORTD,3
; enciendo por 4ms el display1
call
delay
bsf
PORTD,3
;*************************************************************
;Visualizo la unidades
movf
CONT_CENT,W
;Cargar el valor de CONTA en W
call
DISPLAY
;Llama a la tabla _display
movwf
PORTC
;Al retornar de la subrutina el valor de
W se saca
;por el PORTC
bcf
PORTD,2
; enciendo por 4ms el display1
call
delay

bsf

PORTD,2

;*************************************************************
;Visualizo la decenas
movf
CONT_DECE,W
;Cargar el valor de CONTA en W
call
DISPLAY
;Llama a la tabla _display
movwf
PORTC
;Al retornar de la subrutina el valor de
W se saca
;por el PORTC
bcf
PORTD,1
; enciendo por 4ms el display1
call
delay
bsf
PORTD,1
;*************************************************************
;Visualizo la centenas
movf
CONT_UNI,W
;Cargar el valor de CONTA en W
call
DISPLAY
;Llama a la tabla _display
movwf
PORTC
;Al retornar de la subrutina el valor de
W se saca
;por el PORTC
bcf
PORTD,0
; enciendo por 4ms el display1
call
delay
bsf
PORTD,0
return
;*******************************************************************************
*
;
Fin de la Subrutina ROTACION
;*******************************************************************************
*

;*******************************************************************************
;SUBRUTINAS PARA ANTIRREBOTES
;*******************************************************************************
*
;En modo contador
ANTI_REBOTE_CONT
loop
call
TIEMPO_ANTIREBOTE
btfsc
PORTA,4
;Esperamos que se suelte el pulso
goto
loop
return
; En modo cronometro

;*******************************************************************************
***
;-----------------------------------------------------------------------------;
Subrutina que genera un retardo de 1us. con un cristal de cuarzo de 20MH
z. ;-----------------------------------------------------------------------------iDelay1us:
nop
return

;-----------------------------------------------------------------------------;
Subrutina que genera un retardo desde 2.8us. hasta 206us.
;-----------------------------------------------------------------------------;
Si se requiere un tiempo exacto entonces deber ajustar con instrucciones
;
nop's para alcanzar una precisin de +/- 0.2us.
;
Para el clculo de que valor se debe cargar en TEM_US utilice la frmula: ;
TEM_US=(tiempo_deseado-2)/0.8; Recuerde que esta frmula esta diseada pa- ;
ra un cuarzo de 20MHz, con lo cual el mximo error en este retardo ser de ;
+/- 0.4us. cuando se seleccione un tiempo mayor o igual a 10us.
;-----------------------------------------------------------------------------iDelayUs:
RetUs:
nop
decfsz TEMP_US,f
goto
RetUs
call
iDelay1us
return
;-----------------------------------------------------------------------------;
Subrutina que genera un retardo desde 1.0012ms. hasta 255.052ms.
;-----------------------------------------------------------------------------;
Para el clculo de que valor se debe cargar en TEM_MS utilice la frmula: ;
TEM_MS=(tiempo_deseado); Recuerde que esta frmula esta diseada para un - ;

cuarzo de 20MHz, con lo cual el mximo error ser de 0.052ms a los 255ms. ;-----------------------------------------------------------------------------iDelayMs:
RetMs:
movlw
D'248'
movwf
TEMP_US
call
iDelayUs
movlw
D'248'
movwf
TEMP_US
call
iDelayUs
movlw
D'247'
movwf
TEMP_US
call
iDelayUs
movlw
D'247'
movwf
TEMP_US
call
iDelayUs
movlw
D'247'
movwf
TEMP_US
call
iDelayUs
decfsz
TEMP_MS,f
goto
RetMs
return
;-----------------------------------------------------------------------------;
Subrutina que filtra-elimina el ruido producido por rebote de un pulsant
e. ;-----------------------------------------------------------------------------TIEMPO_ANTIREBOTE
movlw
D'10'
movwf
TEMP_MS

call
iDelayMs
return
;-----------------------------------------------------------------------------;-----------------------------------------------------------------------------;
Subrutina para el tiempo de visualizacion de los display
;-----------------------------------------------------------------------------delay
movlw
D'1'
movwf
TEMP_MS
call
iDelayMs
return
;------------------------------------------------------------------------------

;*******************************************************************************
********************
;SUBRUTINA DEL MANEJO DE TABLAS PARA VISUALIZAR LOS DATOS EN EL DISPLAY
;*******************************************************************************
********************
DISPLAY
addwf PCL,f
retlw b'01000000' ;0
retlw b'01111001' ;1
retlw b'00100100' ;2
retlw b'00110000' ;3
retlw b'00011001' ;4
retlw b'00010010' ;5
retlw b'00000010' ;6
retlw b'01111000' ;7
retlw b'00000000' ;8
retlw b'00010000' ;9
;==============================================================================
;
SUBRUTINAS UTILIZADAS POR EL PROGRAMA PRINCIPAL
=
;==============================================================================
;-----------------------------------------------------------------------------;
Subrutina que inicializa variables del programa.
;-----------------------------------------------------------------------------INI_PARAMETROS
;Habilitacin global de interrupciones
bsf
INTCON,GIE
;

Inicializacion
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf

de los parametros para el cronometro


CONT_UNI
;CONT_UNI = 0
CONT_DECE
;CONT_DECE = 0
CONT_CENT
;CONT_CENT = 0
CONT_MIL1
CONT_MIL2
CONT_MIL3
PORTA
;Limpiamos los puertos
PORTB
;PORTB = 0
PORTC
;PORTC = 0
PORTD
;PORTD = 0

return
;-----------------------------------------------------------------------------;
Subrutina que configura puertos y registros de funciones especiales de l
os ;
perifricos del microcontrolador Pic16F877A.
;-----------------------------------------------------------------------------CONF_PERIFERICOS
BSF STATUS,RP0
BCF
STATUS,RP1
;Ir banco 1
movlw

b'00000110'

movwf
movlw
movwf
movlw
movwf
clrf
clrf

ADCON1
0xFF
TRISA
b'11100000'
TRISB
TRISC
TRISD

movlw
movwf

CONF_OPT
OPTION_REG

;CONF_ADCON1 ;PA como entrada di

gital

BCF STATUS,RP0
BCF STATUS,RP1

;PA entrada
;PORTB Entrada y salida
;PORTC saida
;PORTD saida
;Configuracion del TMRO
;Ir banc

o 0
clrf
clrf
clrf
clrf
clrf

TMR0
PORTA
PORTB
PORTC
PORTD

;TMR0=0
;Limpiamos los puertos

return
;==============================================================================
;==============================================================================
;
SUBRUTINA PRINCIPAL (main)
=
;==============================================================================
main
call
call

CONF_PERIFERICOS
INI_PARAMETROS

call
goto bucle
END

MODO_CONTADOR

bucle