Autor Tema: No consigo hacer transmisión USART  (Leído 2721 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
No consigo hacer transmisión USART
« en: 05 de Marzo de 2011, 13:04:49 »
Hola a todos!!!
He estado buscando y encontré bastante información, con la cual hice mi programa para recibir un dato y mostrarlo en una pantalla LCD.
Estoy usando un 16F88 como transmisor y un 16F873A como receptor, los datos son transmitidos vía USART en modo asíncrono, el hecho es que a pesar de  haber seguido todos los pasos del data sheet no he conseguido la transmisión  :oops:
Aquí les dejo el programa q he hecho. Espero q puedan ayudarme ya q no se en q estoy fallando. desde ya muchísimas gracias!!!
TX

;==================================================================================================
;========================== Programa que realiza la transmisión ===================================
;================================== serie via USART ===============================================
;==================================================================================================

   List      P=16F88         ;Tipo de PIC
   #include   "P16F88.INC"   ;Registros internos
   errorlevel   -302

   __CONFIG _CONFIG1, _WDT_OFF & _CP_OFF & _BODEN_OFF & _PWRTE_ON & _MCLR_OFF & _XT_OSC

;··································································································
;······················ Registros auxiliares ······················································
;··································································································
Aux1   equ   0x20
Aux2   equ   0x21
Dato   equ   0x22


;==================================================================================================
   org      0x00
   goto   Inicio      ;Se envia al inicio del programa
   org      0x05
;==================================================================================================
;**************************************************************************************************
;********************************Envio por USART***************************************************
;**************************************************************************************************
Tx
      bsf      PORTA,1         ;Enciendo LED para comprobar q ha comenzado a enviar dato
      call   Retardo

      movf   Dato,0
      movwf   TXREG         ;Cargo el dato a ser enviado

      bsf      STATUS,RP0
      bcf      STATUS,RP1      ;Banco de memoria 1

Seguir
      btfss   TXSTA,TRMT      ;verifico si terminó la transmisión del dato
      goto   Seguir         ;No
      bcf      STATUS,RP0      ;Banco de memoria 0
      bcf      PORTA,1         ;Apagoo el LED para comprobar q ha terminado el envío del dato

      return

;**************************************************************************************************
;**************************************************************************************************
;**************************************************************************************************

;__________________________________________________________________________________________________
Retardo
      movlw   0xFF
      movwf   Aux1
Uno
      movlw    0xFF
      movwf   Aux2
Dos
      decfsz   Aux2,1
      goto   Dos
      decfsz   Aux1,1
      goto   Uno

   return

;--------------------------------------------------------------------------------------------------
Inicio
      clrf   PORTA
      clrf   PORTB

      bsf      STATUS,RP0
      bcf      STATUS,RP1      ;Bacno de memoria 1
      
      movlw   0x01
      movwf   TRISA         ;Puerto A como salidas menos A0

      movlw   b'11011100'      ;Configuro el puerto B poniendo a RB5 como salida para Tx
      movwf   TRISB         ;en la transmision    USART

      clrf   OPTION_REG      ;Configuro el registro option

      clrf   ANSEL         ;Entradas y salidas digitales

      movlw   b'00100100'
      movwf   TXSTA         ;Configuro el registro para alta velocidad y lo habilito
      movlw   .25
      movwf   SPBRG         ;Configuro el baude rate a 9600
      bcf      STATUS,RP0      ;Banco cero
      
      movlw   b'10000000'
      movwf   RCSTA         ;Habilito el USART

      
;--------------------------------------------------------------------------------------------------
Principal
      bsf      PORTB,0      ;Enciende y apaga un LED para comprobar q el programa corre
      call   Retardo
      call   Retardo
      call   Retardo
      bcf      PORTB,0
      clrf   Dato      ;Pongo a cero el registro a se enviado
      call   Tx         ;Envio el dato

Main

      btfsc   PORTA,0      ;Compruebo el estado de un pulsador
      goto   Main      ;Continuo esperando a sea presionado
      incf   Dato,1      ;Incremento el registro      
      call   Tx         ;Envio el dato
      goto   Main         ;Continuo enviando el dato

   end


Rx


;//////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////// Programa que recibe un dato vía USART ///////////////////////////////////
;/////////////////////////////// y lo muestra en un LCD ///////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////


   List   P=16F873A      ;Tipo de pic
   Include   "p16F873A.INC"   ;Registros internos
   errorlevel   -302

   __CONFIG   _WDT_OFF & _XT_OSC & _LVP_OFF & _PWRTE_ON & _BODEN_ON & _CP_OFF & _DEBUG_OFF
   
   
;////////////////////////////////////////////////////////////////////////////////////////


Aux      equ   0x24
aux1   equ   0x23
aux2   equ 0x25
Dato1   equ   0x28
Dato2   equ   0x2A
Bit9   equ   0x2B
Adresh   equ   0x1E
adresl   equ   0x9E
Unidad   equ   0x20
Decena   equ   0x21
Centena   equ   0x22
decimal   equ   0x29
Cociente_H   equ 0x26
Cociente_L   equ 0x27
Cmcom      equ   0x9c


   #define   Irp   STATUS,7
   #define   Rp1 STATUS,6
   #define   z   STATUS,2
   #define   c   STATUS,0
   #define   LCDModo   PORTB,2
   #define   LCDE   PORTB,1
   
;==================================================================================================
   
      org      0x00
      goto   Inicio   ;Se envía al inicio del programa
;      org      0x04   ;Dirección de reset
;      goto   Rx      ;Interrupción por recepción de dato vía USART
      org      0x07   ;Direccion donde comienza el programa
      
;==================================================================================================

Retardo
      movlw   0x0E
      movwf   aux2
Loop4   
      movlw   0xff
      movwf   aux1
Loop1
      decfsz   aux1,1
      goto   Loop1
      decfsz   aux2,1
      goto   Loop4   
      return

Delay
      movlw   .200
      movwf   aux2
Loop2
      movlw   .250
      movwf   aux1
Loop3
      decfsz   aux1,1
      goto   Loop3
      decfsz   aux2,1
      goto   Loop2
      return
      
;==================================================================================================
;**************************************************************************************************
;*****************************Rutinas para el LCD**************************************************
;**************************************************************************************************
Control
      bcf      LCDModo   ;Indico q se va a transmitir comandos de control
      goto   Enviar
Dato   bsf      LCDModo   ;Indico q se va a transmitir datos
Enviar
      bsf      LCDE
      movwf   Aux
      movlw   0x0f
      andwf   PORTB,1
      movf    Aux,w
        andlw   0xF0
      iorwf   PORTB,1      ;Envío la parte alta del byte

      call           Retardo
      bcf      LCDE
      call           Retardo
      bsf      LCDE

      movlw   0x0f
      andwf   PORTB,1
      swapf   Aux,w
      andlw   0xf0
      iorwf   PORTB,1   ;Envío la parte baja del byte
      call           Retardo
      bcf      LCDE
      call          Retardo
      return
      
;///////////Inicializa LCD a 4bits////////////////////////////////////////////////////////////////
IniLCD

      movlw   0x02   ;Se indica q la comunicacion es a 4 bits
      call   Control
      movlw   0x28   ;Com a 4 bits y 2 líneas   
      call   Control
      movlw   0x0c   ;Activo display
      call   Control
      movlw   0x06   ;Mensaje sin desplazamiento
      call   Control
      movlw   0x01   ;Borra el LCD
      call   Control
      call   Delay   
      return
      
;//////////////////////////////////////////////////////////////////////////////////////////////////
Write
      movlw   0x30
      addwf   Unidad,1
      addwf   Decena,1
      addwf   Centena,1

      movlw  0xc5
      call    Control


      movf   Centena,0   
      call    Dato
      movf   Decena,0
      call   Dato
      movf   Unidad,0
      call    Dato

      return
      
;**************************************************************************************************
;**************************************************************************************************
;**************************************************************************************************

;--------------------------------------------------------------------------------------------------
;---------------------   BCD de 8 bits a decimal---------------------------------------------------
;--------------------------------------------------------------------------------------------------

Decimal

      movf   Dato,0
      movwf   Unidad
      clrf   Centena
      clrf   Decena

Uno      
      movlw   .10
      subwf   Unidad,0
      btfss   STATUS,C
      goto   Fin

Dos
      movwf   Unidad
      incf   Decena,1
      movlw   .10
      subwf   Decena,0
      btfss   STATUS,C
      goto   Uno
Tres
      clrf   Decena
      incf   Centena,1
      goto   Uno
Fin
   
      return

;--------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------


;==================================================================================================
Inicio
      clrf   STATUS
      clrf   PORTA
      clrf   PORTB
      clrf   PORTC


      bsf      STATUS,RP0      ;Cambio de banco de memoria
      bcf      STATUS,RP1
      
      movlw   0x01
      movwf   TRISA   ;Configuro el puerto A

      movlw   0x00
      movwf   TRISB   ;configuro el purto B

      movlw   b'10000000'
      movwf   TRISC      ;Configuro a RC6=Tx y RC7=Rx
      
      clrf   OPTION_REG   ;configuro el registro option
      
      movlw   0x07
      movwf   Cmcom   ;Des habilito los comparadores

      movlw   .25
      movwf   SPBRG      ;Configuro la velocidad del USART a 9600 baudios
      
      movlw   b'00010100'
      movlw   TXSTA      ;Comfiguro al USART como asíncrono y alta velocidad

      bcf      STATUS,RP0      ;Cambio de banco de memoria
      bcf      STATUS,RP1
      
;      movlw   b'10000000'
;      movwf   INTCON      ;Habilito las interrupciones
;      movlw   b'00100000'
;      movwf   PIE1

      bsf      RCSTA,CREN      ;Habilito la recepción
      bsf      RCSTA,SPEN      ;Habilito el puerto serie

      call       Delay
      
;==================================================================================================
Loop
      bsf      PORTB,0      ;Encinede y apaga un LED para comprobar q el programa corre
      call   Delay

      call   Delay
      call   Delay
      call   Delay

      call   Delay
      call   Delay
      bcf      PORTB,0
      
Lazo
      clrf   Decena      ;Limpio registros
      clrf   Centena
      clrf   Unidad

      call   IniLCD   ;Sub rutina para inicializar el LCD
Mostrar
      Call   Write   ;sub rutina q envía los datos al LCD
      call   Delay
      clrf   RCREG   ;Limpio registro de recepción
      bsf      PORTC,5   ;Enciendo un LED, éste se va a apagar despues de recibir y mostrar
                  ;el dato recibido en el LCD

Test

      bcf      RCSTA,OERR   ;Borro bandera de error de desborde    
      bcf      RCSTA,FERR   ;Borro bandera de error de trama
      btfss   PIR1,RCIF   ;Compruebo si he recibido un dato
      goto   Test      ;No, continuo esperando
      bcf      PIR1,RCIF   ;Si, Borro bandera
      btfsc   RCSTA,FERR   ;Hubo erro de trama?
      goto   Test      ;Si, vuelvo a esperar otro dato
      btfsc   RCSTA,OERR   ;Hubo error de desborde?
      goto   Test      ;Si, vuelvo a espetar otro dato
      movf   RCREG,0      ;Muevo el dato recibido a otro registro
      movwf   Dato
      call   Decimal      ;Rutina q hace la conversion binario a BCD
      bcf      PORTC,5      ;Apago el led esto me indica q terminó la recepción

      goto   Mostrar      ;Vuelvo y muestro el dato en un LCD
      
          end


Desconectado solapower

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
Re: No consigo hacer transmisión USART
« Respuesta #1 en: 06 de Marzo de 2011, 11:26:04 »
Has podido ver cual de los dos es el que falla ? Es decir sabes si el transmisor transmite o si el receptor recibe ?
Podrias comprobarlo incluyendo un Max 232 para poder conectar a puerto serie del PC y ver si el transmisor transmite y al revés también.
Entonces podrás buscar el fallo con mas concreción.

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Re: No consigo hacer transmisión USART
« Respuesta #2 en: 06 de Marzo de 2011, 14:21:59 »
Gracias por darme esa idea!!  ;-)
Lo voy hacer y veo cual es el q me está dando problemas....cualquier resultado lo voy a publicar.
Saludos!!

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: No consigo hacer transmisión USART
« Respuesta #3 en: 06 de Marzo de 2011, 15:48:06 »
.


