You are on page 1of 11

CONVERSOR ANALGICO/DIGITAL

Un conversor, (o convertidor) de seal analgica a digital, (o tambin CAD de


"Conversor Analgico Digital", o ADC del ingls "Analog-to-Digital Converter")
es un dispositivo electrnico capaz de convertir una seal analgica
de voltaje en una seal digital con un valor binario. Se utiliza en equipos
electrnicos como computadora, grabadores de sonido y de vdeo, y equipos
de telecomunicaciones. La seal analgica, que vara de forma continua en el
tiempo, se conecta a la entrada del dispositivo y se somete a un muestreo a
una velocidad fija, obtenindose as una seal digital a la salida del mismo.
CELDAS DE CARGA
Una vez que la galga extensiomtrica es diseada, tiene que ser incorporada al
sistema para su funcionamiento, haciendo que la variable bajo estudio se
convierta en una deformacin mecnica, es decir, la galga es montada en un
elemento elstico dentro del transductor, sometido a una fuerza proporcional a
la variable medida.
La celda de carga utilizada como el sensor de peso, es un transductor que mide
fuerza mecnica y cambia linealmente su salida en un voltaje proporcional a
esta fuerza aplicada. Es acondicionada en unidad de peso, gramos, kilogramos
y toneladas ( libras en el caso de ser hechas en Estados Unidos de Amrica), y
estar midiendo desde cero hasta la capacidad a la que fue hecha. El cuerpo
de la celda

Tabla de Conversin
mV
0
2.450
4.902
7.353
9.802

Conversion de mV/Kgs
Peso (g)
0
250
500
750
1000

Programacion
LIST P=16F877 ; Tipo de procesador
#include p16f877.inc ; Definiciones de registros internos
__config _XT_OSC & _WDT_OFF & _PWRTE_ON &_LVP_OFF
PCL equ 0x02
DATO_H equ 0x20 ; Localidad para almacenamiento de la conversin los 8 bits ms altos
(ADRESH)
DATO_L equ 0x21 ; Almacenamiento de la conversin de los 2 bits MSB de la parte baja
(ADRESL)
CONT1 equ 0x22 ; Retardos para la adquisicin de la conversin analgica a digital.

CONT2 equ 0x23


cuenta equ 0x24
J equ 0x26 ; Contadores para retardos de mandos y datos del LCD.
K equ 0x27
J1 equ 0x28
CONT16 equ 0x32 ; contador para TMR0 con retardo de 1seg.
PESO_HEX equ 0x38 ; se almacena dato de la conversin en hex.
Multiplicando equ 0x39 ; Variable para el multiplicando.
Multiplicador equ 0x3A ; Variable para el multiplicador.
Resultado_H equ 0x3B ; Parte alta del resultado.
Resultado_L equ 0x3C ; Parte baja del resultado.
Estatus_Temp equ 0x3D ; Reg. de estado temporal.
Contador equ 0x3E ; Variable con nmero de veces a operar.
Residuo equ 0x3F ; Variable para guardar residuo de la resta la reg. de tres.
Minuendo equ 0x40 ; Minuendo de la resta para regla de tres.
Sustraendo equ 0x41 ; Variable para guardar el sustraendo de la resta de la reg. de tres.
Resultado2 equ 0x42 ; variable para guardar el resultado de la multiplicacin.
Decimal equ 0x43 ; Variable para guardar los decimales del peso.
PESOC equ 0x4C ; localidad para las centenas del peso
PESOD equ 0x4D ; localidad para las decenas del paso
PESOU equ 0x4E ; localidad para las unidades del peso
BCD_2 equ 0x4F ; Localidades para almacenamiento del resultado de conversin de bin a
; bcd
BCD_1 equ 0x50
BCD_0 equ 0x51
CONT equ 0x52 ; contador para el proceso de la conversin de BIN a BCD
TEMPESO equ 0x53 ; localidad para datos temporales de la conversin del peso
AOS equ 0x54 ; localidades para guardar datos de fecha y tiempo.
conta equ 0x55
DIAS equ 0x56
FECHAS equ 0x57
HORA equ 0x58
MINUTO equ 0x59
MESES equ 0x60
SEGUNDO equ 0x61
TEMP equ 0x62 ; Localidades para guardar datos temporales.
TEMP1 equ 0x63
contg equ 0x64 ; Contador para checar las variables del RTC.
DIREJ equ 0x65 ; Localidad de memoria para direccionar puntero en RTC.
DATEMP equ 0x66 ; Localidad para almacenar un dato temporal que luego va a fecha y
; tiempo.
MAX equ 0x67 ; Localidad de memoria donde se almaceno el valor de 7 das como valor
; mximo.
CIETE7 equ 0x68
DOSE12 equ 0x69
MESE12 equ 0x70
VEITE24 equ 0x71
TREINTA31 equ 0x72
CINCUNTAY9 equ 0x73
NOVENTAY9 equ 0x74
HORA1 equ 0x75
org 0x00 ; Vector de Reset.
goto INICIO ; Brinca a la etiqueta inicio.
org 0x05 ; Salva el vector de interrupcin.
;*******************************************************************
; INICIO DEL PROGRAMA.
;*******************************************************************
INICIO

