Autor Tema: Ayuda con rutina de comunicación RS232  (Leído 2730 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
Ayuda con rutina de comunicación RS232
« en: 06 de Mayo de 2013, 19:54:08 »
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.


Citar
#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.

Citar
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
   


Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Re: Ayuda con rutina de comunicación RS232
« Respuesta #1 en: 25 de Junio de 2013, 19:15:36 »