Por lo que veo estás habilitando la interrupción por recepción en el segundo programa, pero falta la rutina de interrupción. Si chequeás la recepción del dato con el bucle:
Código: ASM
  1. Test
  2.      btfss  PIR1,RCIF    ;Compruebo si he recibido un dato
  3.      goto   Test         ;No, continuo esperando
Entonces deberías deshabilitar la interrupción para que el MCU no salte a la dirección 04h cada vez que se produzca.


Saludos.

PD: Para que quede más prolijo el mensaje, conviene meter el código en uno de estos bloques de código, eligiendo en la lista que dice GeSHi la opción ASM ;-)

When you see a good move, look for a better one (Emanuel Lasker)

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Re: No consigo hacer transmisión USART
« Respuesta #4 en: 06 de Marzo de 2011, 16:17:29 »
Gracias... y perdón por la forma en que publiqué pasa que todavía no sé bien como se hace, pero ahora ya sé para la próxima  :mrgreen:

Lo q hago es ver el bit RCIF, por q según he leído esta bandera se activa igual osea se pone a uno si sucede el evento, y si está activada las interrupciones salta a la dirección 0x04.
En caso de que no esté activada las interrupciones, se lo puede usar igual para saber el estado de la bandera y de esa forma hacer "algo".... no si estoy en lo correcto..... en mi caso lo que haría sería mostrar el dato recibido en el LCD