;*******************************************************************
; CONFIGURACIN DE PUERTOS.
;*******************************************************************
bsf STATUS,5 ; Seleccin del banco 1.
movlw 0x00
movwf PORTB ; Configura puerto B como salida.
Movlw 0xF8
movwf PORTC ; Configura Pines C3 y C4 como entradas para el RTC y C5, C6 Y C7 para
los botones.
Bcf STATUS,5 ; Regresa al banco 0.
;*******************************************************************
; LLAMA RUTINAS DE CONFIGURACIN DE PANTALLA.
;*******************************************************************
call INIT_DISP
call LIMPIA_DISP
call DUAL_LINE
call LIMPIA_DISP
call CLC_CONV ; Configuracin del REG. ADCON1 (config. de las lneas del conv. A/D).
call MENSAJE ; Llama al mensaje Hola Bienvenido.
;*******************************************************************
; MANDA MENSAJE DE BIENVENIDA A LA PANTALLA.
;*******************************************************************
MENSAJE:
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw 'H'
call DATO
movlw 'O'
call DATO
movlw 'L'
call DATO
movlw 'A'
call DATO
call LINEA2 ; Llama rutina para brincar a la segunda lnea.
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw 'B'
call DATO
movlw 'I'
call DATO
movlw 'E'
call DATO
movlw 'N'
call DATO

movlw 'V'
call DATO
movlw 'E'
call DATO
movlw 'N'
call DATO
movlw 'I'
call DATO
movlw 'D'
call DATO
movlw 'O'
call DATO
call RET100
call RET100
call RET100
call RET100
call RET100
call RET100
call RET100
call RET100
call CONFI ; Llama rutina de parmetros para inicializacin del RTC.
;*******************************************************************
; RUTINA DE FUNCIONAMIENTO GENERAL.
;*******************************************************************
BUCLE
call LEE_SENSOR ; No, Se va a leer el sensor.
movlw 0x08 ; Carga el numero 5-9 que es el valor que representa 1Kg.
subwf ADRESH,W ; Resta/compara con ADRESH.
btfsc STATUS,Z ; Son iguales (Z=1)??.
goto NEWPESO ; Si.
btfsc STATUS,C ; No. ADRESH > 5 (C=1)?.
goto NEWPESO ; Si.
call REIREL ; No.
btfsc PORTC,5 ; Checa si el bit 5 = 1 del puerto C.
goto MINUTOS ; Si, se va a modificar datos del reloj.
call MODREC ; Configura PIC en modo de recepcin.
LIM
;CALL CPARO
movlw 00h
call LCDIR ; Direcciona cursor de la pantalla en la posicin h80.
call MOSTRAR ; Muestra en pantalla tiempo y fecha.
btfsc PORTC,6
call CHECA
btfsc PORTC,7
call CHECA1
CHB5
btfsc PORTC,5 ; Checa si el bit 5 = 1 del puerto C.
goto MINUTOS ; Si, se va a modificar datos del reloj.
goto BUCLE ; No, Se va a leer el sensor.
;*******************************************************************
; RUTINA PARA CONFIGURAR AL PIC EN MODO DE RECEPCIN.
;*******************************************************************
MODREC
call CINI ; Llama la rutina para enviar la condicin de inicio de transmisin.
movlw 0xD1 ; Carga la direccin del esclavo (D0 para CI DS1307).
call ENVDATO ; Llama a la rutina para envo de un byte de datos.
LEEOTR
bcf PIR1,3 ; Apaga bit 3 del registro PIR1.

bsf STATUS,5 ; Cambio al banco1.


