Está en la página 1de 7

;__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF &


_LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
LIST

P=16F877A

INCLUDE <P16F877A.INC>

CBLOCK 0x0C
Distancia

; Se expresar en centmetros.

;contador
ENDC
;Definimos puertos a utilizar
#DEFINE Disparo PORTA,1

; Disparo para iniciar la medida.

#DEFINE Eco

; Pulso cuya anchura hay que medir.

PORTA,0

#DEFINE PRUEBA PORTB,0


#DEFINE PRUEBA1 PORTB,1
#DEFINE PRUEBA2 PORTB,2
#DEFINE PRUEBA3 PORTB,3
#DEFINE PRUEBA4 PORTB,4
CONF_ADCON1 equ 0X07 ; Configuracion PORTA E/S digital
;damos los limites maximos de las medidas que alanza el sensor
MinimaDistancia

EQU

.3

MaximaDistancia

EQU

.250

;declaramos registros que luego iremos seteando


NUMERO EQU 0x21
CONT EQU 0x22
CONTADOR EQU 0X23
;cargamos el valor de preescales para el timer0 para que cada pulso sea de 60u seg
que biene dado el en el datasheet

TMR0_Carga60micros

EQU

-d'26' ; Valor obtenido experimentalmente con la


; ventana Stopwatch para una interrupcin del

; Timer 0 cada 60 s. Si no mide correctamente por las tolerancias de los


componentes habr
; que hacer un ajuste fino de este valor, comprobndolo sobre las condiciones
reales.

;direciones del programa

ORG

goto

Inicio

ORG

goto

ServicioInterrupcion

ORG 0x05;inicio del codigo

Inicio
bsf STATUS,RP0;bsf-setea el bit- bit set file...pasamos de Banco 0 a Banco 1
; (sirve para configurar como entrada 1 o salida 0)...se carga W en TRISA
movlw b'00000000';declramos los puertos en esta caso b como salida
movwf TRISB
bcf STATUS,RP0
CLRF PORTB
BCF STATUS,RP0 ; Ir banco 1
CLRF PORTA
BSF STATUS,RP0
movlw CONF_ADCON1 ; Configurar el PORTA como digital
movwf ADCON1;registro del de configuracion paca configurar la I/O A/D
movlw b'010000' ; PORTA como entrada
movwf TRISA

bsf

STATUS,RP0;Pasamos al banco 1

bcf

Disparo;aseguramos que los pines inicien en cero

bsf

Eco

movlw

b'00000000'

; Prescaler de 2 para el TMR0.

movwf

OPTION_REG;registro del timer0

bcf

STATUS,RP0;pasmos al banco 0

bcf

Disparo

; Inicializa lnea de disparo en bajo.

;colocamos todos los leds en encendido inicialmente


bsf PRUEBA
bsf PRUEBA1
bsf PRUEBA2
bsf PRUEBA3
bsf PRUEBA4
;colocamos en cero la variable contador
CLRF CONT
Principal

clrf

Distancia

; Inicializa el registro.

clrf CONT;se vuelve a poner en cero el contador dado que aque es donde se
realiza el bucle cerrado
bsf

Disparo

; Comienza el pulso de disparo.

call

Retardo_10micros

; Duracin del pulso dado en el datasheet.

Disparo

; Final del pulso de disparo es decir se pone

bcf
en cero.

Espera_Eco_1
btfss Eco
goto

; Si ECO=0, espera el flanco de subida de la seal

Espera_Eco_1

movlw
flanco de subida.
movwf

; de salida del sensor.

TMR0_Carga60micros
TMR0

; Ingresa cuando ya se ha producido el

; Carga el Timer

movlw

b'10100000'

movwf

INTCON

; Autoriza interrupcin del TMR0

Espera_Eco_0
btfsc Eco
goto

; Espera flanco de bajada de la seal de la salida

Espera_Eco_0

; del SRF04.

clrf
INTCON
Prohbe interrup.

call

; Se ha producido el flanco de bajada.

Retardo_50ms; espera un tiempo para asi tomar una nueva medida

MOVFW CONTADOR;mueve la variable de f al registro w


SUBLW .11
simulando un if

; realiza un resta para luego coprobar el estado

BTFSC STATUS,Z;pregunta el estado de Z para ver se es 0 para apagar el led


correpndiente a esa distancia
BCF PRUEBA;apaga el led
MOVFW CONTADOR;mueve la variable de f al registro w
SUBLW .11
simulando un if

; realiza un resta para luego coprobar el estado

BTFSS STATUS,C;pregunta si el numero ha sido mayor al medido para


encender de nuevo el led dado que no es la distancia que se necesita
BSF PRUEBA

MOVFW CONTADOR;mueve la variable de f al registro w


SUBLW .10
simulando un if

; realiza un resta para luego coprobar el estado

BTFSC STATUS,Z
BCF PRUEBA1
MOVFW CONTADOR;mueve la variable de f al registro w
SUBLW .10
simulando un if
BTFSS STATUS,C

; realiza un resta para luego coprobar el estado

BSF PRUEBA1

MOVFW CONTADOR;mueve la variable de f al registro w


SUBLW .9
simulando un if

; realiza un resta para luego coprobar el estado

BTFSC STATUS,Z
BCF PRUEBA2
MOVFW CONTADOR;mueve la variable de f al registro w
SUBLW .9
simulando un if

; realiza un resta para luego coprobar el estado

BTFSS STATUS,C
BSF PRUEBA2

MOVFW CONTADOR;mueve la variable de f al registro w


SUBLW .8
simulando un if

; realiza un resta para luego coprobar el estado

BTFSC STATUS,Z
BCF PRUEBA3
MOVFW CONTADOR;mueve la variable de f al registro w
SUBLW .8
simulando un if

; realiza un resta para luego coprobar el estado

BTFSS STATUS,C
BSF PRUEBA3

MOVFW CONTADOR;mueve la variable de f al registro w


SUBLW .7
simulando un if

; realiza un resta para luego coprobar el estado

BTFSC STATUS,Z
BCF PRUEBA4
MOVFW CONTADOR;mueve la variable de f al registro w
SUBLW .7
simulando un if

; realiza un resta para luego coprobar el estado

BTFSS STATUS,C
BSF PRUEBA4
;CLRF CONT

Fin

;movlw

.0

;movwf

CONT

goto

; Carga el Timer 0.

Principal

; Se ejecuta debido a la peticin de interrupcin del Timer 0 cada 60 s que es el


incremento
; de la anchura de pulso por centmetro de distancia medido. La variable "Distancia"
contiene el
; valor de la distancia expresada en centmetros.
;
ServicioInterrupcion
movlw

TMR0_Carga60micros

movwf

TMR0;cargamos al timer0

; Carga el Timer 0.

incf CONT,1;incrementa el contador cada vez que entra a timer


movfw CONT
MOVWF CONTADOR;movemos el valor del contador a una nueva variable que
va ir al comparadpr
movlw

.1

; Se utiliza instruccin "addwf", en lugar de

"incf"
addwf Distancia,F
movlw
mximo valor.

; para posicionar flag de Carry.

MaximaDistancia

; En caso de desbordamiento carga su

btfsc STATUS,C
movwf

Distancia

;INCF CONT,1

bcf

INTCON,T0IF;vuelve a setear el timer cero

retfie;retorna de la interupcion

INCLUDE <RETARDOS.INC>

END

También podría gustarte