Gracias!!  :)

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: No consigo hacer transmisión USART
« Respuesta #5 en: 06 de Marzo de 2011, 16:22:50 »
.


Lo que decís es cierto. Lo que pasa es que no había visto que las lineas en donde "habilitás" la interrupción están comentadas. Perdón :oops:

When you see a good move, look for a better one (Emanuel Lasker)

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: No consigo hacer transmisión USART
« Respuesta #6 en: 07 de Marzo de 2011, 11:43:07 »
¿Cómo estás haciendo las pruebas? ¿con el Proteus o en un PCB o protorboard?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Re: No consigo hacer transmisión USART
« Respuesta #7 en: 07 de Marzo de 2011, 13:53:49 »
.


Lo que decís es cierto. Lo que pasa es que no había visto que las lineas en donde "habilitás" la interrupción están comentadas. Perdón :oops:


Yo te pido disculpas, ya q no lo viste porq no está prolija mi presentación. Gracias

¿Cómo estás haciendo las pruebas? ¿con el Proteus o en un PCB o protorboard?

La estoy haciendo en protoboard

Desconectado solapower

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
Re: No consigo hacer transmisión USART
« Respuesta #8 en: 07 de Marzo de 2011, 14:42:49 »
 En el Transmisor creo que en la subrutina TX te faltaría ,antes de la etiqueta Seguir , habilitar la transmisión, es decir un bsf   TXTA,TXEN (habilita la transm.) y despues del goto  Seguir deshabilitar, es decir bcf   TXTA,TXEN
Prueba y comentas