bcf STATUS,
bsf SSPCON2,3 ; Activacin del modo receptor (RCEN=1).
bcf STATUS,5 ; Regreso al banco 0.
CICLO
btfss PIR1,3 ; Espera que haya terminado la recepcin del dato del RTC.
goto CICLO2
bcf PIR1,3 ; Apaga bit 3 del registro PIR1.
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
bcf SSPCON2,5 ; Limpia el bit ACKDT para transmisin del bit de
reconocimiento.
bsf SSPCON2,4 ; Pone en alto el bit ACKEN para iniciar la secuencia de
generacin de reconocimiento.
bcf STATUS,5 ; Regreso al banco 0.
CICLO3
btfss PIR1,3 ; Checa si el dato que mando el RTC ya fue recibido por el pic.
goto CICLO3 ; Esta checando hasta que se reactiva el dato.
movf SSPBUF,0 ; SSPBUF recibe el dato y lo pasa al registro W.
movwf TEMP ; Guarda el dato en TEMP.
decfsz conta,1
call GUARDAR ; Guarda los cambios en su respectiva variable.
bcf PIR1,3
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
bsf SSPCON2,3 ; Activacin del modo receptor (RCEN=1).
Bcf STATUS,5 ; Regreso al banco 0.
CICLO4
btfss PIR1,3 ; Espera que Haya terminado la operacin.
goto CICLO4
bcf PIR1,3
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,
bsf SSPCON2,5 ; Pone en el alto el bit ACKDT para transmisin del bit de
reconocimiento.
bsf SSPCON2,4 ; Pone en alto el bit ACKEN para iniciar la secuencia de generacin de
reconocimiento.
bcf STATUS,5 ; Regreso al banco 0.
CICLO5
btfss PIR1,3 ; Espera que Haya terminado la operacin.
goto CICLO5
movf SSPBUF,0 ; Leer el registro SSPBUF y pasar le dato al registro W.
call CPARO ; Fin de la transmisin.
goto LIM ; Se va a mostrar los nuevos datos.
;*******************************************************************
; RUTINA PARA ENVIO DE DATOS AL RTC.
;*******************************************************************
GRAVARTC
call CINI ; Llama a la rutina para enviar la condicin de inicio de transmisin.
movlw 0xD0 ; Carga la direccin del esclavo (D0 pra CI DS1307).
call ENVDATO ; Llama a la rutina para envo de un byte de datos.
movlw 0x00 ; Carga la direccin de memoria o donde se va a escribir el dato.
call ENVDATO
movf SEGUNDO,0 ; Carga el dato para inicio de reloj (SEGUNDO).
call ENVDATO
movf MINUTO,0 ; Carga el dato para inicio de reloj (MINUTO).
call ENVDATO
movf HORA,0 ; Carga horas (HORAS).

call ENVDATO
movf DIAS,0 ; Carga da de la semana.
call ENVDATO
movf FECHAS,0 ; Manda da del mes.
call ENVDATO
movf MESES,0 ; Manda mes.
call E NVDATO
movf AOS,0 ; Manda ao.
call ENVDATO
movlw 0x10 ; Configura la lnea de salida (SQW/OUT) de reloj para dar pulso de 1 seg.
call ENVDATO
call CPARO ; Llama a la rutina para enviar la condicin de PARO.
return
;*******************************************************************
; RUTINA PARA ENVO DE CONDICIN DE PARO.
CPARO
bcf PIR1,3
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
bsf SSPCON2,2 ; Pone en alto el bit PEN para la condicin de paro.
bcf STATUS,5 ; Cambia al banco 0.
ESPER2
btfss PIR1,SSPIF ; Espera que halla finalizado la operacin.
goto ESPER2
return
;*******************************************************************
; RUTINA PARA EL ENVIO DE LA CONDICION DE INICIO DE TRANSMISION.
;*******************************************************************
CINI
bcf PIR1,3 ; Limpia la bandera de fin de transmisin de dato (SSPIF).
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
bsf SSPCON2,0 ; Coloca en alto el bit SEN para dar la transicin de inicio.
bcf STATUS,5 ; Regreso al banco 0.
ciclo
btfss PIR1,SSPIF ; Espera que halla terminado la operacin.
goto ciclo
return
;*******************************************************************
; RUTINA PARA ENVIAR DATOS AL RELOJ.
;*******************************************************************
ENVDATO
bcf PIR1,3 ; Limpia la bandera de fin de transmisin.
movwf SSPBUF ; Manda el byte al buffer de salida.
ESPER1
btfss PIR1,3 ; Espera que halla terminado la transmisin del byte.
goto ESPER1
return
;*******************************************************************
; RUTINA PARA MANDAR LOS PARAMETROS DE INICIALIZACIN DEL RTC.
;*******************************************************************
CONFI
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
movlw 0x80
movwf SSPSTAT ; Configuracin de velocidad estndar con nivel I2C.
movlw 0x09
movwf SSPADD ; Velocidad del bus I2C = 100 KHZ.

