Tengo este código funcionando, es para que un sensor ultrasonico muestre la distancia en una lcd, pero ahora necesito enviar el dato al pc, tengo la rutina de comunicación rs232 pero no se que debo meter en el codigo para enviar la variable distancia al pc.
#include "p16F887.inc"
; CONFIG1
; __config 0xEFE1
__CONFIG _CONFIG1, _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
; CONFIG2
; __config 0xFFFF
__CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF
CBLOCK 0x23
Distancia ; Se expresará en centímetros.
CONTA
PDel0
PDel1
CONTA2
CONTA1
XCOUNT
RCVREG
RCOUNT
XMTREG
ENDC
#DEFINE Disparo PORTA,3 ; Disparo para iniciar la medida.
#DEFINE Eco PORTA,4 ; Pulso cuya anchura hay que medir.
MIN_DISTANCIA EQU .3
MAX_DISTANCIA EQU .250
TMR0_Carga60micros EQU d'256'-d'27'; Valor obtenido experimentalmente con la
; ventana Stopwatch para una interrupción 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, comprobándolo sobre las condiciones reales.
;
; ZONA DE CÓDIGOS ********************************************************************
ORG 0X00
goto Inicio
ORG 0X04
goto ServicioInterrupcion
Mensajes
addwf PCL,F
MensajeDistancia
DT " Distancia: ", 0x00
MensajeCentimetro
DT " cm", 0x00
MensajeDistanciaMenor
DT "Dist. MENOR de:", 0x00
MensajeDistanciaMayor
DT "Dist. MAYOR de:", 0x00
Inicio
banksel TRISA ;Pasamos al banco 1
MOVLW B'00010000' ; RA4 COMO ENTRADA
MOVWF TRISA
CLRF TRISB ;configura PORTB todo como salida
MOVLW B'10000000'
MOVWF TRISC
banksel ANSELH ;volvemos al banco 0
CLRF ANSELH ;ENTRADAS DIGITALES
CLRF ANSEL
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
CLRF PORTD
call LCD_Inicializa
bsf STATUS,RP0
bcf Disparo
bsf Eco
movlw b'00000000' ; Prescaler de 2 para el TMR0.
movwf OPTION_REG
bcf STATUS,RP0
bcf Disparo ; Inicializa línea de disparo en bajo.
Principal
clrf Distancia ; Inicializa el registro.
bsf Disparo ; Comienza el pulso de disparo.
call Retardo_20micros ; Duración del pulso.
bcf Disparo ; Final del pulso de disparo.
Espera_Eco_1
btfss Eco ; Si ECO=0, espera el flanco de subida de la señal
goto Espera_Eco_1 ; de salida del sensor.
movlw TMR0_Carga60micros ; Ya se ha producido el flanco de subida.
movwf TMR0 ; Carga el Timer 0.
movlw b'10100000' ; Autoriza interrupción del TMR0 (T0IE).
movwf INTCON
Espera_Eco_0
btfsc Eco ; Espera flanco de bajada de la señal de la salida
goto Espera_Eco_0 ; del SRF04.
clrf INTCON ; Se ha producido el flanco de bajada. Prohíbe interrup.
call Visualiza ; Visualiza la distancia.
call RS232_Inicializa
movwf BCD_Unidades
call RS232_EnviaDato
call Retardo_2s ; Espera un tiempo hasta la próxima medid
Fin goto Principal
; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Se ejecuta debido a la petición de interrupción del Timer 0 cada 60 µs que es el incremento
; de la anchura de pulso por centímetro de distancia medido. La variable "Distancia" contiene el
; valor de la distancia expresada en centímetros.
;
ServicioInterrupcion
movlw TMR0_Carga60micros ; Carga el Timer 0.
movwf TMR0
movlw .1 ; Se utiliza instrucción "addwf", en lugar de "incf"
addwf Distancia,F ; para posicionar flag de Carry.
movlw MAX_DISTANCIA ; En caso de desbordamiento carga su máximo valor.
btfsc STATUS,C
movwf Distancia
bcf INTCON,T0IF
retfie
; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza la distancia expresada en centímetros. Se hace de manera que cuando haya que
; visualizar un número mayor de 99 las decenas siempre se visualicen aunque sean cero.
; Y cuando sea menor de 99 las decenas no se visualicen si es cero.
;
; Si la distancia es menor de 3 cm o mayor de 250 cm aparece un mensaje de error.
;
Visualiza
call LCD_Borra ; Borra la pantalla anterior.
movlw MIN_DISTANCIA ; Va a comprobar si es menor del mínimo admisible.
subwf Distancia,W ; (W) = (Distancia) - MIN_DISTANCIA
btfss STATUS,C ; ¿C=1?, ¿(W) positivo?, ¿(Distancia) >= MIN_DISTANCIA?
goto DistanciaMenor ; No ha resultado menor, y salta al mensaje de error.
movf Distancia,W ; Va a comprobar si es mayor del máximo admisible.
sublw MAX_DISTANCIA ; (W)=MAX_DISTANCIA-(Distancia)
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿MAX_DISTANCIA < (Distancia)?
goto DistanciaFiable ; No, la medida de la distancia entra dentro del rango.
;
DistanciaMayor
movlw MAX_DISTANCIA ; La distancia es mayor que el máximo.
movwf Distancia
movlw MensajeDistanciaMayor
goto VisualizaDistancia
;
DistanciaMenor
movlw MIN_DISTANCIA ; La distancia es menor del mínimo fiable.
movwf Distancia
movlw MensajeDistanciaMenor
goto VisualizaDistancia
DistanciaFiable
movlw MensajeDistancia
VisualizaDistancia
call LCD_Mensaje
movlw .5 ; Centra la medida de la distancia en la segunda línea
call LCD_PosicionLinea2 ; de la pantalla.
movf Distancia,W
call BIN_a_BCD ; Lo pasa a BCD.
movf BCD_Centenas,W ; Primero las centenas.
btfss STATUS,Z ; Si son cero no visualiza las centenas.
goto VisualizaCentenas
movf Distancia,W ; Vuelve a recuperar este valor.
call BIN_a_BCD ; Lo pasa a BCD.
call LCD_Byte ; Visualiza las decenas y unidades.
goto Visualiza_cm
VisualizaCentenas
call LCD_Nibble ; Visualiza las centenas.
movf Distancia,W ; Vuelve a recuperar este valor.
call BIN_a_BCD ; Lo pasa a BCD.
call LCD_ByteCompleto ; Visualiza las decenas (aunque sea cero) y
Visualiza_cm ; unidades.
movlw MensajeCentimetro
call LCD_Mensaje
return
INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <LCD_8BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <BIN_BCD.INC>
END
en rojo esta lo que creí que debía poner, y ak debajo dejo la rutina de comunicación rs232, si alguien me puede decir como puedo enviar la variable distancia con esta rutina se lo agradeceria.
Estas subrutinas permiten realizar las tareas básicas de control de la transmisión
; seríe asincrona según normas RS-232.
;
; Los parámetros adoptados para la comunicación son los siguientes:
; - Velocidad de transmisión de 9600 baudios. La duración de cada bit será 104 µs.
; - Un bit de inicio o Start a nivel bajo.
; - Dato de 8 bits.
; - Sin paridad.
; - Dos bits de final o Stop a nivel alto.
;
; El tiempo entre bit y bit debe coincidir con el periodo de la señal leída o enviada.
; Como la velocidad de transmisión o recepción es de 9600 baudios, el periodo será:
; 1/9600 Baudios = 104 µs. Se utilizará pues la subrutina Retardos_100micros.
CBLOCK
RS232_ContadorBits
RS232_Dato
ENDC
#DEFINE RS232_Entrada PORTC,7 ; Línea por la que se reciben los datos.
#DEFINE RS232_Salida PORTC,6 ; Línea por la que se envían los datos.
;
; Subrutina "RS232_Inicializa" -------------------------------------------------------------
;
; Configura las líneas de salida y entrada del microcontrolador.
RS232_Inicializa
bsf RS232_Salida ; Al principio salida en alto para resposo.
bsf STATUS,RP0
bsf RS232_Entrada ; Esta línea se configura como entrada.
bcf RS232_Salida ; Esta línea se configura como salida.
bcf STATUS,RP0
return
; Subrutina "RS232_LeeDato" -------------------------------------------------------------
;
; El microcontrolador lee el dato por la línea de entrada comenzando por el bit de menor
; peso. El dato leído se envía finalmente en el registro de trabajo W.
;
; El ordenador parte siempre de un nivel alto, que es el estado que tiene cuando no
; envía información. La secuencia utilizada es:
; 1º Espera que se ejecute el pulso negativo del bit Start o flanco de bajada.
; 2º Deja pasar un tiempo una y media veces mayor que el periodo de transmisión para
; saltarse el bit de Start y lee el primer bit en su mitad.
; 3º Lee el resto de los bits de datos, esperando un tiempo igual a la duración del
; período entre lectura y lectura para testearlos en mitad del bit.
;
; Salida: En el registro de trabajo W el byte leído.
RS232_LeeDato
movlw d'8' ; Número de bits a recibir.
movwf RS232_ContadorBits
RS232_EsperaBitStart
btfsc RS232_Entrada ; Lee la entrada y espera a que sea "0".
goto RS232_EsperaBitStart ; No, pues espera el nivel bajo.
call Retardo_100micros ; El primer bit debe leerlo un tiempo igual a una
call Retardo_50micros ; vez y media el periodo de transmisión.
RS232_LeeBit
bcf STATUS,C ; Ahora lee el pin. En principio supone que es 0.
btfsc RS232_Entrada ; ¿Realmente es cero?
bsf STATUS,C ; No, pues cambia a "1".
rrf RS232_Dato,F ; Introduce el bit en el registro de lectura.
call Retardo_100micros ; Los siguientes bits los lee un periodo más tarde.
decfsz RS232_ContadorBits,F ; Comprueba que es el último bit.
goto RS232_LeeBit ; Si no es el último bit pasa a leer el siguiente.
call Retardo_200micros ; Espera un tiempo igual al los 2 bits de Stop.
movf RS232_Dato,W ; El resultado en el registro W.
return
; Subrutinas "RS232_EnviaDato" y "RS232_EnviaNúmero" -------------------------------------
;
; El microcontrolador envía un dato por la línea de salida comenzando por el bit de menor
; peso. En dato enviado será el que le llegue a través del registro de trabajo W.
; 1º. Envía un "0" durante un tiempo igual al periodo de la velocidad de transmisión.
; Este es el bit de "Start".
; 2º. Envía el bit correspondiente:
; - Si va a enviar un "0" permanece en bajo durante el periodo correspondiente.
; - Si va a escribir un "1" permanece en alto durante el periodo correspondiente.
; 3º. Envía dos bits "1" durante un tiempo igual al período de la velocidad de
; transmisión cada uno. Estos son los dos bits de Stop.
;
; Entrada: En (W) el dato a enviar.
RS232_EnviaNumero ; Envía el código ASCII de un número.
addlw '0' ; Lo pasa a código ASCII sumándole el ASCII del 0.
RS232_EnviaDato
movwf RS232_Dato ; Guarda el contenido del byte a transmitir.
movlw d'8' ; Este es el número de bits a transmitir.
movwf RS232_ContadorBits
bcf RS232_Salida ; Bit de Start.
call Retardo_100micros
RS232_EnviaBit ; Comienza a enviar datos.
rrf RS232_Dato,F ; Lleva el bit que se quiere enviar al Carry para
btfss STATUS,C ; deducir su valor. ¿Es un "1" el bit a transmitir?
goto RS232_EnviaCero ; No, pues envía un "0".
RS232_EnviaUno
bsf RS232_Salida ; Transmite un "1".
goto RS232_FinEnviaBit
RS232_EnviaCero
bcf RS232_Salida ; Transmite un "0".
RS232_FinEnviaBit
call Retardo_100micros ; Este es el tiempo que estará en alto o bajo.
decfsz RS232_ContadorBits,F ; Comprueba que es el último bit.
goto RS232_EnviaBit ; Como no es el último bit repite la operación.
bsf RS232_Salida ; Envía dos bits de Stop.
call Retardo_200micros
return