hola a todos ...
la presente entrada es para "subir" uno de tantos proyectos que he desarrollado.
el siguiente proyecto consiste en una estacion meteorologica inalambrica con codificacion FSK, dentro del codigo solo viene construido para 2 sensores (temperatura-LM35 humedad-HIH4000-001) con su etapa de polarizacion previa, siendo para este caso (debido al uso del microcontrolador PIC16F877A como controlador general) un Vref de 2.5 v para el sensor de temperatura y un Vref de 5v para el de humedad. los controladores son los muy conocidos PIC16F877A operando a 4MHz con osciladores de cristal, el esquematico, archivos , simulaciones y codigos se muestran al final de este texto; cabe mencionar que el proyecto viene provisto de un control remoto con opcion de visualizacion de menu y monitoreo mediante un LCD 16X2, la comunicacion inalambrica se llevo a cabo de unas antenas transmisoras de datos por FSK (HM-TR915/TTL), para el caso del control remoto solo es necesario una bateria de 9v ya que cuenta con un regulador de voltaje que provee la alimentacion necesaria al circuito remoto; par el caso de la estacion base es necesario solo una fuente de 5v de al menos 500mA para suministrar la energia necesaria para el correcto funcionamiento del mismo.
codigo en ASM:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK ;
; ;
; DESARROLLO DE PROYECTOS ITSON TELECOMUNICACIONES II ;
; BY: ING. OSCAR IVAN ALVARADO AGUIRRE ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG 0X3F19
ERRORLEVEL -302
; PC: COMPUTADORA TX Y RX: TRANSCEPTORES FSK
; S1: SENSOR 1 __________
; S2: SENSOR 2 ^^ ^^ | |
; ______ || || | PC |
; | S1 | ____________|| )))) ||____________ |__________|
; |______|________| | --> | | | |
; _| TX | | RX |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\
; | |_____________| |_____________| /_________________ \
; _____________|
; | S2 |
; |______|
;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO RECEPTOR EN EL QUE SOLO SE OCUPARAN LAS
;INTERRUPCIONES DEL PORTB DEL MICROCONTROLADOR UN PUERTO PARA LCD Y EL USART CONFIGURADO A
;9600 BAUDIOS PARA RECIBIR LOS DATOS DE LA ESTACION TRANSMISORA.
CBLOCK 0X20
DATO_S1 ;VALOR DE HUMEDAD
DATO_S2 ;VALOR DE TEMPERATURA
PETICION ;NUMERO DE VECES QUE PEDIRA UNA CONECCION CON EL TRANSMISOR
ESTATUS ;PROTOCOLO
DATO_RECIBIDO ;DATO RECIBIDO POR USART
TEMPORAL ;DATO TEMPORAL PARA OPERACIONES LOGICAS GENERALES
ESTADO_S
VALOR_H
VALOR_T
DATO_ENVIA
ENDC
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INTERRUPCIONES
ORG 0X05
MENSAJES ADDWF PCL,F
MENSAJEFIJO DT " BIENVENIDO ", 0x00;
MENSAJEFIJO0 DT " CONECTANDO.", 0x00;
MENSAJEFIJO1 DT "HUMEDAD RELATIVA", 0x00;
MENSAJEFIJO2 DT "TEMPERATURA ACT.", 0x00;
MENSAJEFIJO3 DT "ERROR DE CONEX. ", 0x00;
MENSAJEFIJO6 DT "ESPERE POR FAVOR", 0x00;
MENSAJEFIJO7 DT "RESETE EL EQUIPO", 0x00;
MENSAJEFIJO8 DT "ENLACE COMPLETO ", 0x00;
FINMENSAJES
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA PRINCIPAL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INICIO
;DECLARAR PUERTOS UTILIZADOS
CLRF PORTE ;RESETEAMOS LOS PUERTOS IN/OUT.
CLRF PORTB
CLRF PORTD
CLRF PORTC
CLRF PORTA
;CONFIGURAR PUERTOS I/O
BSF STATUS,RP0 ; Ir al Banco 1.
MOVLW 0x06 ; Poner el PORTA como señales digitales.
MOVWF ADCON1
CLRF TRISE ;PORTE COMO SALIDA
MOVLW 0XFF
MOVWF TRISB ;CONFIGURACION DEL PUERTO B
CLRF PORTD
CLRF TRISD
BCF OPTION_REG,7;RESISTENCIAS PULL_UP
MOVLW 0X07
MOVWF CMCON
BCF STATUS,RP0 ;Ir al Banco 0.
;LIMPIO LOS PUERTOS CONFIGURADOS
CLRF PORTE ;;RESETEAMOS LOS PUERTOS IN/OUT.
CLRF PORTB
CLRF PORTD
CLRF PORTC
CLRF PORTA
;INICIALIZA EL LCD Y LO PONE EN FUNCIONAMIENTO EN MODO 8 BITS
CLRF PORTD
CALL LCD_INICIALIZA ;INICIALIZA EL LCD.
CALL RETARDO_10MS
;ACTIVACION DEL MODULO SERIAL (USART: 9600 BAUDIOS, 8 BITS, N, 1 BIT PARADA)
BSF STATUS,RP0
MOVLW .25 ;ANTES EN .6 DEBIDO AL OSCILADOR DE 1MHZ
MOVWF SPBRG ; Cargar la Velocidad de Transmisión de Datos.
MOVLW B'00100100'
MOVWF TXSTA ; Configuración de la Transmisión Serie.
BSF PIE1,RCIE
BSF INTCON,PEIE ;CONFIGURO INTERRUPCIONES POR RECEPCION DE DATOS POR USART
BSF INTCON,GIE
BCF STATUS,RP0
MOVLW B'10010000' ;Configurar y lanzar la Recepción Serie CONTINUA
MOVWF RCSTA
CALL RETARDO_500MS
;CONFIGURACION DE INTERRUPCIONES POR CAMBIO DE NIVEL
BSF INTCON,GIE ;HABILITO INTERRUPCIONES GENERALES
BSF INTCON,RBIE ;HABILITO INTERRUPCIONES POR NIVEL EN PUERTO B
BCF INTCON,RBIF ;LIMPIO EL FLAG DE INTERRUPCION PARA NO TENER ERRORES
;CONFIGURA EL NUMERO DE VECES QUE ENVIARA CODIGO DE CONECCION PUNTO A PUNTO
MOVLW .3
MOVWF PETICION
;DESPLIEGA MENSAJE DE " BIENVENIDO "....
MOVLW MENSAJEFIJO
CALL LCD_MENSAJE
CALL RETARDO_1S ;RETARDO DE 2 SEGUNDOS
CALL RETARDO_1S
CALL LCD_BORRA
;DESPLIEGA MENSAJE "CONECTANDO." "ESPERE POR FAVOR"
BUCLE
MOVLW MENSAJEFIJO0 ;Apunta al mensaje fijo y lo visualiza.
CALL LCD_MENSAJE
CALL LCD_LINEA2 ;SALTA DE LINEA DEL LCD
MOVLW MENSAJEFIJO6 ;Apunta al mensaje fijo y lo visualiza.
CALL LCD_MENSAJE
CALL RETARDO_200MS
CALL RETARDO_100MS
MOVLW .13
CALL LCD_POSICIONLINEA1;POSICIONA LA DIRECCION PARA MENSAJE "CONECTANDO.."
MOVLW '.'
CALL LCD_CARACTER
CALL RETARDO_500MS
CALL RETARDO_100MS
MOVLW .14
CALL LCD_POSICIONLINEA1
MOVLW '.'
CALL LCD_CARACTER ;POSICIONA LA DIRECCION PARA MENSAJE "CONECTANDO..."
CALL RETARDO_500MS
CALL RETARDO_100MS
MOVLW .15
CALL LCD_POSICIONLINEA1
MOVLW '.'
CALL RETARDO_1S
;ENVIA PRIMER PETICION....
MOVLW B'10001010' ;SI POR LO QUE CONECTA AL DISPOSITIVO REMOTO
MOVWF TXREG ;Comienzo de la transmisión de datos en Serie.
BSF STATUS,RP0
S2 BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato SINO ESPERA AQUI.
GOTO S2
BCF STATUS,RP0 ;TERMINA DE ENVIAR PETICION....
CALL RETARDO_50MS
;CHECA SI SE REALIZO UNA CONECCION EXITOSA
NOP
BTFSS ESTATUS,2 ;CHEKA SI SE RECIBIO PETICION DE CONECCION EXITOSA....
GOTO DESCONECTADO
GOTO CONECTADO_MODE
;ENVIA MENSAJE "CONECCION FALLIDA"
DESCONECTADO
DECFSZ PETICION,F
GOTO BUCLE
CALL LCD_BORRA
MOVLW MENSAJEFIJO3 ;Apunta al mensaje fijo y lo visualiza.
CALL LCD_MENSAJE
CALL LCD_LINEA2
MOVLW MENSAJEFIJO7 ;Apunta al mensaje fijo y lo visualiza.
CALL LCD_MENSAJE
CALL RETARDO_1S
OSCILA
NOP
GOTO OSCILA
;ENVIA MENSAJE "CONECCION COMPLETA" "ESPERE POR FAVOR"
CONECTADO_MODE
BSF STATUS,RP0
BCF TXSTA,5 ;DESHABILITA LA TRANSMISION POR EL
BCF STATUS,RP0 ;MODULO USART PARA QUE NO SIGUA ENVIANDO ERRORES
CALL LCD_BORRA
MOVLW MENSAJEFIJO8
CALL LCD_MENSAJE
CALL LCD_LINEA2
MOVLW MENSAJEFIJO6
CALL LCD_MENSAJE
CALL RETARDO_1S
;CHECA SI ENTRA EN MODO TEMPERATURA O EN MODO HUMEDAD
CONECTADO
CALL RETARDO_5MS
CALL LCD_BORRA
CALL RETARDO_5MS
BLOCKED_CODE
BTFSS ESTATUS,1 ;CHEKA ESTATUS SI BIT MENU-->1 DESPLIEGA HUMEDAD SINO
GOTO MODE_TEMPERATURA
GOTO MODE_HUMEDAD
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ENTRA A MODO HUMEDAD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MODE_HUMEDAD
CALL LCD_LINEA1
MOVLW MENSAJEFIJO1 ;Apunta al mensaje fijo y lo visualiza.
CALL LCD_MENSAJE ;"HUMEDAD RELATIVA &&& %
;Y VISUALIZA EL VALOR DE HUMEDAD
CALL LCD_LINEA2 ;SENSADO EN LA ULTIMA TRANSFERENCIA DE DATOS
MOVF DATO_S1,W
CALL BIN_A_BCD
MOVF BCD_CENTENAS,W
CALL LCD_BYTE
MOVF BCD_DECENAS,W
CALL LCD_BYTE
MOVF BCD_UNIDADES,W
CALL LCD_BYTE
MOVLW ' '
CALL LCD_CARACTER
CALL RETARDO_5MICROS
MOVLW '%'
CALL LCD_CARACTER
CALL RETARDO_500MS
GOTO BLOCKED_CODE
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ENTRA A MODO TEMPERATURA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MODE_TEMPERATURA
CALL LCD_LINEA1
MOVLW MENSAJEFIJO2 ;Apunta al mensaje fijo y lo visualiza.
CALL LCD_MENSAJE ;"TEMPERATURA ACT. &&& °C
CALL LCD_LINEA2 ;VISUALIZA EL VALOR DE TEMPERATURA
MOVF DATO_S2,W ;MAS ACTUAL SENSADO EN LA ULTIMA
CALL BIN_A_BCD ;TRANSFERENCIA DE DATOS
MOVF BCD_CENTENAS,W
CALL LCD_BYTE
MOVF BCD_DECENAS,W
CALL LCD_BYTE
MOVF BCD_UNIDADES,W
CALL LCD_BYTE
MOVLW '°'
CALL LCD_CARACTER
CALL RETARDO_5MICROS
MOVLW 'C'
CALL LCD_CARACTER
CALL RETARDO_500MS
GOTO BLOCKED_CODE
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INTERRUPCIONES>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INTERRUPCIONES
BTFSS INTCON,RBIF ;CHECO...FUE INTERRUPCION POR CAMBIO DE NIVEL?????? SI ES SI SALTA
GOTO OTRA_INTERRUPCION
BTFSC PORTB,4
GOTO OTRO_PUERTO
BSF ESTATUS,1
GOTO SALIR
OTRO_PUERTO
BTFSS PORTB,4
GOTO OTRO_CAMBIO
BCF ESTATUS,1
GOTO SALIR
OTRO_CAMBIO
BTFSC PORTB,5
GOTO SALIR
BSF ESTATUS,3
SALIR
BCF INTCON,RBIF ;LIMPIO EL FLAG DE INTERRUPCION POR CAMBIO EN RB
RETFIE
OTRA_INTERRUPCION
BTFSS PIR1,RCIF ;Detectamos si ha interrumpido la Recepción Serie.
RETFIE
MOVF RCREG,W ;Cargamos el dato del registro RCREG en el registro DATO.
MOVWF DATO_RECIBIDO
MOVF RCREG,W
MOVWF TEMPORAL
;CHEKA SI ES COMANDO???
MOVLW 0X8A
SUBWF TEMPORAL,W
BTFSS STATUS,Z
GOTO ES_DATO?
BSF ESTATUS,2
RETFIE
ES_DATO?
MOVLW 0XF0
ANDWF TEMPORAL,F
;CHEKA SI ES DATO, SI ES CHEKA CUAL DE TODOS FUE???
MOVLW 0X70
SUBWF TEMPORAL,W
BTFSS STATUS,Z
GOTO NEXT_0
;FUE DATO DE HUMEDAD NIBBLE BAJO
GOTO H_NIBBLE_BAJO
NEXT_0
MOVLW 0X60
SUBWF TEMPORAL,W
BTFSS STATUS,Z
GOTO NEXT_1
;FUE DATO DE HUMEDAD NIBBLE ALTO
GOTO H_NIBBLE_ALTO
NEXT_1
MOVLW 0X50
SUBWF TEMPORAL,W
BTFSS STATUS,Z
GOTO NEXT_2
;FUE DATO DE TEMPERATURA NIBBLE BAJO
GOTO T_NIBBLE_BAJO
NEXT_2
MOVLW 0X40
SUBWF TEMPORAL,W
BTFSS STATUS,Z
GOTO SALIR_INT
;FUE DATO DE TEMPERATURA NIBBLE ALTO
GOTO T_NIBBLE_ALTO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RECIBE HUMEDAD
;SE HA RECIBIDO UN DATO DE HUMEDAD POR LO QUE LO DESEMPAQUETA Y LO GUARDA EN DATO_S1
H_NIBBLE_ALTO
BCF ESTADO_S,0
MOVF DATO_RECIBIDO,W
MOVWF TEMPORAL
MOVLW B'00001111' ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
ANDWF TEMPORAL,F
SWAPF TEMPORAL,F
MOVF TEMPORAL,W
MOVWF VALOR_H ;ANTES ADDWF DATO_S1,F
GOTO SALIR_INT
H_NIBBLE_BAJO
MOVF DATO_RECIBIDO,W
MOVWF TEMPORAL
MOVLW B'00001111' ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
ANDWF TEMPORAL,F
MOVF TEMPORAL,W
ADDWF VALOR_H,F
MOVF VALOR_H,W
MOVWF DATO_S1
BSF ESTADO_S,0
GOTO SALIR_INT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RECIBE TEMPERATURA
;SE HA RECIBIDO UN DATO DE TEMPERATURA POR LO QUE LO DESEMPAQUETA Y LO GUARDA EN DATO_S2
T_NIBBLE_ALTO
BCF ESTADO_S,0
MOVF DATO_RECIBIDO,W
MOVWF TEMPORAL
MOVLW B'00001111' ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
ANDWF TEMPORAL,F
SWAPF TEMPORAL,F
MOVF TEMPORAL,W
MOVWF VALOR_T ;ANTES ADDWF DATO_S2,F
GOTO SALIR_INT
T_NIBBLE_BAJO
MOVF DATO_RECIBIDO,W
MOVWF TEMPORAL
MOVLW B'00001111' ;OBTIENE SOLO EL NIBBLE DEL DATO RECIBIDO
ANDWF TEMPORAL,F
MOVF TEMPORAL,W
ADDWF VALOR_T,F
MOVF VALOR_T,W
MOVWF DATO_S2
GOTO SALIR_INT
SALIR_INT
BCF PIR1,RCIF ;Borrar flag de recepción
RETFIE ;Retorno de Interrupción.
ENVIA_DATO
MOVF DATO_ENVIA,W
MOVWF TXREG ;Comienzo de la transmisión de datos en Serie.
BSF STATUS,RP0
S3 BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato SINO ESPERA AQUI.
GOTO S3
BCF STATUS,RP0 ;TERMINA DE ENVIAR PETICION....
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "LCD_4BIT.INC"
INCLUDE "LCD_MENS.INC"
INCLUDE "RETARDOS.INC"
INCLUDE "BIN_BCD.INC"
END
ahora bien el codigo del transmisor y empaquetador de datos:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK ;
; ;
; DESARROLLO DE PROYECTOS ITSON TELECOMUNICACIONES II ;
; BY: ING. OSCAR IVAN ALVARADO AGUIRRE ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG 0X3F19 ;3F19
ERRORLEVEL -302
; PC: COMPUTADORA TX Y RX: TRANSCEPTORES FSK
; S1: SENSOR 1 __________
; S2: SENSOR 2 ^^ ^^ | |
; ______ || || | PC |
; | S1 | ____________|| )))) ||____________ |__________|
; |______|________| | --> | | | |
; _| TX | | RX |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\
; | |_____________| |_____________| /_________________ \
; _____________|
; | S2 |
; |______|
;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO TRANSMISOR EN EL QUE SOLO SE OCUPARAN LOS
;MODULOS ADC DEL MICROCONTROLADOR Y EL USART CONFIGURADO A 9600 BAUDIOS POR CONVENIENCIA DE TAL
;MANERA QUE EL ADC TENDRA 2 ENTRADAS Y EL USART SOLO SE USARA PARA TRANSMITIR, POSTERIORMENTE
;ANALIZARA EL CODIGO FUENTE PARA EL RECEPTOR .....
CBLOCK 0X20
DATO_H
DATO_L
TEMPORAL
HUMEDAD
TEMPERATURA
ESTATUS
CONVERSION
CONTADOR
DATO_ENVIA
DATO_RECIBIDO
cuenta1
cuenta2
cuenta3
ENDC
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO RSI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PROGRAMA PRINCIPAL (MAIN) DONDE CONFIGURA PUERTOS, LUEGO USART Y ESPERA CONECCION CON REMOTO, UNA VEZ ESTABLECIDA LA CONECCCION
;CONFIGURA ADC_HUMEDAD, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE 1 NIBBLE, DESPUES CAMBIA LA CONFIGURACION PARA
;SENSAR TEMPERATURA, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE NIBBLE, Y SE DEVUELVE A CONFIGURAR EL ASC_HUMEDAD
INICIO
CALL CONF_PTOS ;CONFIGURAMOS LOS PUERTOS
CLRF PORTB ;LIMPIA EL PUERTOB Y
CALL CONF_USART
;CHEKA SI HAY CONECCION ESTABLECIDA CON EL REMOTO....
AQUI BTFSS ESTATUS,7 ;ESTA EL EQUIPO CONECTADO CON EL MODULO INALAMBRICO???
GOTO AQUI ;NO, POR LO QUE NUNCA COMIENZA UNA CONVERSION
;HAY CONECCION SATISFACTORIA ASI QUE COMIENZA CON EL SENSOR 1 Y ENVIA PAQUETES....
CONECTED
BSF PORTC,0
CALL RETARDO_20MS
BCF ESTATUS,6
MOVF PORTB,W
MOVWF TEMPERATURA
CLRF TEMPORAL
CLRF CONVERSION
MOVF TEMPERATURA,W
CALL ENVIA_PAQUETE ;ENVIO EL DATO DE TEMPERATURA
CALL RETARDO_50MS
;TERMINA CON EL SENSOR 1 Y COMIENZA CON EL SENSOR 2 Y ENVIA PAQUETES.....
BCF PORTC,0
BSF ESTATUS,6
MOVF PORTD,W
MOVWF HUMEDAD
CLRF TEMPORAL
CLRF CONVERSION
MOVF HUMEDAD,W
CALL ENVIA_PAQUETE ;ENVIO EL DATO DE TEMPERATURA
CALL RETARDO_50MS
GOTO CONECTED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA DE SERVICIO QUE CONFIFGURA LOS PUERTOS ADECUADAMENTE PARA EL CORRECTO FUNCIONAMIENTO DE LA ESTACION METEREOLOGICA
;
CONF_PTOS
BSF STATUS,RP0 ;BANCO1
CLRF PORTC ;EL PUERTOC
CLRF PORTE
MOVLW 0XFF
MOVWF TRISD
MOVLW 0XFF
MOVWF TRISB
CLRF PORTC ;Y EL PUERTOC
BSF PORTC,7
MOVLW 0X07 ;SELECCIONAMOS EL PRESCALADOR DE 8 (256)
MOVWF CMCON
MOVWF OPTION_REG
BCF STATUS,RP0 ;BANCO0
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SERVICIO DE INTERRUPCIONES (VECTOR DE INTERRUPCION) YA SEA POR USART O POR ADC
RSI
INT_USART?
BTFSS PIR1,RCIF ;Detectamos si ha interrumpido la Recepción Serie.
RETFIE
MOVF RCREG,W ;Cargamos el dato del registro RCREG en el registro DATO.
MOVWF DATO_RECIBIDO
MOVLW B'10001010'
SUBWF DATO_RECIBIDO,W ;EL DATO RECIBIDO FUE COMANDO 0X8A (PETICION DE CONECCION)?????
BTFSS STATUS,Z
GOTO SALIR_INT
MOVLW B'10001010' ;SI POR LO QUE CONECTA AL DISPOSITIVO REMOTO
MOVWF DATO_ENVIA
BSF ESTATUS,7
CALL ENVIA_DATO
GOTO SALIR_INT
SALIR_INT
BCF PIR1,RCIF ;Borrar flag de recepción
RETFIE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONFIGURA EL MODULO USART A 9600 BAUDIOS A 4MHZ EN MODO ASINCRONO DE ALTA VELOCIDAD SIN BIT DE PARADA, 8 BITS DE
;TRANSMISION SOLAMENTE
CONF_USART
BSF STATUS,RP0
MOVLW .25 ;CARGA UN 25 DEBIDO AL OSCILADOR DE 4MHZ PARA 9600BAUDIOS
MOVWF SPBRG ; Cargar la Velocidad de Transmisión de Datos.
MOVLW B'00100100'
MOVWF TXSTA ; Configuración de la Transmisión Serie.;
BSF PIE1,RCIE
BSF INTCON,PEIE
BSF INTCON,GIE
BCF STATUS,RP0
MOVLW B'10010000' ;Configurar y lanzar la Recepción Serie
MOVWF RCSTA
CALL RETARDO_500MS
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE ENVIA UN DATO PREVIAMENTE GUARDADO EN LA VARIABLE DATO_ENVIA POR EL PUERTO USART A 9600 BAUDIOS
;ENVIA UN PAQUETE DE 8 BITS UNICAMENTE
ENVIA_DATO
MOVF DATO_ENVIA,W
MOVWF TXREG ;Comienzo de la transmisión de datos en Serie.
BSF STATUS,RP0
SEG2 BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato.
GOTO SEG2
BCF STATUS,RP0
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE ENVIA PAQUETES DE DATOS DE 1 NIBBLE CADA UNO DEPENDIENDO DEL ESTADO DEL REGISTRO ESTATUS (BIT 6)
ENVIA_PAQUETE
MOVWF CONVERSION
MOVWF TEMPORAL
;CHEKQA SI SE ENVIARA HUMEDAD O TEMPERATURA Y ENVIA LA MITAD SELECCIONADA (SELECTED NIBBLE)
BTFSS ESTATUS,6
GOTO ENVIA_TEMPERATURA
GOTO ENVIA_HUMEDAD
ENVIA_HUMEDAD
MOVLW 0X0F
ANDWF TEMPORAL,F
MOVLW B'01110000' ;(4)-->1 NIBBLE BAJO
ADDWF TEMPORAL,F
MOVF TEMPORAL,W
MOVWF DATO_ENVIA
CALL ENVIA_DATO
;ENVIA LA SEGUNDA PARTE DEL DATO...
MOVLW 0XF0
ANDWF CONVERSION,F
SWAPF CONVERSION,F
MOVLW B'01100000'
ADDWF CONVERSION,F
MOVF CONVERSION,W
MOVWF DATO_ENVIA
CALL ENVIA_DATO
RETURN
ENVIA_TEMPERATURA
MOVLW 0X0F
ANDWF TEMPORAL,F
MOVLW B'01010000'
ADDWF TEMPORAL,F
MOVF TEMPORAL,W
MOVWF DATO_ENVIA
CALL ENVIA_DATO
;ENVIA LA SEGUNDA PARTE DEL DATO...
MOVLW 0XF0
ANDWF CONVERSION,F
SWAPF CONVERSION,F
MOVLW B'01000000'
ADDWF CONVERSION,F
MOVF CONVERSION,W
MOVWF DATO_ENVIA
CALL ENVIA_DATO
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE GENERA UN RETARDO DE 300MS DE PROPOSITO ESPECIFICO EN EL CODIGO
Retardo_300ms
MOVLW .4
MOVWF cuenta3
ciclo3
MOVLW .200
MOVWF cuenta2
ciclo2
MOVLW .100
MOVWF cuenta1
ciclo
DECFSZ cuenta1,F
GOTO ciclo
DECFSZ cuenta2,F
GOTO ciclo2
DECFSZ cuenta3,F
GOTO ciclo3
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "RETARDOS.INC"
END
ahora el codigo al sensor de humedad correspondiente:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK ;
; ;
; DESARROLLO DE PROYECTOS ITSON TELECOMUNICACIONES II ;
; BY: ING. OSCAR IVAN ALVARADO AGUIRRE ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG 0X3F19 ;3F19
ERRORLEVEL -302
; PC: COMPUTADORA TX Y RX: TRANSCEPTORES FSK
; S1: SENSOR 1 __________
; S2: SENSOR 2 ^^ ^^ | |
; ______ || || | PC |
; | S1 | ____________|| )))) ||____________ |__________|
; |______|________| | --> | | | |
; _| TX | | RX |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\
; | |_____________| |_____________| /_________________ \
; _____________|
; | S2 |
; |______|
;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO TRANSMISOR EN EL QUE SOLO SE OCUPARAN LOS
;MODULOS ADC DEL MICROCONTROLADOR Y EL USART CONFIGURADO A 9600 BAUDIOS POR CONVENIENCIA DE TAL
;MANERA QUE EL ADC TENDRA 2 ENTRADAS Y EL USART SOLO SE USARA PARA TRANSMITIR, POSTERIORMENTE
;ANALIZARA EL CODIGO FUENTE PARA EL RECEPTOR .....
CBLOCK 0X20
DATO_H
DATO_L
TEMPORAL
HUMEDAD
TEMPERATURA
ESTATUS
CONVERSION
CONTADOR
DATO_ENVIA
DATO_RECIBIDO
cuenta1
cuenta2
cuenta3
ENDC
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO RSI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PROGRAMA PRINCIPAL (MAIN) DONDE CONFIGURA PUERTOS, LUEGO USART Y ESPERA CONECCION CON REMOTO, UNA VEZ ESTABLECIDA LA CONECCCION
;CONFIGURA ADC_HUMEDAD, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE 1 NIBBLE, DESPUES CAMBIA LA CONFIGURACION PARA
;SENSAR TEMPERATURA, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE NIBBLE, Y SE DEVUELVE A CONFIGURAR EL ASC_HUMEDAD
INICIO
CALL CONF_PTOS ;CONFIGURAMOS LOS PUERTOS
CLRF PORTB ;LIMPIA EL PUERTOB Y
CLRF PORTD
;CHEKA SI HAY CONECCION ESTABLECIDA CON EL REMOTO....
;AQUI BTFSS ESTATUS,7 ;ESTA EL EQUIPO CONECTADO CON EL MODULO INALAMBRICO???
; GOTO AQUI ;NO, POR LO QUE NUNCA COMIENZA UNA CONVERSION
;HAY CONECCION SATISFACTORIA ASI QUE COMIENZA CON EL SENSOR 1 Y ENVIA PAQUETES....
CALL CONF_ADC ;CONFIGURO EL ADC Y LAS INTERUPCIONES POR HUMEDAD
CALL RETARDO_20MICROS;ESPERA TERMINE LA CONVERSION PARA APAGAR EL MODULO DEL ADC
;EMPAQUETA DATOS:
CLRF TEMPORAL
CLRF CONVERSION
MOVF HUMEDAD,W
AKI
CALL RETARDO_500MS
GOTO AKI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA DE SERVICIO QUE CONFIFGURA LOS PUERTOS ADECUADAMENTE PARA EL CORRECTO FUNCIONAMIENTO DE LA ESTACION METEREOLOGICA
;
CONF_PTOS
BSF STATUS,RP0 ;BANCO1
BSF TRISA,0 ;SELECCIÓN DE LA ENTRADA ANALÓGICA
CLRF TRISB ;LIMPIAMOS EL PUERTOB ASÍ COMO
CLRF TRISC ;EL PUERTOC
CLRF TRISE
CLRF TRISD
MOVLW 0X07 ;SELECCIONAMOS EL PRESCALADOR DE 8 (256)
MOVWF CMCON
MOVWF OPTION_REG
BCF STATUS,RP0 ;BANCO0
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONFIGURA EL MODULO ADC PARA SENSAR LA HUMEDAD POR LO QUE VREF+ NO SE ENCUENTRA ACTIVO Y SOLO SE MODIFICA EL PUERTO A
;ELIGIENDO EL CANAL 0 (PORTA,0)
CONF_ADC
BSF STATUS,RP0 ;SELECCIONO EL BANCO1
MOVLW B'00001110' ;CONFIGURO LA ENTRADA A/D Y EL RESULTADO JUSTIFICADO A LA IZQUIERDA
MOVWF ADCON1 ;AN0, AD1:AD7 SIN VREF+ (YA QUE AQUI NO SE USARA)
;HABILITA LAS INTERRUPCIONES A/D SOLO TRABAJA A 8 BITS (REGISTRO ADRESH)
BSF PIE1,ADIE ;SELECCIONA EL BANCO0
BCF STATUS,RP0
MOVLW B'10000001' ;FOSC/32,ENCIENDE A/D,CANAL 0 (AN0)
MOVWF ADCON0
BCF PIR1,ADIF ;LIMPIA LAS BANDERAS A/D
BSF INTCON,PEIE ;HABILITA INTERRUPCIONES PERIFERICAS
BSF INTCON,GIE ;HABILITA TODAS LAS INTERRUPCIONES
NOP
NOP
ESPERA BTFSS INTCON,T0IF
GOTO ESPERA
BSF ADCON0,GO ;COMIENZA LA CONVERSION Y EL BIT ADIF SE PONDRA EN ALTO Y SE BORRARA GO/DONE DESPUES
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SERVICIO DE INTERRUPCIONES (VECTOR DE INTERRUPCION) YA SEA POR USART O POR ADC
RSI
BTFSS PIR1,ADIF ;SE PONDRA EN 1 CUANDO HAYA TERMINADO LA CONVERSIÓN
RETFIE
BCF INTCON,GIE ;SIGUE EN PIE LA CONVERSIÓN
MOVF ADRESH,W ;LE CARGA A W LA PARTE ALTA DE LA CONVERSIÓN
;Y LA MUESTRA POR EL PUERTOB
MOVWF DATO_H
CALL DECODIFICA
BCF PIR1,ADIF ;LIMPIA LA BANDERA PARA ESPERAR OTRA CONVERSIÓN
BSF INTCON,GIE
RETFIE
DECODIFICA
CALL DECODIFICA_HUMEDAD
MOVF HUMEDAD,W
MOVWF PORTD
MOVWF PORTB
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONVIERTE EL VALOR DE HUMEDAD EN PORCENTAJE (%) DE HUMEDAD RELATIVA
DECODIFICA_HUMEDAD
CLRF STATUS
MOVLW 0XC8
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_0
MOVLW .100
MOVWF HUMEDAD
RETURN
RANGO_0
CLRF STATUS
MOVLW 0XC6
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_1
MOVLW .99
MOVWF HUMEDAD
RETURN
ASK_1
CLRF STATUS
MOVLW 0XC5
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_2
MOVLW .98
MOVWF HUMEDAD
RETURN
ASK_2
CLRF STATUS
MOVLW 0XC3
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_3
MOVLW .97
MOVWF HUMEDAD
RETURN
ASK_3
CLRF STATUS
MOVLW 0XC2
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_4
MOVLW .96
MOVWF HUMEDAD
RETURN
ASK_4
CLRF STATUS
MOVLW 0XC0
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_5
MOVLW .95
MOVWF HUMEDAD
RETURN
ASK_5
CLRF STATUS
MOVLW 0XBF
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_6
MOVLW .94
MOVWF HUMEDAD
RETURN
ASK_6
CLRF STATUS
MOVLW 0XBD
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_7
MOVLW .93
MOVWF HUMEDAD
RETURN
ASK_7
CLRF STATUS
MOVLW 0XBB
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_8
MOVLW .92
MOVWF HUMEDAD
RETURN
ASK_8
CLRF STATUS
MOVLW 0XBA
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_9
MOVLW .91
MOVWF HUMEDAD
RETURN
ASK_9
CLRF STATUS
MOVLW 0XB8
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_1
MOVLW .90
MOVWF HUMEDAD
RETURN
;SIGUINETE RANGO DE MEDICIONES-.........
RANGO_1
CLRF STATUS
MOVLW 0XB7
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_10
MOVLW .89
MOVWF HUMEDAD
RETURN
ASK_10
CLRF STATUS
MOVLW 0XB5
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_11
MOVLW .88
MOVWF HUMEDAD
RETURN
ASK_11
CLRF STATUS
MOVLW 0XB4
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_12
MOVLW .87
MOVWF HUMEDAD
RETURN
ASK_12
CLRF STATUS
MOVLW 0XB2
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_13
MOVLW .86
MOVWF HUMEDAD
RETURN
ASK_13
CLRF STATUS
MOVLW 0XB0
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_14
MOVLW .85
MOVWF HUMEDAD
RETURN
ASK_14
CLRF STATUS
MOVLW 0XAF
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_15
MOVLW .84
MOVWF HUMEDAD
RETURN
ASK_15
CLRF STATUS
MOVLW 0XAD
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_16
MOVLW .83
MOVWF HUMEDAD
RETURN
ASK_16
CLRF STATUS
MOVLW 0XAC
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_17
MOVLW .82
MOVWF HUMEDAD
RETURN
ASK_17
CLRF STATUS
MOVLW 0XAA
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_18
MOVLW .81
MOVWF HUMEDAD
RETURN
ASK_18
CLRF STATUS
MOVLW 0XA9
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_2
MOVLW .80
MOVWF HUMEDAD
RETURN
;SIGUINETE RANGO DE MEDICIONES-.........
RANGO_2
CLRF STATUS
MOVLW 0XA7
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_19
MOVLW .79
MOVWF HUMEDAD
RETURN
ASK_19
CLRF STATUS
MOVLW 0XA5
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_20
MOVLW .78
MOVWF HUMEDAD
RETURN
ASK_20
CLRF STATUS
MOVLW 0XA4
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_21
MOVLW .77
MOVWF HUMEDAD
RETURN
ASK_21
CLRF STATUS
MOVLW 0XA2
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_22
MOVLW .76
MOVWF HUMEDAD
RETURN
ASK_22
CLRF STATUS
MOVLW 0XA1
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_23
MOVLW .75
MOVWF HUMEDAD
RETURN
ASK_23
CLRF STATUS
MOVLW 0X9F
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_24
MOVLW .74
MOVWF HUMEDAD
RETURN
ASK_24
CLRF STATUS
MOVLW 0X9E
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_25
MOVLW .73
MOVWF HUMEDAD
RETURN
ASK_25
CLRF STATUS
MOVLW 0X9C
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_26
MOVLW .72
MOVWF HUMEDAD
RETURN
ASK_26
CLRF STATUS
MOVLW 0X9A
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_27
MOVLW .71
MOVWF HUMEDAD
RETURN
ASK_27
CLRF STATUS
MOVLW 0X99
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_3
MOVLW .70
MOVWF HUMEDAD
RETURN
;INICIA EL SIGUIENTE RANGO...
RANGO_3
CLRF STATUS
MOVLW 0X97
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_28
MOVLW .69
MOVWF HUMEDAD
RETURN
ASK_28
CLRF STATUS
MOVLW 0X96
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_29
MOVLW .68
MOVWF HUMEDAD
RETURN
ASK_29
CLRF STATUS
MOVLW 0X94
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_30
MOVLW .67
MOVWF HUMEDAD
RETURN
ASK_30
CLRF STATUS
MOVLW 0X93
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_31
MOVLW .66
MOVWF HUMEDAD
RETURN
ASK_31
CLRF STATUS
MOVLW 0X91
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_32
MOVLW .65
MOVWF HUMEDAD
RETURN
ASK_32
CLRF STATUS
MOVLW 0X8F
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_33
MOVLW .64
MOVWF HUMEDAD
RETURN
ASK_33
CLRF STATUS
MOVLW 0X8E
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_34
MOVLW .63
MOVWF HUMEDAD
RETURN
ASK_34
CLRF STATUS
MOVLW 0X8C
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_35
MOVLW .62
MOVWF HUMEDAD
RETURN
ASK_35
CLRF STATUS
MOVLW 0X8B
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_36
MOVLW .61
MOVWF HUMEDAD
RETURN
ASK_36
CLRF STATUS
MOVLW 0X89
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_4
MOVLW .60
MOVWF HUMEDAD
RETURN
;SIGUINETE RANGO DE MEDICIONES-.........
RANGO_4
CLRF STATUS
MOVLW 0X88
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_37
MOVLW .59
MOVWF HUMEDAD
RETURN
ASK_37
CLRF STATUS
MOVLW 0X86
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_38
MOVLW .58
MOVWF HUMEDAD
RETURN
ASK_38
CLRF STATUS
MOVLW 0X84
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_39
MOVLW .57
MOVWF HUMEDAD
ASK_39
CLRF STATUS
MOVLW 0X83
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_40
MOVLW .56
MOVWF HUMEDAD
RETURN
ASK_40
CLRF STATUS
MOVLW 0X81
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_41
MOVLW .55
MOVWF HUMEDAD
ASK_41
CLRF STATUS
MOVLW 0X80
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_42
MOVLW .54
MOVWF HUMEDAD
RETURN
ASK_42
CLRF STATUS
MOVLW 0X7E
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_43
MOVLW .53
MOVWF HUMEDAD
ASK_43
CLRF STATUS
MOVLW 0X7D
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_44
MOVLW .52
MOVWF HUMEDAD
RETURN
ASK_44
CLRF STATUS
MOVLW 0X7B
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_45
MOVLW .51
MOVWF HUMEDAD
ASK_45
CLRF STATUS
MOVLW 0X79
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_5
MOVLW .50
MOVWF HUMEDAD
RETURN
;SIGUINETE RANGO DE MEDICIONES-........
RANGO_5
CLRF STATUS
MOVLW 0X78
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_46
MOVLW .49
MOVWF HUMEDAD
ASK_46
CLRF STATUS
MOVLW 0X76
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_47
MOVLW .48
MOVWF HUMEDAD
ASK_47
CLRF STATUS
MOVLW 0X75
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_48
MOVLW .47
MOVWF HUMEDAD
ASK_48
CLRF STATUS
MOVLW 0X73
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_49
MOVLW .46
MOVWF HUMEDAD
ASK_49
CLRF STATUS
MOVLW 0X72
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_50
MOVLW .45
MOVWF HUMEDAD
ASK_50
CLRF STATUS
MOVLW 0X70
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_51
MOVLW .44
MOVWF HUMEDAD
RETURN
ASK_51
CLRF STATUS
MOVLW 0X6E
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_52
MOVLW .43
MOVWF HUMEDAD
ASK_52
CLRF STATUS
MOVLW 0X6D
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_53
MOVLW .42
MOVWF HUMEDAD
RETURN
ASK_53
CLRF STATUS
MOVLW 0X6B
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_54
MOVLW .41
MOVWF HUMEDAD
ASK_54
CLRF STATUS
MOVLW 0X6A
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_6 ;,,;,;,;;,ANTES GOTO RANGO_6 PERO COMO SE TRABO CALANDO AVER SI JALA
MOVLW .40
MOVWF HUMEDAD
RETURN
;COMIENZA SIGUIENTE RANGO ......
RANGO_6
CLRF STATUS
MOVLW 0X69
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_55
MOVLW .39
MOVWF HUMEDAD
RETURN
ASK_55
CLRF STATUS
MOVLW 0X68
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_56
MOVLW .38
MOVWF HUMEDAD
RETURN
ASK_56
CLRF STATUS
MOVLW 0X67
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_57
MOVLW .37
MOVWF HUMEDAD
RETURN
ASK_57
CLRF STATUS
MOVLW 0X63
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_58
MOVLW .36
MOVWF HUMEDAD
RETURN
ASK_58
CLRF STATUS
MOVLW 0X62
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_59
MOVLW .35
MOVWF HUMEDAD
RETURN
ASK_59
CLRF STATUS
MOVLW 0X60
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_60
MOVLW .34
MOVWF HUMEDAD
RETURN
ASK_60
CLRF STATUS
MOVLW 0X5F
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_61
MOVLW .33
MOVWF HUMEDAD
RETURN
ASK_61
CLRF STATUS
MOVLW 0X5D
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_62
MOVLW .32
MOVWF HUMEDAD
RETURN
ASK_62
CLRF STATUS
MOVLW 0X5C
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_63
MOVLW .31
MOVWF HUMEDAD
RETURN
ASK_63
CLRF STATUS
MOVLW 0X5A
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_7
MOVLW .30
MOVWF HUMEDAD
RETURN
;COMIENZA SIGUIENTE RANGO....
RANGO_7
CLRF STATUS
MOVLW 0X58
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_64
MOVLW .29
MOVWF HUMEDAD
RETURN
ASK_64
CLRF STATUS
MOVLW 0X57
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_65
MOVLW .28
MOVWF HUMEDAD
RETURN
ASK_65
CLRF STATUS
MOVLW 0X55
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_66
MOVLW .27
MOVWF HUMEDAD
RETURN
ASK_66
CLRF STATUS
MOVLW 0X54
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_67
MOVLW .26
MOVWF HUMEDAD
RETURN
ASK_67
CLRF STATUS
MOVLW 0X52
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_68
MOVLW .25
MOVWF HUMEDAD
RETURN
ASK_68
CLRF STATUS
MOVLW 0X51
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_69
MOVLW .24
MOVWF HUMEDAD
RETURN
ASK_69
CLRF STATUS
MOVLW 0X4F
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_70
MOVLW .23
MOVWF HUMEDAD
RETURN
ASK_70
CLRF STATUS
MOVLW 0X4D
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_71
MOVLW .22
MOVWF HUMEDAD
RETURN
ASK_71
CLRF STATUS
MOVLW 0X4C
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_72
MOVLW .21
MOVWF HUMEDAD
RETURN
ASK_72
CLRF STATUS
MOVLW 0X4A
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_8
MOVLW .20
MOVWF HUMEDAD
RETURN
;COMIENZA EL SIGUIENTE RANGO.....
RANGO_8
CLRF STATUS
MOVLW 0X49
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_73
MOVLW .19
MOVWF HUMEDAD
RETURN
ASK_73
CLRF STATUS
MOVLW 0X47
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_74
MOVLW .18
MOVWF HUMEDAD
RETURN
ASK_74
CLRF STATUS
MOVLW 0X46
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_75
MOVLW .17
MOVWF HUMEDAD
RETURN
ASK_75
CLRF STATUS
MOVLW 0X44
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_76
MOVLW .16
MOVWF HUMEDAD
RETURN
ASK_76
CLRF STATUS
MOVLW 0X42
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_77
MOVLW .15
MOVWF HUMEDAD
RETURN
ASK_77
CLRF STATUS
MOVLW 0X41
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_78
MOVLW .14
MOVWF HUMEDAD
RETURN
ASK_78
CLRF STATUS
MOVLW 0X3F
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_79
MOVLW .13
MOVWF HUMEDAD
RETURN
ASK_79
CLRF STATUS
MOVLW 0X3E
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_80
MOVLW .12
MOVWF HUMEDAD
RETURN
ASK_80
CLRF STATUS
MOVLW 0X3C
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_81
MOVLW .11
MOVWF HUMEDAD
RETURN
ASK_81
CLRF STATUS
MOVLW 0X3B
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO RANGO_9
MOVLW .10
MOVWF HUMEDAD
RETURN
;COMIENZA EL SIHUIENTE RANGO.....
RANGO_9
CLRF STATUS
MOVLW 0X39
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_82
MOVLW .9
MOVWF HUMEDAD
RETURN
ASK_82
CLRF STATUS
MOVLW 0X37
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_83
MOVLW .8
MOVWF HUMEDAD
RETURN
ASK_83
CLRF STATUS
MOVLW 0X36
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_84
MOVLW .7
MOVWF HUMEDAD
RETURN
ASK_84
CLRF STATUS
MOVLW 0X34
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_85
MOVLW .6
MOVWF HUMEDAD
RETURN
ASK_85
CLRF STATUS
MOVLW 0X33
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_86
MOVLW .5
MOVWF HUMEDAD
RETURN
ASK_86
CLRF STATUS
MOVLW 0X31
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_87
MOVLW .4
MOVWF HUMEDAD
RETURN
ASK_87
CLRF STATUS
MOVLW 0X30
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_88
MOVLW .3
MOVWF HUMEDAD
RETURN
ASK_88
CLRF STATUS
MOVLW 0X2E
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO ASK_89
MOVLW .2
MOVWF HUMEDAD
RETURN
ASK_89
CLRF STATUS
MOVLW 0X2C
SUBWF DATO_H,W
BTFSS STATUS,Z
GOTO H_CERO
MOVLW .1
MOVWF HUMEDAD
RETURN
H_CERO
MOVLW .0
MOVWF HUMEDAD
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "RETARDOS.INC"
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ahora el codigo correspondiente para el sensor de temperatura:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ESTACION METEOROLOGICA INALAMBRICA CON CAPACIDAD DE 2 SENSORES MODULANDO EN FSK ;
; ;
; DESARROLLO DE PROYECTOS ITSON TELECOMUNICACIONES II ;
; BY: ING. OSCAR IVAN ALVARADO AGUIRRE ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG 0X3F19 ;3F19
ERRORLEVEL -302
; PC: COMPUTADORA TX Y RX: TRANSCEPTORES FSK
; S1: SENSOR 1 __________
; S2: SENSOR 2 ^^ ^^ | |
; ______ || || | PC |
; | S1 | ____________|| )))) ||____________ |__________|
; |______|________| | --> | | | |
; _| TX | | RX |______/¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\
; | |_____________| |_____________| /_________________ \
; _____________|
; | S2 |
; |______|
;ESTE CODIGO CORRESPONDE AL CODIGO FUENTE DEL MODULO TRANSMISOR EN EL QUE SOLO SE OCUPARAN LOS
;MODULOS ADC DEL MICROCONTROLADOR Y EL USART CONFIGURADO A 9600 BAUDIOS POR CONVENIENCIA DE TAL
;MANERA QUE EL ADC TENDRA 2 ENTRADAS Y EL USART SOLO SE USARA PARA TRANSMITIR, POSTERIORMENTE
;ANALIZARA EL CODIGO FUENTE PARA EL RECEPTOR .....
CBLOCK 0X20
DATO_H
DATO_L
TEMPORAL
HUMEDAD
TEMPERATURA
ESTATUS
CONVERSION
CONTADOR
DATO_ENVIA
DATO_RECIBIDO
cuenta1
cuenta2
cuenta3
ENDC
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO RSI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PROGRAMA PRINCIPAL (MAIN) DONDE CONFIGURA PUERTOS, LUEGO USART Y ESPERA CONECCION CON REMOTO, UNA VEZ ESTABLECIDA LA CONECCCION
;CONFIGURA ADC_HUMEDAD, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE 1 NIBBLE, DESPUES CAMBIA LA CONFIGURACION PARA
;SENSAR TEMPERATURA, CONVIERTE DE ANAL. A DIGITAL Y ENVIA DATO EN PAQUETES DE NIBBLE, Y SE DEVUELVE A CONFIGURAR EL ASC_HUMEDAD
INICIO
CALL CONF_PTOS ;CONFIGURAMOS LOS PUERTOS
CLRF PORTB ;LIMPIA EL PUERTOB Y
CLRF PORTD
;CHEKA SI HAY CONECCION ESTABLECIDA CON EL REMOTO....
;AQUI BTFSS ESTATUS,7 ;ESTA EL EQUIPO CONECTADO CON EL MODULO INALAMBRICO???
; GOTO AQUI ;NO, POR LO QUE NUNCA COMIENZA UNA CONVERSION
AKI
;HAY CONECCION SATISFACTORIA ASI QUE COMIENZA CON EL SENSOR 1 Y ENVIA PAQUETES....
CALL CONF_ADC1 ;CONFIGURO EL ADC Y LAS INTERUPCIONES POR HUMEDAD
CALL RETARDO_20MICROS;ESPERA TERMINE LA CONVERSION PARA APAGAR EL MODULO DEL ADC
;EMPAQUETA DATOS:
CLRF TEMPORAL
CLRF CONVERSION
MOVF TEMPERATURA,W
CALL RETARDO_500MS
GOTO AKI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA DE SERVICIO QUE CONFIFGURA LOS PUERTOS ADECUADAMENTE PARA EL CORRECTO FUNCIONAMIENTO DE LA ESTACION METEREOLOGICA
;
CONF_PTOS
BSF STATUS,RP0 ;BANCO1
BSF TRISA,0 ;SELECCIÓN DE LA ENTRADA ANALÓGICA
CLRF TRISB ;LIMPIAMOS EL PUERTOB ASÍ COMO
CLRF TRISC ;EL PUERTOC
CLRF TRISE
CLRF TRISD
MOVLW 0X07 ;SELECCIONAMOS EL PRESCALADOR DE 8 (256)
MOVWF CMCON
MOVWF OPTION_REG
BCF STATUS,RP0 ;BANCO0
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RUTINA QUE CONFIGURA AL MODULO ADC PARA SENSAR LA TEMPERATURA POR LO QUE VREF+ SE VE ACTIVADO PARA TENER UN MENOR RANGO
;DE CONVERSION Y PODER ASI NO PERDER DATOS EN LA CONVERSION .... ADC POR EL PUERTO A(1)
;con 2,56V +Vref externo
CONF_ADC1
BCF ESTATUS,1 ;PONE AL EQUIPO A CONVERTIR DATOS DE ADC PARA TEMPERATURA SOLAMENTE
BSF STATUS,RP0 ;SELECCIONO EL BANCO1
MOVLW B'00000101' ;CONFIGURO LA ENTRADA A/D Y EL RESULTADO JUSTIFICADO A LA IZQUIERDA
MOVWF ADCON1 ;AN0, AN1, AD2, VREF+, AD4:AD7
;HABILITA LAS INTERRUPCIONES A/D SOLO TRABAJA A 8 BITS (REGISTRO ADRESH)
BSF PIE1,ADIE ;SELECCIONA EL BANCO0
BCF STATUS,RP0
MOVLW B'10001001' ;FOSC/32,ENCIENDE A/D,CANAL 1 (AN1)
MOVWF ADCON0
BCF PIR1,ADIF ;LIMPIA LAS BANDERAS A/D
BSF INTCON,PEIE ;HABILITA INTERRUPCIONES PERIFERICAS
BSF INTCON,GIE ;HABILITA TODAS LAS INTERRUPCIONES
NOP
NOP
ESPERA1 BTFSS INTCON,T0IF
GOTO ESPERA1
BSF ADCON0,GO ;COMIENZA LA CONVERSION Y EL BIT ADIF SE PONDRA EN ALTO Y SE BORRARA GO/DONE DESPUES
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SERVICIO DE INTERRUPCIONES (VECTOR DE INTERRUPCION) YA SEA POR USART O POR ADC
RSI
BTFSS PIR1,ADIF ;SE PONDRA EN 1 CUANDO HAYA TERMINADO LA CONVERSIÓN
RETFIE
BCF INTCON,GIE ;SIGUE EN PIE LA CONVERSIÓN
MOVF ADRESH,W ;LE CARGA A W LA PARTE ALTA DE LA CONVERSIÓN
;Y LA MUESTRA POR EL PUERTOB
MOVWF DATO_H
MOVF DATO_H,W ;RUTINA QUE CONVIERTE EL VALOR DE TEMPERATURA EN GRADOS CENTIGRADOS(°C)
MOVWF TEMPERATURA
MOVF TEMPERATURA,W
MOVWF PORTD
MOVWF PORTB
BCF PIR1,ADIF ;LIMPIA LA BANDERA PARA ESPERAR OTRA CONVERSIÓN
BSF INTCON,GIE
RETFIE
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "RETARDOS.INC"
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
y ahora le toca el turno a las librerias utilizadas en todos los codigos de arriba:
;******************************************** LIBRERÍA "BIN_BCD.INC" **************************************************
; ===================================================================
;;UN NÚMERO BINARIO NATURAL DE 8 BITS ES CONVERTIDO A BCD. EL RESULTADO SE GUARDA EN TRES
; POSICIONES DE MEMORIAS LLAMADAS: BCD_CENTENAS, BCD_DECENAS Y BCD_UNIDADES.
;;EL PROCEDIMIENTO UTILIZADO ES MEDIANTE RESTAS DE 10, TAL COMO SE EXPLICÓ EN EL CAPÍTULO 9.
;;ENTRADA: EN EL REGISTRO W EL NÚMERO BINARIO NATURAL A CONVERTIR.
; SALIDAS: EN (BCD_CENTENAS), (BCD_DECENAS) Y (BCD_UNIDADES).
; EN EL REGISTRO W TAMBIÉN LAS DECENAS (NIBBLE ALTO) Y UNIDADES (NIBBLE BAJO).
;******************************************** SUBRUTINA "BIN_A_BCD" **************************************************
CBLOCK ; EN LAS SUBRUTINAS NO SE DEBE FIJAR LA DIRECCIÓN
BCD_CENTENAS ; DE LA RAM DE USUARIO. SE TOMA A CONTINUACIÓN DE
BCD_DECENAS ; LA ÚLTIMA ASIGNADA.
BCD_UNIDADES
ENDC
BIN_A_BCD CLRF BCD_CENTENAS ; CARGA LOS REGISTROS CON EL RESULTADO INICIAL.
CLRF BCD_DECENAS ; EN PRINCIPIO LAS CENTENAS Y DECENAS A CERO.
MOVWF BCD_UNIDADES ; SE CARGA EL NÚMERO BINARIO A CONVERTIR.
BCD_RESTA10 MOVLW .10 ; A LAS UNIDADES SE LES VA RESTANDO 10 EN CADA
SUBWF BCD_UNIDADES,W ; PASADA. (W)=(BCD_UNIDADES) -10.
BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?, ¿(BCD_UNIDADES)>=10?
GOTO BIN_BCD_FIN ; NO, ES MENOR DE 10. SE ACABÓ.
BCD_INCREMENTADECENAS
MOVWF BCD_UNIDADES ; RECUPERA LO QUE QUEDA POR RESTAR.
INCF BCD_DECENAS,F ; INCREMENTA LAS DECENAS Y COMPRUEBA SI HA
MOVLW .10 ; LLEGADO A 10. LO HACE MEDIANTE UNA RESTA.
SUBWF BCD_DECENAS,W ; (W)=(BCD_DECENAS)-10).
BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?,¿(BCD_DECENAS)>=10?
GOTO BCD_RESTA10 ; NO. VUELVE A DAR OTRA PASADA, RESTÁNDOLE
; 10 A LAS UNIDADES.
BCD_INCREMENTACENTENAS
CLRF BCD_DECENAS ; PONE A CERO LAS DECENAS
INCF BCD_CENTENAS,F ; E INCREMENTA LAS CENTENAS.
GOTO BCD_RESTA10 ; OTRA PASADA: RESTA 10 AL NÚMERO A CONVERTIR.
BIN_BCD_FIN SWAPF BCD_DECENAS,W ; EN EL NIBBLE ALTO DE (W) TAMBIÉN LAS DECENAS.
ADDWF BCD_UNIDADES,W ; EN EL NIBBLE BAJO DE (W) LAS UNIDADES.
RETURN ; VUELVE AL PROGRAMA PRINCIPAL.
otra libreria:......
;**************************** LIBRERÍA "RETARDOS.INC" *********************************
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; LIBRERIA DE RETARDOS DE PROPOSITO GENERAL PARA MICROCONTROLADOR PIC ;
; ;
; DESARROLLO DE PROYECTOS ITSON TELECOMUNICACIONES II ;
; BY: ING. OSCAR IVAN ALVARADO AGUIRRE ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; LIBRERÍA CON MÚLTIPLES SUBRUTINAS DE RETARDOS, DESDE 4 MICROSEGUNDOS HASTA 20 SEGUNDOS.
; ADEMÁS SE PUEDEN IMPLEMENTAR OTRAS SUBRUTINAS MUY FÁCILMENTE.
;
; SE HAN CALCULADO PARA UN SISTEMA MICROCONTROLADOR CON UN PIC TRABAJANDO CON UN CRISTAL
; DE CUARZO A 4 MHZ. COMO CADA CICLO MÁQUINA SON 4 CICLOS DE RELOJ, RESULTA QUE CADA
; CICLO MÁQUINA TARDA 4 X 1/4MHZ = 1 µS.
;
; EN LOS COMENTARIOS, "CM" SIGNIFICA "CICLOS MÁQUINA".
;
; ZONA DE DATOS *********************************************************************
CBLOCK
R_CONTA ; CONTADORES PARA LOS RETARDOS.
R_CONTB
R_CONTC
ENDC
;
; RETARDOS DE 4 HASTA 10 MICROSEGUNDOS ---------------------------------------------------
;
; A CONTINUACIÓN RETARDOS PEQUEÑOS TENIENDO EN CUENTA QUE PARA UNA FRECUENCIA DE 4 MHZ,
; LA LLAMADA A SUBRUTINA "CALL" TARDA 2 CICLOS MÁQUINA, EL RETORNO DE SUBRUTINA
; "RETURN" TOMA OTROS 2 CICLOS MÁQUINA Y CADA INSTRUCCIÓN "NOP" TARDA 1 CICLO MÁQUINA.
;
RETARDO_10MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
RETARDO_5MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
RETARDO_4MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
RETURN ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
; RETARDOS DE 20 HASTA 500 MICROSEGUNDOS ------------------------------------------------
;
RETARDO_500MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
MOVLW D'164' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
GOTO RETARDOMICROS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_200MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
MOVLW D'64' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
GOTO RETARDOMICROS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_100MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'31' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
GOTO RETARDOMICROS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_50MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
NOP ; APORTA 1 CICLO MÁQUINA.
MOVLW D'14' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
GOTO RETARDOMICROS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_20MICROS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'5' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "K".
;
; EL PRÓXIMO BLOQUE "RETARDOMICROS" TARDA:
; 1 + (K-1) + 2 + (K-1)X2 + 2 = (2 + 3K) CICLOS MÁQUINA.
;
RETARDOMICROS
MOVWF R_CONTA ; APORTA 1 CICLO MÁQUINA.
RMICROS_BUCLE
DECFSZ R_CONTA,F ; (K-1)X1 CM (CUANDO NO SALTA) + 2 CM (AL SALTAR).
GOTO RMICROS_BUCLE ; APORTA (K-1)X2 CICLOS MÁQUINA.
RETURN ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
;EN TOTAL ESTAS SUBRUTINAS TARDAN:
; - RETARDO_500MICROS: 2 + 1 + 1 + 2 + (2 + 3K) = 500 CM = 500 µS. (PARA K=164 Y 4 MHZ).
; - RETARDO_200MICROS: 2 + 1 + 1 + 2 + (2 + 3K) = 200 CM = 200 µS. (PARA K= 64 Y 4 MHZ).
; - RETARDO_100MICROS: 2 + 1 + 2 + (2 + 3K) = 100 CM = 100 µS. (PARA K= 31 Y 4 MHZ).
; - RETARDO_50MICROS : 2 + 1 + 1 + 2 + (2 + 3K) = 50 CM = 50 µS. (PARA K= 14 Y 4 MHZ).
; - RETARDO_20MICROS : 2 + 1 + (2 + 3K) = 20 CM = 20 µS. (PARA K= 5 Y 4 MHZ).
;
; RETARDOS DE 1 MS HASTA 200 MS. --------------------------------------------------------
;
RETARDO_200MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'200' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_100MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'100' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_50MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'50' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_20MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'20' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_10MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'10' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_5MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'5' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_2MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'2' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
GOTO RETARDOS_MS ; APORTA 2 CICLOS MÁQUINA.
RETARDO_1MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'1' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "M".
;
; EL PRÓXIMO BLOQUE "RETARDOS_MS" TARDA:
; 1 + M + M + KXM + (K-1)XM + MX2 + (K-1)MX2 + (M-1) + 2 + (M-1)X2 + 2 =
; = (2 + 4M + 4KM) CICLOS MÁQUINA. PARA K=249 Y M=1 SUPONE 1002 CICLOS MÁQUINA
; QUE A 4 MHZ SON 1002 µS = 1 MS.
;
RETARDOS_MS
MOVWF R_CONTB ; APORTA 1 CICLO MÁQUINA.
R1MS_BUCLEEXTERNO
MOVLW D'249' ; APORTA MX1 CICLOS MÁQUINA. ESTE ES EL VALOR DE "K".
MOVWF R_CONTA ; APORTA MX1 CICLOS MÁQUINA.
R1MS_BUCLEINTERNO
NOP ; APORTA KXMX1 CICLOS MÁQUINA.
DECFSZ R_CONTA,F ; (K-1)XMX1 CM (CUANDO NO SALTA) + MX2 CM (AL SALTAR).
GOTO R1MS_BUCLEINTERNO ; APORTA (K-1)XMX2 CICLOS MÁQUINA.
DECFSZ R_CONTB,F ; (M-1)X1 CM (CUANDO NO SALTA) + 2 CM (AL SALTAR).
GOTO R1MS_BUCLEEXTERNO ; APORTA (M-1)X2 CICLOS MÁQUINA.
RETURN ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
;EN TOTAL ESTAS SUBRUTINAS TARDAN:
; - RETARDO_200MS: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 CM = 200 MS. (M=200 Y K=249).
; - RETARDO_100MS: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 CM = 100 MS. (M=100 Y K=249).
; - RETARDO_50MS : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 CM = 50 MS. (M= 50 Y K=249).
; - RETARDO_20MS : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 CM = 20 MS. (M= 20 Y K=249).
; - RETARDO_10MS : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 CM = 10 MS. (M= 10 Y K=249).
; - RETARDO_5MS : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 CM = 5 MS. (M= 5 Y K=249).
; - RETARDO_2MS : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 CM = 2 MS. (M= 2 Y K=249).
; - RETARDO_1MS : 2 + 1 + (2 + 4M + 4KM) = 1005 CM = 1 MS. (M= 1 Y K=249).
;
; RETARDOS DE 0.5 HASTA 20 SEGUNDOS ---------------------------------------------------
;
RETARDO_20S ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'200' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
GOTO RETARDO_1DECIMA ; APORTA 2 CICLOS MÁQUINA.
RETARDO_10S ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'100' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
GOTO RETARDO_1DECIMA ; APORTA 2 CICLOS MÁQUINA.
RETARDO_5S ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'50' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
GOTO RETARDO_1DECIMA ; APORTA 2 CICLOS MÁQUINA.
RETARDO_2S ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'20' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
GOTO RETARDO_1DECIMA ; APORTA 2 CICLOS MÁQUINA.
RETARDO_1S ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'10' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
GOTO RETARDO_1DECIMA ; APORTA 2 CICLOS MÁQUINA.
RETARDO_500MS ; LA LLAMADA "CALL" APORTA 2 CICLOS MÁQUINA.
MOVLW D'5' ; APORTA 1 CICLO MÁQUINA. ESTE ES EL VALOR DE "N".
;
; EL PRÓXIMO BLOQUE "RETARDO_1DECIMA" TARDA:
; 1 + N + N + MXN + MXN + KXMXN + (K-1)XMXN + MXNX2 + (K-1)XMXNX2 +
; + (M-1)XN + NX2 + (M-1)XNX2 + (N-1) + 2 + (N-1)X2 + 2 =
; = (2 + 4M + 4MN + 4KM) CICLOS MÁQUINA. PARA K=249, M=100 Y N=1 SUPONE 100011
; CICLOS MÁQUINA QUE A 4 MHZ SON 100011 µS = 100 MS = 0,1 S = 1 DÉCIMA DE SEGUNDO.
;
RETARDO_1DECIMA
MOVWF R_CONTC ; APORTA 1 CICLO MÁQUINA.
R1DECIMA_BUCLEEXTERNO2
MOVLW D'100' ; APORTA NX1 CICLOS MÁQUINA. ESTE ES EL VALOR DE "M".
MOVWF R_CONTB ; APORTA NX1 CICLOS MÁQUINA.
R1DECIMA_BUCLEEXTERNO
MOVLW D'249' ; APORTA MXNX1 CICLOS MÁQUINA. ESTE ES EL VALOR DE "K".
MOVWF R_CONTA ; APORTA MXNX1 CICLOS MÁQUINA.
R1DECIMA_BUCLEINTERNO
NOP ; APORTA KXMXNX1 CICLOS MÁQUINA.
DECFSZ R_CONTA,F ; (K-1)XMXNX1 CM (SI NO SALTA) + MXNX2 CM (AL SALTAR).
GOTO R1DECIMA_BUCLEINTERNO ; APORTA (K-1)XMXNX2 CICLOS MÁQUINA.
DECFSZ R_CONTB,F ; (M-1)XNX1 CM (CUANDO NO SALTA) + NX2 CM (AL SALTAR).
GOTO R1DECIMA_BUCLEEXTERNO ; APORTA (M-1)XNX2 CICLOS MÁQUINA.
DECFSZ R_CONTC,F ; (N-1)X1 CM (CUANDO NO SALTA) + 2 CM (AL SALTAR).
GOTO R1DECIMA_BUCLEEXTERNO2 ; APORTA (N-1)X2 CICLOS MÁQUINA.
RETURN ; EL SALTO DEL RETORNO APORTA 2 CICLOS MÁQUINA.
;
;EN TOTAL ESTAS SUBRUTINAS TARDAN:
; - RETARDO_20S: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 CM = 20 S.
; (N=200, M=100 Y K=249).
; - RETARDO_10S: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 CM = 10 S.
; (N=100, M=100 Y K=249).
; - RETARDO_5S: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 CM = 5 S.
; (N= 50, M=100 Y K=249).
; - RETARDO_2S: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 CM = 2 S.
; (N= 20, M=100 Y K=249).
; - RETARDO_1S: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 CM = 1 S.
; (N= 10, M=100 Y K=249).
; - RETARDO_500MS: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 CM = 0,5 S.
; (N= 5, M=100 Y K=249).
la libreria de mensajes del LCD:
;******************************************** LIBRERÍA "LCD_MENS.INC" ***********************************************
;;LIBRERÍA DE SUBRUTINAS PARA EL MANEJO DE MENSAJES A VISUALIZAR EN UN VISUALIZADOR LCD.
CBLOCK
LCD_APUNTACARACTER ; INDICA LA POSICIÓN DEL CARÁCTER A VISUALIZAR
; RESPECTO DEL COMIENZO DE TODOS LOS MENSAJES,
; (POSICIÓN DE LA ETIQUETA "MENSAJES").
LCD_VALORCARACTER ; CÓDIGO ASCII DEL CARÁCTER A
ENDC ; VISUALIZAR.
; LOS MENSAJES TIENEN QUE ESTAR SITUADOS DENTRO DE LAS 256 PRIMERAS POSICIONES DE LA
; MEMORIA DE PROGRAMA, ES DECIR, NO PUEDEN SUPERAR LA DIRECCIÓN 0FFH.
; *********************************************SUBRUTINA "LCD_MENSAJE" **********************************************
;;VISUALIZA POR PANTALLA EL MENSAJE APUNTADO POR EL REGISTRO W.
;;LOS MENSAJES DEBEN LOCALIZARSE DENTRO DE UNA ZONA ENCABEZADA POR LA ETIQUETA "MENSAJES" Y QUE
; TENGA LA SIGUIENTE ESTRUCTURA:
;;MENSAJES ADDWF PCL,F ; ¡ETIQUETA OBLIGATORIA!
; MENSAJE0 DT ".. ..", 0X00 ; POSICIÓN INICIAL DEL MENSAJE.
; ; MENSAJE TERMINADO EN 0X00.
; MENSAJE1
; ...
; ...
; FINMENSAJES
;;LA LLAMADA A ESTA SUBRUTINA SE REALIZARÁ SIGUIENDO ESTE EJEMPLO:
;
; MOVLW MENSAJE0 ; CARGA LA POSICIÓN DEL MENSAJE.
; CALL LCD_MENSAJE ; VISUALIZA EL MENSAJE.
;
LCD_MENSAJE
MOVWF LCD_APUNTACARACTER ; POSICIÓN DEL PRIMER CARÁCTER DEL MENSAJE.
MOVLW MENSAJES ; HALLA LA POSICIÓN RELATIVA DEL PRIMER CARÁCTER
SUBWF LCD_APUNTACARACTER,F ; DEL MENSAJE RESPECTO DE ETIQUETA "MENSAJES".
DECF LCD_APUNTACARACTER,F ; COMPENSA LA POSICIÓN QUE OCUPA "ADDWF PCL,F".
LCD_VISUALIZAOTROCARACTER
MOVF LCD_APUNTACARACTER,W
CALL MENSAJES ; OBTIENE EL CÓDIGO ASCII DEL CARÁCTER APUNTADO.
MOVWF LCD_VALORCARACTER ; GUARDA EL VALOR DE CARÁCTER.
MOVF LCD_VALORCARACTER,F ; LO ÚNICO QUE HACE ES POSICIONAR FLAG Z. EN CASO
BTFSC STATUS,Z ; QUE SEA "0X00", QUE ES CÓDIGO INDICADOR FINAL
GOTO LCD_FINMENSAJE ; DE MENSAJE, SALE FUERA.
LCD_NOULTIMOCARACTER
CALL LCD_CARACTER ; VISUALIZA EL CARÁCTER ASCII LEÍDO.
INCF LCD_APUNTACARACTER,F ; APUNTA A LA POSICIÓN DEL SIGUIENTE CARÁCTER
GOTO LCD_VISUALIZAOTROCARACTER ; DENTRO DEL MENSAJE.
LCD_FINMENSAJE
RETURN ; VUELVE AL PROGRAMA PRINCIPAL.
; ******************************* SUBRUTINA "LCD_MENSAJEMOVIMIENTO" ***********************************************
;;VISUALIZA UN MENSAJE DE MAYOR LONGITUD QUE LOS 16 CARACTERES QUE PUEDEN REPRESENTARSE
; EN UNA LÍNEA, POR TANTO SE DESPLAZA A TRAVÉS DE LA PANTALLA.
;;EN EL MENSAJE DEBE DEJARSE 16 ESPACIOS EN BLANCO, AL PRINCIPIO Y AL FINAL PARA
; CONSEGUIR QUE EL DESPLAZAMIENTO DEL MENSAJE SEA LO MÁS LEGIBLE POSIBLE.
;
CBLOCK
LCD_CURSORPOSICION ; CONTABILIZA LA POSICIÓN DEL CURSOR DENTRO DE LA
ENDC ; PANTALLA LCD
LCD_MENSAJEMOVIMIENTO
MOVWF LCD_APUNTACARACTER ; POSICIÓN DEL PRIMER CARÁCTER DEL MENSAJE.
MOVLW MENSAJES ; HALLA LA POSICIÓN RELATIVA DEL PRIMER CARÁCTER
SUBWF LCD_APUNTACARACTER,F ; DEL MENSAJE RESPECTO DE LA ETIQUETA "MENSAJES".
DECF LCD_APUNTACARACTER,F ; COMPENSA LA POSICIÓN QUE OCUPA "ADDWF PCL,F".
LCD_PRIMERAPOSICION
CLRF LCD_CURSORPOSICION ; EL CURSOR EN LA POSICIÓN 0 DE LA LÍNEA.
CALL LCD_BORRA ; SE SITÚA EN LA PRIMERA POSICIÓN DE LA LÍNEA 1 Y
; BORRA LA PANTALLA.
LCD_VISUALIZACARACTER
MOVLW LCD_CARACTERESPORLINEA ; ¿HA LLEGADO A FINAL DE LÍNEA?
SUBWF LCD_CURSORPOSICION,W
BTFSS STATUS,Z
GOTO LCD_NOESFINALLINEA
LCD_ESFINALLINEA
CALL RETARDO_200MS ; LO MANTIENE VISUALIZADO DURANTE ESTE TIEMPO.
; CALL RETARDO_200MS
MOVLW LCD_CARACTERESPORLINEA-1 ; APUNTA A LA POSICIÓN DEL SEGUNDO CARÁCTER
SUBWF LCD_APUNTACARACTER,F ; VISUALIZADO EN PANTALLA, QUE SERÁ EL PRIMERO EN LA
GOTO LCD_PRIMERAPOSICION ; SIGUIENTE VISUALIZACIÓN DE LÍNEA, PARA PRODUCIR EL
; EFECTO DE DESPLAZAMIENTO HACIA LA IZQUIERDA.
LCD_NOESFINALLINEA
MOVF LCD_APUNTACARACTER,W
CALL MENSAJES ; OBTIENE EL ASCII DEL CARÁCTER APUNTADO.
MOVWF LCD_VALORCARACTER ; GUARDA EL VALOR DE CARÁCTER.
MOVF LCD_VALORCARACTER,F ; LO ÚNICO QUE HACE ES POSICIONAR FLAG Z. EN CASO
BTFSC STATUS,Z ; QUE SEA "0X00", QUE ES CÓDIGO INDICADOR FINAL
GOTO LCD_FINMOVIMIENTO ; DE MENSAJE, SALE FUERA.
LCD_NOULTIMOCARACTER2
CALL LCD_CARACTER ; VISUALIZA EL CARÁCTER ASCII LEÍDO.
INCF LCD_CURSORPOSICION,F ; CONTABILIZA EL INCREMENTO DE POSICIÓN DEL
; CURSOR EN LA PANTALLA.
INCF LCD_APUNTACARACTER,F ; APUNTA A LA SIGUIENTE POSICIÓN POR VISUALIZAR.
GOTO LCD_VISUALIZACARACTER ; VUELVE A VISUALIZAR EL SIGUIENTE CARÁCTER
; DE LA LÍNEA.
LCD_FINMOVIMIENTO
RETURN ; VUELVE AL PROGRAMA PRINCIPAL.
libreria del LCD para inicializacion y envio de datos al mismo por un puerto de 4 bits :
;*********************************************** LIBRERÍA "LCD_4BIT.INC" **********************************************
;;ESTAS SUBRUTINAS PERMITEN REALIZAR LAS TAREAS BÁSICAS DE CONTROL DE UN MÓDULO LCD DE 2
; LÍNEAS POR 16 CARACTERES, COMPATIBLE CON EL MODELO LM016L.
;;EL VISUALIZADOR LCD ESTÁ CONECTADO AL PUERTO D DEL PIC MEDIANTE UN BUS DE 4 BITS. LAS
; CONEXIONES SON:
; - LAS 4 LÍNEAS SUPERIORES DEL MÓDULO LCD, PINES <PD7:PD4> SE CONECTAN A LAS 4
; LÍNEAS SUPERIORES DEL PUERTO D DEL PIC, PINES <RD7:RD4>.
; - PIN RS DEL LCD A LA LÍNEA RE0 DEL PIC.
; - PIN R/W DEL LCD A LA LÍNEA RE1 DEL PIC, O A MASA.
; - PIN ENABLE DEL LCD A LA LÍNEA RE2 DEL PIC.
;;SE UTILIZAN LLAMADAS A SUBRUTINAS DE RETARDO DE TIEMPO LOCALIZADAS EN LA LIBRERÍA RETARDOS.INC.
;;***************************************************** REGISTROS *********************************************************
CBLOCK
LCD_DATO
LCD_GUARDADATO
LCD_GUARDATRISB
LCD_AUXILIAR1
LCD_AUXILIAR2
ENDC
;***************************************************** IGUALDADES ********************************************************
LCD_CARACTERESPORLINEA EQU D'16' ; NÚMERO DE CARACTERES POR LÍNEA DE LA PANTALLA.
#DEFINE LCD_PINRS PORTE,0
#DEFINE LCD_PINRW PORTE,1
#DEFINE LCD_PINENABLE PORTE,2
#DEFINE LCD_BUSDATOS PORTD
; ********************************************* SUBRUTINA "LCD_INICIALIZA" **********************************************
; INICIALIZACIÓN DEL MÓDULO LCD: CONFIGURA FUNCIONES DEL LCD, PRODUCE RESET POR SOFTWARE,
; BORRA MEMORIA Y ENCIENDE PANTALLA. EL FABRICANTE ESPECIFICA QUE PARA GARANTIZAR LA
; CONFIGURACIÓN INICIAL HAY QUE HACERLA COMO SIGUE:
;
LCD_INICIALIZA
BSF STATUS,RP0 ; CONFIGURA LAS LÍNEAS CONECTADAS AL PINES RS,
BCF LCD_PINRS ; R/W Y E.
BCF LCD_PINENABLE
BCF LCD_PINRW
BCF STATUS,RP0
BCF LCD_PINRW ; EN CASO DE QUE ESTÉ CONECTADO LE INDICA
; QUE SE VA A ESCRIBIR EN EL LCD.
BCF LCD_PINENABLE ; IMPIDE FUNCIONAMIENTO DEL LCD PONIENDO E=0.
BCF LCD_PINRS ; ACTIVA EL MODO COMANDO PONIENDO RS=0.
CALL RETARDO_200MS ;CALL RETARDO_20MS 100
MOVLW B'00110000'
CALL LCD_ESCRIBELCD ; ESCRIBE EL DATO EN EL LCD.
CALL RETARDO_50MS ;5MS 20
MOVLW B'00110000'
CALL LCD_ESCRIBELCD
CALL RETARDO_20MS ;200MICROS 1MS
MOVLW B'00110000'
CALL LCD_ESCRIBELCD
MOVLW B'00100000' ; INTERFACE DE 4 BITS.
CALL LCD_ESCRIBELCD; AHORA CONFIGURA EL RESTO DE LOS PARÁMETROS:
CALL LCD_2LINEAS4BITS5X7 ; LCD DE 2 LÍNEAS Y CARACTERES DE 5X7 PUNTOS.
CALL LCD_BORRA ; PANTALLA ENCENDIDA Y LIMPIA. CURSOR AL PRINCIPIO
CALL LCD_CURSOROFF ; DE LA LÍNEA 1. CURSOR APAGADO.
CALL LCD_CURSORINCR ; CURSOR EN MODO INCREMENTAR.
RETURN
;***************************************** SUBRUTINA "LCD_ESCRIBELCD" **********************************************
; ENVÍA EL DATO DEL REGISTRO DE TRABAJO W AL BUS DE DATO Y PRODUCE UN PEQUEÑO PULSO EN EL PIN
; ENABLE DEL LCD. PARA NO ALTERAR EL CONTENIDO DE LAS LÍNEAS DE LA PARTE BAJA DEL PUERTO B QUE
; NO SON UTILIZADAS PARA EL LCD (PINES RB3:RB0), PRIMERO SE LEE ESTAS LÍNEAS Y DESPUÉS SE
; VUELVE A ENVIAR ESTE DATO SIN CAMBIARLO.
LCD_ESCRIBELCD
ANDLW B'11110000' ; SE QUEDA CON EL NIBBLE ALTO DEL DATO QUE ES EL
MOVWF LCD_DATO ; QUE HAY QUE ENVIAR Y LO GUARDA.
CALL RETARDO_20MICROS
MOVF LCD_BUSDATOS,W ; LEE LA INFORMACIÓN ACTUAL DE LA PARTE BAJA
ANDLW B'00001111' ; DEL PUERTO B, QUE NO SE DEBE ALTERAR.
IORWF LCD_DATO,F ; ENVIARÁ LA PARTE ALTA DEL DATO DE ENTRADA
; Y EN LA PARTE BAJA LO QUE HABÍA ANTES.
CALL RETARDO_20MICROS
BSF STATUS,RP0 ; ACCESO AL BANCO 1.
MOVF TRISD,W ; GUARDA LA CONFIGURACIÓN QUE TENÍA ANTES TRISB.
MOVWF LCD_GUARDATRISB
;MOVLW B'00001111' ; LAS 4 LÍNEAS INFERIORES DEL PUERTO B SE DEJAN
;ANDWF PORTD,F ; COMO ESTABAN Y LAS 4 SUPERIORES COMO SALIDA.
BCF STATUS,RP0 ; ACCESO AL BANCO 0.
MOVF LCD_DATO,W ; RECUPERA EL DATO A ENVIAR.
MOVWF LCD_BUSDATOS ; ENVÍA EL DATO AL MÓDULO LCD.
CALL RETARDO_20MICROS
BSF LCD_PINENABLE ; PERMITE FUNCIONAMIENTO DEL LCD MEDIANTE UN PEQUEÑO
CALL RETARDO_5MICROS
BCF LCD_PINENABLE ; PULSO Y TERMINA IMPIDIENDO EL FUNCIONAMIENTO DEL LCD.
BSF STATUS,RP0 ; ACCESO AL BANCO 1. RESTAURA EL ANTIGUO VALOR EN
MOVF LCD_GUARDATRISB,W ; LA CONFIGURACIÓN DEL PUERTO B.
MOVWF PORTD ; REALMENTE ES TRISB.
BCF STATUS,RP0 ; ACCESO AL BANCO 0.
RETURN
; *******************************SUBRUTINAS VARIADAS PARA EL CONTROL DEL MÓDULO LCD *******************************
;LOS COMANDOS QUE PUEDEN SER EJECUTADOS SON:
LCD_CURSORINCR
MOVLW B'00000110' ; CURSOR EN MODO INCREMENTAR.
GOTO LCD_ENVIACOMANDO
LCD_LINEA1
MOVLW B'10000000' ; CURSOR AL PRINCIPIO DE LA LÍNEA 1.
GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 00H DE LA DDRAM
LCD_LINEA2
MOVLW B'11000000' ; CURSOR AL PRINCIPIO DE LA LÍNEA 2.
GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 40H DE LA DDRAM
LCD_POSICIONLINEA1
IORLW B'10000000' ; CURSOR A POSICIÓN DE LA LÍNEA 1, A PARTIR DE LA
GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 00H DE LA DDRAM MÁS EL VALOR DEL REGISTRO W.
LCD_POSICIONLINEA2
IORLW B'11000000' ; CURSOR A POSICIÓN DE LA LÍNEA 2, A PARTIR DE LA
GOTO LCD_ENVIACOMANDO ; DIRECCIÓN 40H DE LA DDRAM MÁS EL VALOR DEL REGISTRO W.
LCD_OFF MOVLW B'00001000' ; PANTALLA APAGADA.
GOTO LCD_ENVIACOMANDO
LCD_CURSORON
MOVLW B'00001110' ; PANTALLA ENCENDIDA Y CURSOR ENCENDIDO.
GOTO LCD_ENVIACOMANDO
LCD_CURSOROFF
MOVLW B'00001100' ; PANTALLA ENCENDIDA Y CURSOR APAGADO.
GOTO LCD_ENVIACOMANDO
LCD_BORRA MOVLW B'00000001' ; BORRA TODA LA PANTALLA, MEMORIA DDRAM Y PONE EL
GOTO LCD_ENVIACOMANDO ; CURSOR A PRINCIPIO DE LA LÍNEA 1.
LCD_2LINEAS4BITS5X7
MOVLW B'00101000' ; DEFINE LA PANTALLA DE 2 LÍNEAS, CON CARACTERES
GOTO LCD_ENVIACOMANDO ; DE 5X7 PUNTOS Y CONEXIÓN AL PIC MEDIANTE BUS DE 4 BITS.
; *************************** SUBRUTINAS "LCD_ENVIACOMANDO" Y "LCD_CARACTER" **********************************
; "LCD_ENVIACOMANDO". ESCRIBE UN COMANDO EN EL REGISTRO DEL MÓDULO LCD. LA PALABRA DE
; COMANDO HA SIDO ENTREGADA A TRAVÉS DEL REGISTRO W. TRABAJA EN MODO COMANDO.
; "LCD_CARACTER". ESCRIBE EN LA MEMORIA DDRAM DEL LCD EL CARÁCTER ASCII INTRODUCIDO A
; A TRAVÉS DEL REGISTRO W. TRABAJA EN MODO DATO.
LCD_ENVIACOMANDO
BCF LCD_PINRS ; ACTIVA EL MODO COMANDO, PONIENDO RS=0.
GOTO LCD_ENVIA
LCD_CARACTER
BSF LCD_PINRS ; ACTIVA EL "MODO DATO", PONIENDO RS=1.
CALL LCD_CODIGOCGROM ; OBTIENE EL CÓDIGO PARA CORRECTA VISUALIZACIÓN.
LCD_ENVIA MOVWF LCD_GUARDADATO ; GUARDA EL DATO A ENVIAR.
CALL LCD_ESCRIBELCD ; PRIMERO ENVÍA EL NIBBLE ALTO.
SWAPF LCD_GUARDADATO,W ; AHORA ENVÍA EL NIBBLE BAJO. PARA ELLO PASA EL
; NIBBLE BAJO DEL DATO A ENVIAR A PARTE ALTA DEL BYTE.
CALL LCD_ESCRIBELCD ; SE ENVÍA AL VISUALIZADOR LCD.
BTFSS LCD_PINRS ; DEBE GARANTIZAR UNA CORRECTA ESCRITURA
CALL RETARDO_10MS;2MS ; MANTENIENDO 2 MS EN MODO COMANDO >>>ANTES ESTAVA EN 10MS<<<<
CALL RETARDO_10MS ; Y 50 µS EN MODO CARÁCTER. >>>>ANTES EN 200MICROS<<<<<
RETURN
;************************************** SUBRUTINA "LCD_CODIGOCGROM **********************************************
; A PARTIR DEL CARÁCTER ASCII NÚMERO 127 LOS CÓDIGOS DE LOS CARACTERES DEFINIDOS EN LA
; TABLA CGROM DEL LM016L NO COINCIDEN CON LOS CÓDIGOS ASCII. ASÍ POR EJEMPLO, EL CÓDIGO
; ASCII DE LA "Ñ" EN LA TABLA CGRAM DEL LM016L ES EEH.
;;
;ESTA SUBRUTINA CONVIERTE LOS CÓDIGOS ASCII DE LA "Ñ", "º" Y OTROS, A CÓDIGOS CGROM PARA QUE
; QUE PUEDAN SER VISUALIZADO EN EL MÓDULO LM016L.
;
; ENTRADA: EN (W) EL CÓDIGO ASCII DEL CARÁCTER QUE SE DESEA VISUALIZAR.
; SALIDA: EN (W) EL CÓDIGO DEFINIDO EN LA TABLA CGROM.
LCD_CODIGOCGROM
MOVWF LCD_DATO ; GUARDA EL VALOR DEL CARÁCTER Y COMPRUEBA SI ES UN CARÁCTER ESPECIAL.
LCD_ENHEMINUSCULA
SUBLW 'Ñ' ; ¿ES LA "Ñ"?
BTFSS STATUS,Z
GOTO LCD_ENHEMAYUSCULA ; NO ES "Ñ".
MOVLW B'11101110' ; CÓDIGO CGROM DE LA "Ñ".
MOVWF LCD_DATO
GOTO LCD_FINCGROM
LCD_ENHEMAYUSCULA
MOVF LCD_DATO,W ; RECUPERA EL CÓDIGO ASCII DE ENTRADA.
SUBLW 'Ñ' ; ¿ES LA "Ñ"?
BTFSS STATUS,Z
GOTO LCD_GRADO ; NO ES "Ñ".
MOVLW B'11101110' ; CÓDIGO CGROM DE LA "Ñ". (NO HAY SÍMBOLO PARA
MOVWF LCD_DATO ; LA "Ñ" MAYÚSCULA EN LA CGROM).
GOTO LCD_FINCGROM
LCD_GRADO MOVF LCD_DATO,W ; RECUPERA EL CÓDIGO ASCII DE ENTRADA.
SUBLW '°' ; ¿ES EL SÍMBOLO "º"?
BTFSS STATUS,Z
GOTO LCD_FINCGROM ; NO ES "º".
MOVLW B'11011111' ; CÓDIGO CGROM DEL SÍMBOLO "º".
MOVWF LCD_DATO
LCD_FINCGROM
MOVF LCD_DATO,W ; EN (W) EL CÓDIGO BUSCADO.
RETURN
; ************************* SUBRUTINA "LCD_DOSESPACIOSBLANCOS" Y "LCD_LINEABLANCO" **************************
; VISUALIZA ESPACIOS EN BLANCO.
LCD_LINEAENBLANCO
MOVLW LCD_CARACTERESPORLINEA
GOTO LCD_ENVIABLANCOS
LCD_UNESPACIOBLANCO
MOVLW .1
GOTO LCD_ENVIABLANCOS
LCD_DOSESPACIOSBLANCOS
MOVLW .2
GOTO LCD_ENVIABLANCOS
LCD_TRESESPACIOSBLANCOS
MOVLW .3
LCD_ENVIABLANCOS
MOVWF LCD_AUXILIAR1 ; (LCD_AUXILIAR1) SE UTILIZA COMO CONTADOR.
LCD_ENVIAOTROBLANCO
MOVLW ' ' ; ESTO ES UN ESPACIO EN BLANCO.
CALL LCD_CARACTER ; VISUALIZA TANTO ESPACIOS EN BLANCO COMO
DECFSZ LCD_AUXILIAR1,F ; SE HAYA CARGADO EN (LCD_AUXILIAR1).
GOTO LCD_ENVIAOTROBLANCO
RETURN
; **************************** SUBRUTINAS "LCD_BYTECOMPLETO" Y "LCD_BYTE" ***************************************
; SUBRUTINA "LCD_BYTECOMPLETO", VISUALIZA EL BYTE QUE ALMACENA EL REGISTRO W EN EL
; LUGAR ACTUAL DE LA PANTALLA. POR EJEMPLO, SI (W)=B'10101110' VISUALIZA "AE".
;;SUBRUTINA "LCD_BYTE" IGUAL QUE LA ANTERIOR, PERO EN CASO DE QUE EL NIBBLE ALTO SEA CERO
; VISUALIZA EN SU LUGAR UN ESPACIO EN BLANCO. POR EJEMPLO SI (W)=B'10101110' VISUALIZA "AE"
; Y SI (W)=B'00001110', VISUALIZA " E" (UN ESPACIO BLANCO DELANTE).
;;UTILIZAN LA SUBRUTINA "LCD_NIBBLE" QUE SE ANALIZA MÁS ADELANTE.
LCD_BYTE MOVWF LCD_AUXILIAR2 ; GUARDA EL VALOR DE ENTRADA.
ANDLW B'11110000' ; ANALIZA SI EL NIBBLE ALTO ES CERO.
BTFSS STATUS,Z ; SI ES CERO LO APAGA.
GOTO LCD_VISUALIZAALTO ; NO ES CERO Y LO VISUALIZA.
MOVLW ' ' ; VISUALIZA UN ESPACIO EN BLANCO.
CALL LCD_CARACTER
GOTO LCD_VISUALIZABAJO
LCD_BYTECOMPLETO
MOVWF LCD_AUXILIAR2 ; GUARDA EL VALOR DE ENTRADA.
LCD_VISUALIZAALTO
SWAPF LCD_AUXILIAR2,W ; PONE EL NIBBLE ALTO EN LA PARTE BAJA.
CALL LCD_NIBBLE ; LO VISUALIZA.
LCD_VISUALIZABAJO
MOVF LCD_AUXILIAR2,W ; REPITE EL PROCESO CON EL NIBBLE BAJO.
CALL LCD_NIBBLE ; LO VISUALIZA.
RETURN
; **************************************** SUBRUTINA "LCD_NIBBLE" *****************************************************
; VISUALIZA EN EL LUGAR ACTUAL DE LA PANTALLA, EL VALOR HEXADECIMAL QUE ALMACENA EN EL NIBBLE
; BAJO DEL REGISTRO W. EL NIBBLE ALTO DE W NO ES TENIDO EN CUENTA. EJEMPLOS:
; - SI (W)=B'01010110', SE VISUALIZARÁ "6".
; - SI (W)=B'10101110', SE VISUALIZARÁ "E".
LCD_NIBBLE
ANDLW B'00001111' ; SE QUEDA CON LA PARTE BAJA.
MOVWF LCD_AUXILIAR1 ; LO GUARDA.
SUBLW 0X09 ; COMPRUEBA SI HAY QUE REPRESENTARLO CON
BTFSS STATUS,C ; LETRA.
GOTO LCD_ENVIABYTELETRA
MOVF LCD_AUXILIAR1,W
ADDLW '0' ; EL NÚMERO SE PASA A CARÁCTER ASCII
GOTO LCD_FINVISUALIZADIGITO; SUMÁNDOLE EL ASCII DEL CERO Y LO VISUALIZA.
LCD_ENVIABYTELETRA
MOVF LCD_AUXILIAR1,W
ADDLW 'A'-0X0A ; SÍ, POR TANTO, SE LE SUMA EL ASCII DE LA 'A'.
LCD_FINVISUALIZADIGITO
GOTO LCD_CARACTER ; Y VISUALIZA EL CARÁCTER. SE HACE CON UN "GOTO"
; PARA NO SOBRECARGAR LA PILA.
libreria que convierte un dato binario a BCD
;******************************************** LIBRERÍA "BIN_BCD.INC" **************************************************
; ===================================================================
;;UN NÚMERO BINARIO NATURAL DE 8 BITS ES CONVERTIDO A BCD. EL RESULTADO SE GUARDA EN TRES
; POSICIONES DE MEMORIAS LLAMADAS: BCD_CENTENAS, BCD_DECENAS Y BCD_UNIDADES.
;;EL PROCEDIMIENTO UTILIZADO ES MEDIANTE RESTAS DE 10, TAL COMO SE EXPLICÓ EN EL CAPÍTULO 9.
;;ENTRADA: EN EL REGISTRO W EL NÚMERO BINARIO NATURAL A CONVERTIR.
; SALIDAS: EN (BCD_CENTENAS), (BCD_DECENAS) Y (BCD_UNIDADES).
; EN EL REGISTRO W TAMBIÉN LAS DECENAS (NIBBLE ALTO) Y UNIDADES (NIBBLE BAJO).
;******************************************** SUBRUTINA "BIN_A_BCD" **************************************************
CBLOCK ; EN LAS SUBRUTINAS NO SE DEBE FIJAR LA DIRECCIÓN
BCD_CENTENAS ; DE LA RAM DE USUARIO. SE TOMA A CONTINUACIÓN DE
BCD_DECENAS ; LA ÚLTIMA ASIGNADA.
BCD_UNIDADES
ENDC
BIN_A_BCD CLRF BCD_CENTENAS ; CARGA LOS REGISTROS CON EL RESULTADO INICIAL.
CLRF BCD_DECENAS ; EN PRINCIPIO LAS CENTENAS Y DECENAS A CERO.
MOVWF BCD_UNIDADES ; SE CARGA EL NÚMERO BINARIO A CONVERTIR.
BCD_RESTA10 MOVLW .10 ; A LAS UNIDADES SE LES VA RESTANDO 10 EN CADA
SUBWF BCD_UNIDADES,W ; PASADA. (W)=(BCD_UNIDADES) -10.
BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?, ¿(BCD_UNIDADES)>=10?
GOTO BIN_BCD_FIN ; NO, ES MENOR DE 10. SE ACABÓ.
BCD_INCREMENTADECENAS
MOVWF BCD_UNIDADES ; RECUPERA LO QUE QUEDA POR RESTAR.
INCF BCD_DECENAS,F ; INCREMENTA LAS DECENAS Y COMPRUEBA SI HA
MOVLW .10 ; LLEGADO A 10. LO HACE MEDIANTE UNA RESTA.
SUBWF BCD_DECENAS,W ; (W)=(BCD_DECENAS)-10).
BTFSS STATUS,C ; ¿C = 1?, ¿(W) POSITIVO?,¿(BCD_DECENAS)>=10?
GOTO BCD_RESTA10 ; NO. VUELVE A DAR OTRA PASADA, RESTÁNDOLE
; 10 A LAS UNIDADES.
BCD_INCREMENTACENTENAS
CLRF BCD_DECENAS ; PONE A CERO LAS DECENAS
INCF BCD_CENTENAS,F ; E INCREMENTA LAS CENTENAS.
GOTO BCD_RESTA10 ; OTRA PASADA: RESTA 10 AL NÚMERO A CONVERTIR.
BIN_BCD_FIN SWAPF BCD_DECENAS,W ; EN EL NIBBLE ALTO DE (W) TAMBIÉN LAS DECENAS.
ADDWF BCD_UNIDADES,W ; EN EL NIBBLE BAJO DE (W) LAS UNIDADES.
RETURN ; VUELVE AL PROGRAMA PRINCIPAL.
ahora bien es el turno de las imagenes, esquematico y diagrama de coneccion:
la verdad no se subir archivos aun, asi que tendran que compilar todos y cada uno de los archivos en su compilador (yo use el MPLAB de la Microchip) sin mas por el momento les dejo si veo que me hace falta algo le estare agregando lo faltante poco a poco ya que es mucho lo que incluye este proyecto.
asta pronto...
atte.
Ing. Oscar Ivan Alvarado Aguirre

No hay comentarios:
Publicar un comentario