bcf STATUS,5 ; Regresa al banco 0.


movlw 0x28 ; configuracin del PIC en modo amo.
movwf SSPCON ; Configura las lneas del puerto c, C3 y C4 como SCL Y SDA
respectivamente.
return
;*******************************************************************
; RUTINA PARA APUNTAR A LA LOCALIDAD 0 DEL RELOJ.
;*******************************************************************
REIREL
movlw 0x08
movwf conta ; Guarda en la localidad conta el valor 7 (para leer 7 localidades de reloj).
movlw 0x00
movwf contg ; Carga con 0 el contador para guardar los datos ledos mediante PCL.
call CINI ; Llama a la rutina para enviar la condicin de inicio de transmisin.
movlw 0xD0 ; Carga la direccin del esclavo (D0 PARA CI DS1307).
call ENVDATO ; Llama a la rutina para envo de un byte de datos.
movlw 0x00 ; Carga la direccin de memoria o donde se va escribir el dato.
call ENVDATO
call CPARO
return
;*******************************************************************
; RUTINA PARA GUARDAR LOS DATOS DEL RTC A VARIABLES EN EL PIC.
;*******************************************************************
GUARDAR
movf contg,0 ; Carga w con el valor del contador contg.
addwf PCL,f ; Suma al PCL lo que contiene w.
movf TEMP,0 ; Mueve el contenido de la variable TEMP a W.
movwf SEGUNDO ; Guarda nuevo dato ajustado en SEGUNDO.
movlw 0x05
movwf contg
goto LEEOTR
movf TEMP,0
movwf MINUTO ; Guarda nuevo dato ajustado en MINUTO.
movlw 0x0A
movwf contg
goto LEEOTR
movf TEMP,0
movwf HORA ; Guarda nuevo dato ajustado en HORA.
movlw 0x0F
movwf contg
goto LEEOTR
movf TEMP,0
movwf DIAS ; Guarda nuevo dato ajustado en DIAS.
movlw 0x14
movwf contg
goto LEEOTR
movf TEMP,0
movwf FECHAS ; Guarda nuevo dato ajustado en FECHAS.
movlw 0x19
movwf contg
goto LEEOTR
movf TEMP,0
movwf MESES ; Guarda nuevo dato ajustado en MESES.
movlw 0x1E
movwf contg
goto LEEOTR
movf TEMP,0
movwf AOS ; Guarda nuevo dato ajustado en AOS.

goto LEEOTR
;************************************************************************
; RUTINA PARA MOSTRAR DIA, DIA DEL MES Y EL MES EN LA LCD EN 1erLINEA.
;************************************************************************
MOSTRAR
call DESPDIA ; llamamos rutina para desplegar el da de la semana.
movlw 0x00
addlw 0x8A ; direcciona el cursor en la lnea 1 direccin 10 de la LCD.
call MANDA
movf FECHAS,0 ; movemos lo que hay en fechas a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de fecha digito x digito.
call DESPMES ; llamamos la rutina para desplegar el mes.
call LINEA2 ; rutina para pasar a la segunda lnea de la LCD.
call LCDIR2 ; rutina para que ponga en la lnea 2 posicin 0.
movlw '2'
call DATO
movlw '0'
call DATO
movf AOS,0 ; movemos lo que hay en aos a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato del ao digito x digito.
movlw ' '
call DATO
movf HORA,0 ; movemos lo que hay en hora a W.
movwf DATEMP
btfsc HORA,6
bcf DATEMP,5
bcf DATEMP,6
movf DATEMP,0
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de la hora digito x digito.
movlw ':'
call DATO
movf MINUTO,0 ; movemos lo que hay en minuto a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de los minutos digito x digito.
movlw ':'
call DATO
movf SEGUNDO,0 ; movemos lo que hay en segundos a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de los segundos digito x digito.
btfsc HORA,6
goto MODO12
goto MODO24
MODO12
movlw ' '
call DATO
btfsc HORA,5
goto PM
goto AM
FUERA
return
;*******************************************************************
; RUTINA PARA DESPLEGUE DEL DA DE LA SEMANA.
;*******************************************************************
DESPDIA

movf DIAS,0 ; Pasa el contenido de DIAS a W.


xorlw 0x01 ; Compara si W = 1.
btfsc STATUS,2
call LUNES ; Si, manada mensaje LUNES al LCD.
movf DIAS,0 ; No, sigue comparando para mostrar da correspondiente.
xorlw 0x02
btfsc STATUS,2
call MARTES
movf DIAS,0
xorlw 0x03
btfsc STATUS,2
call MIERCOLES
movf DIAS,0
xorlw 0x04
btfsc STATUS,2
call JUEVES
movf DIAS,0
xorlw 0x05
btfsc STATUS,2
call VIERNES
movf DIAS,0
xorlw 0x06
btfsc STATUS,2
call SABADO
movf DIAS,0
xorlw 0x07
btfsc STATUS,2
call DOMINGO
return
;*******************************************************************
; RUTINAS DE MENSAJES PARA LOS DIAS DE LA SEMANA.
;*******************************************************************
LUNES
movlw 'L'
call DATO
movlw 'U'
call DATO
movlw 'N'
call DATO
movlw 'E'
call DATO
movlw 'S'
call DATO
movlw ' '
call DATO
clrf Resultado_L ; Pone a 0000 el resultado inicial
movlw 0x08
movwf Contador ; Inicia el contador con 8
movlw 0x32
movwf Multiplicando
bcf STATUS,C ; Borra el carry
Bucle
movf Multiplicando,W ; Carga el multiplicando
btfsc Multiplicador,0 ; Es 1 el bit de menos peso del multiplicador ??
addwf Resultado_H,F ; Si, se suma el multiplicando
rrf Resultado_H,F
rrf Resultado_L,F ; Desplazamiento a la derecha del resultado
Rota_sin_Carry

movf STATUS,W
movwf Estatus_Temp ; Salva temporalmente el carry
rrf Multiplicador,F ; Desplaza a la derecha el multiplicador
movf Estatus_Temp,W
movwf STATUS ; Recupera el carry original
decfsz Contador,F ; Repite el bucle 8 veces
goto Bucle
movfw Resultado_H ; Mueve lo que hay en Resultado_H a W
addwf Resultado_L,W ; Suma el Resultado_L (+) W=Resultado_H
movwf Residuo ; El resultado de la suma que en Residuo
movlw 0xFF ; Carga W con 255
subwf Residuo,0 ; Se le resta al resultado alto+el bajo el valor W=255 y resultado=W
btfss STATUS,Z ; checa si Z=1, si si salta goto Rutina
goto Rutina
movwf Residuo ; El resultado de la resta queda en Residuo=0
movf Resultado_H,W
movwf Resultado2 ; Copea lo que esta Resultado_H en Resultado2
incf Resultado2,1 ; Si la resta=0 se incrementa lo que esta en Resultado2 una vez
goto sigue
Rutina
movf Resultado_H,W
movwf Resultado2
movf Residuo,W ; Lo que sobro de la divisin se graba en W
movwf Minuendo ; Minuendo se carga con este valor = W
movlw 0x1A ; Se carga Sustraendo con el valor de 26 para as poder sacar el Decimal
movwf Sustraendo ; que va ha ser el resultado de Minuendo (-) Sustraendo
clrf Decimal ; Se limpia lo que hay en Decimal "por si hay algo"
bcf STATUS,C ; Se limpia el carry = 0 "por si estaba en 1"
Otra
subwf Minuendo,1 ; Se empieza la resta entre el minuendo y el sustraendo=(26)
btfsc STATUS,C ; Checa si el resultado de la resta fue negativa si si salta a sigue
goto In ; Si el resultado fue positivo va a incrementar el contador que va
ha dar el decimal
goto sigue ; Salto a la rutina de sigue que continua con la conversin de
binario a BCD luego a ASSCI
In
incf Decimal,1 ; Incrementa Decimal en 1 indicando que Sustraendo cupo otra
vez en Minuendo
goto Otra ; Se realiza otra vez la resta por si cabe otra vez
sigue
movf Resultado2,w
movlw 3
addwf 0,W
movwf TEMPESO
btfsc TEMPESO,3 ;pregunta si el resultado es mayor que 7
movwf 0
movlw 30
addwf 0,W
movwf TEMPESO
btfsc TEMPESO,7 ;pregunta si el resultado es mayor que 7
movwf 0
retlw 0
return
;*******************************************************************
; RETARDO DE 100mS
;*******************************************************************
RETADQ

movlw 0X01 ; debe ser 0X01 Retardo para la adquisicin de la conversin A/D
ret3
movlw 0x04
movwf CONT2
decf CONT1
ret4
decf CONT2
nop
nop
nop
nop
nop
nop
movf CONT2,1
btfss STATUS,2
goto ret4
movf CONT1,1
btfss STATUS,2
goto ret3
return
RETARDO1:
movlw d'250';
movwf J
jloop1:
movwf K
kloop1:
decfsz K,f
goto kloop1
decfsz J,f
goto jloop1
return
end ; Fin de programa.

You might also like