Autor Tema: Transmisión USART asincrono. (solucionado)  (Leído 10536 veces)

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

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Transmisión USART asincrono. (solucionado)
« en: 18 de Junio de 2009, 19:23:53 »
Hola a todos.

Ando teniendo problemas con la transmisión del pic 16f877. Cuando cargo el dato a transmitir al registro TXREG, el bit TXIF se debe poner a 0 y cuando terminó de enviar los datos, este bit se coloca a 1 automáticamente. Pues bien, esto no ocurre al enviar los primeros dos datos, y en el tercero sí. :shock:

Les muestro la configuración  de la usart. En esta rutina, ya arranco en el banco 1.

Código: ASM
  1. ;************************************************************************************************
  2. ;CONFIGURO EL USART: ASINCRONO, 2400 BAUDIOS, 8 BIT DE DATOS, SIN PARIDAD (SE HACE UNA SOLA VEZ Y AL PRINCIPIO DEL PROGRAMA.
  3. ;************************************************************************************************
  4.                         BCF                     TXSTA,SYNC
  5.                         BCF                     STATUS,RP0              ;BANCO 0
  6.                         BSF                     RCSTA,SPEN
  7.                         BSF                     STATUS,RP0              ;BANCO 1
  8.                         BCF                     TXSTA,BRGH              ;BAJA VELOCIDAD.
  9.                         BCF                     PIE1,TXIE
  10.                         BCF                     TXSTA,TX9               ;8 BIT DE DATOS.
  11.                         MOVLW           D'25'
  12.                         MOVWF           SPBRG                   ;AJUSTAMOS PARA 2400 BAUDIOS.

Como verán, solo faltaba habilitar la transmisión, y lo hago en la siguiente rutina, en la que envío los datos. En la línea 5 y 6, cargo el dato a enviar por la USART y en la línea 7 verifico si se terminó de enviar los datos. Entre la línea 6 y 7, el bit TXIF debería ponerse a o y no lo hace, se coloca en 1. Lo curioso es que recién en la línea 15 lo hace.

Al principio pensé que era problema de tiempo y le puse una demora de 10 milisegundos entre la línea 6 y 7 y no ocurre nada, el bit TXIF se queda en 1. ¿Alguien sabe que puede estar pasando?

Código: ASM
  1. TX                      BCF                     STATUS,RP1
  2.                         BSF                     STATUS,RP0                              ;BANCO 1
  3.                         BSF                     TXSTA,TXEN                              ;HABILITAMOS
  4.                         BCF                     STATUS,RP0                              ;BANCO 0
  5.                         MOVLW           B'10101010'
  6.                         MOVWF           TXREG                                   ;MANDAMOS LA SINCRONIZACIÓN
  7.                         BTFSS           PIR1,TXIF                               ;¿SE COMPLETÓ LA TRANSMISIÓN?
  8.                         GOTO            $-1                                             ;NO, ESPERAMOS
  9.                         MOVLW           B'01010101'                             ;SI, MANDAMOS LA SEGUNDA SINCRONIZACIÓN
  10.                         MOVWF           TXREG
  11.                         BTFSS           PIR1,TXIF                               ;¿SE COMPLETÓ LA TRANSMISIÓN?
  12.                         GOTO            $-1                                             ;NO, ESPERAMOS
  13.                         MOVFW           temperaturaAL                   ;SI, RECUPERAMOS LA PARTE ALTA DE LA TEMPERATURA SENSADA.
  14.                         MOVWF           TXREG                                   ;LO TRANSMITIMOS
  15.                         BTFSS           PIR1,TXIF                               ;¿SE COMPLETÓ LA TRANSMISIÓN?
  16.                         GOTO            $-1                                             ;NO, ESPERAMOS
« Última modificación: 19 de Junio de 2009, 11:32:59 por Leon Pic »
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Transmisión USART asincrono.
« Respuesta #1 en: 18 de Junio de 2009, 19:33:42 »
hasta donde tengo entendido el bit se pone a 1 automaticamente  cuando el dato se ha enviado, y se vuelve a poner a cero cuando le cargas otro dato a enviar
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Transmisión USART asincrono.
« Respuesta #2 en: 18 de Junio de 2009, 19:47:57 »
Pues no, esto dice en el datasheet

bit 4 TXIF: USART Transmit Interrupt Flag bit
1 = The USART transmit buffer is empty
0 = The USART transmit buffer is full

Además, cuando habilito la transmisión, automáticamente se pone a 1 el bit TXIF indicando de que la USART está vacío.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Transmisión USART asincrono.
« Respuesta #3 en: 18 de Junio de 2009, 19:55:47 »
mira lo q encontré "El núcleo esta constituido por
el registro de desplazamiento TSR, que obtiene el dato desde el registro TXREG y luego lo va desplazando
y sacando bit a bit, en serie, por la línea RC6/TX/CK. El primer bit que sale es el de menos peso. El dato a
transferir se carga por software en TXREG y se transfiere al TSR en cuanto se haya transmitido el bit de
parada del dato anterior. LA transferencia entre los dos registros se realiza en un ciclo y entonces el
señalizador TXIF se pone a 1, para advertir que el registro de transmisión se ha vaciado. También en este
momento puede producirse una interrupción si se ha posibilitado el uso de interrupciones. Cuando se
escribe otro dato sobre TXREG, l señalizador TXIF se pone a 0. El bit TRMT sirve para indicar el estado del
registro TSR y vale 1 cuando esta vacío"

y viendo unas rutinas, para darse cuenta si el dato fue transmitido testean el bit TRMT
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Transmisión USART asincrono.
« Respuesta #4 en: 18 de Junio de 2009, 20:47:48 »
Claro, el bit TMRT esta pensado para testear el envío de datos sin interrupciones. Enviar un dato sería:

El dato a enviar en w.

Código: ASM
  1. bsf      STATUS,RP0   ; Banco 1
  2.     btfss    TXSTA,TRMT   ; chequea si esta listo para enviar
  3.     goto     $-1 ; Esperamos  a que se desocupe.-
  4.     bcf      STATUS,RP0 ; Banco 0
  5.     movwf    TXREG ; envia Dato.-
No contesto mensajes privados, las consultas en el foro

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Transmisión USART asincrono.
« Respuesta #5 en: 18 de Junio de 2009, 22:06:48 »
Muchas gracias a ambos. Ahora lo modifico y lo pruebo.  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Transmisión USART asincrono.
« Respuesta #6 en: 19 de Junio de 2009, 03:16:02 »
 no me da tiempo a ver que sucede en ese codigo, pero te dejo esta rutina que me paso Picmouse, la utlilizo a diario y va de perlas. se que en algun sitio la tengo echa para que al compilar el mplab calcule el baudrate con un par de #define. a ver si la encuentro y la subo a rutinas para compartir  :mrgreen:
configuracion:
Código: ASM
  1. BANKSEL TRISC
  2.                 BSF             TRISC,6                 ;PUERTO C3 COMO SALIDA
  3.                 BSF             TRISC,7                 ;PUERTO C7 COMO ENTRADA
  4.                 BANKSEL SPBRG
  5.                 MOVLW   .9  
  6.                 MOVWF   SPBRG                   ;BAUD RATE A 31250
  7.  
  8.                 BANKSEL TXSTA
  9.                 BCF             TXSTA,CSRC              ;SELECCIONA RELOJ (ASINCRONO NO IMPORTA)
  10.                 BCF             TXSTA,TX9               ;DATOS DE 8 BITS
  11.                 BSF             TXSTA,TXEN              ;NO ENVIA DATOS POR AHORA
  12.                 BCF             TXSTA,SYNC              ;MODO ASINCRONO
  13.                 BCF             TXSTA,3                 ;NO IMPLEMENTADO
  14.                 BCF             TXSTA,BRGH              ;BAJA VELOCIDAD DE TRANSMISION
  15.                 BCF             TXSTA,TRMT              ;ESTADO DEL REGISTRO DE DESPLAZAMIENTO (VACIO)
  16.                 BCF             TXSTA,TX9D              ;NOVENO BIT A TRANSMITIR
  17.        
  18.                 BANKSEL RCSTA
  19.                 BSF             RCSTA,SPEN              ;HABILITA PUERTO SERIE
  20.                 BCF             RCSTA,RX9               ;BITS A RECIVIR 8
  21.                 BCF             RCSTA,SREN              ;HABILITA RECEPCION UNICA (ASINCRONO NO IMPORTA)
  22.                 BSF             RCSTA,CREN              ;HABILITA RECEPCION CONTINUA
  23.                 BCF             RCSTA,3
  24.                 BCF             RCSTA,FERR              ;NO HAY ERROR DE EMPAQUETAMIENTO
  25.                 BCF             RCSTA,OERR              ;NO HAY ERROR DE DESBORDAMIENTO
  26.                 BCF             RCSTA,RX9D              ;NOVENO BIT DE RECIVIDO
  27.                
  28.                 BANKSEL PIE1           
  29.                 BCF             PIE1,TXIE               ;DESHABILITA INTERRUPCION DE TRANSMISION
  30.                 BCF             PIE1,RCIE               ;HABILITA INTERRUPCION DE RECEPCION
  31.  
  32.                 BANKSEL PIR1
  33.                 BCF             PIR1,TXIF               ;APAGA BANDERA DE INTERRUPCION POR TRANSMISION
  34.                 BCF             PIR1,RCIF               ;APAGA BANDERA DE INTERRUPCION POR RECEPCION
  35.                                                        
  36.                 BCF             STATUS,RP0              ;CAMBIA AL BANCO 0
  37.                 BCF             STATUS,RP1
envio: cargar en w el dato a enviar, antes de llamar a la rutina
Código: ASM
  1. ENVIAR_USART                                    ;EL DATO A TRANSMITIR ESTA ALOJADO EN W HASTA QUE TERMINE EL ULTIMO ENVIO
  2.                 BANKSEL TXSTA
  3.                 BTFSS   TXSTA,TRMT              ;SI ESTA A UNO EL REGISTRO ESTA VACIO
  4.                 GOTO    -1                      ;SI ESTA A CERO, SIGUE LLENO Y A DE ESPERAR
  5.                 BANKSEL TXREG          
  6.                 MOVWF   TXREG                   ;Y CARGA EL DATO A TRANSMITIR EN TXREG
  7.                 BANKSEL TXSTA
  8.                 BSF             TXSTA,TXEN              ;ACTIVA EL ENVIO TXEN=1
  9. ESPERAR
  10.                 BANKSEL PIR1
  11.                 BTFSS   PIR1,TXIF               ;CUANDO TERMINA, SE PONE A UNO TXIF Y SALTA
  12.                 GOTO    ESPERAR                 ;ESTA INSTRUCCION, SI NO VOLVERIA A ESPERAR.
  13.                 BCF             TXSTA,TXEN
  14.                 BCF             STATUS,RP0              ;BANK 0
  15.                 BCF             STATUS,RP1


un saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Transmisión USART asincrono.
« Respuesta #7 en: 19 de Junio de 2009, 10:28:25 »
Hola alogic.on gracias por el progrma.

Tiene un error  :mrgreen: En la configuración la línea 2 debe ser BCF para ponerlo como salida
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Transmisión USART asincrono.
« Respuesta #8 en: 19 de Junio de 2009, 10:50:33 »
tas seguro?? yo la utilizo a diario, tal y como esta ahí. no se si fue Maunix en su dia, el que me indico que habia que ponerlo asi para configurar la usart, no localizo el post, pero creo que ya se habia hablado de eso en el foro

un saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Transmisión USART asincrono.
« Respuesta #9 en: 19 de Junio de 2009, 10:56:45 »
Pues yo me guié por lo que dice el comentario, además en el datasheet del 16f877 el pin que transmite los datos es el pin RC6/TX y como transmite datos tiene que estar configurado como salida y colocar a el registro TRISC,6 en 1, se lo configura como entrada y no como salida.
Código: ASM
  1. BANKSEL TRISC
  2.                 BSF             TRISC,6                 ;PUERTO C3 COMO SALIDA
  3.                 BSF             TRISC,7                 ;PUERTO C7 COMO ENTRADA
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Transmisión USART asincrono.
« Respuesta #10 en: 19 de Junio de 2009, 11:23:20 »
ya ya se que para entrada es uno y salida es cero en trisX, pero la usart es asi de cabezota, lo debe poner en el datasheet, prueba de las dos formas. yo ya te digo que esa rutina envia...  :mrgreen: mira el prog que adjunto creo que tiene la simulacion en isis ahora no puedo comprobar que hice en el simulador, tengo que reinstalarlo, pero el programa lo cargue tal cual esta en el ultimo controlador que hice, y su funcion principal es enviar por la usart  :mrgreen: y no falla

un saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Transmisión USART asincrono.
« Respuesta #11 en: 19 de Junio de 2009, 11:32:28 »
Está bien alogic.on, cuando se configura la USART, éste debe colocar las entradas y salidas respectivamente a los bit RC6 y RC7.  :-/
« Última modificación: 19 de Junio de 2009, 17:07:21 por Leon Pic »
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Transmisión USART asincrono. (solucionado)
« Respuesta #12 en: 19 de Junio de 2009, 14:46:36 »
Saludos , primero que los pines tx y rx deben estar configurados como entradas, el usart hace el resto del trabajo, segundo  que la hoja de aplicacion AN774 es lo mejor que hay para aprender a usar el usart, y ahi dice lo siguiente (haciendo referencia al primer codigo que posteo leon Pic)

Citar
Note: The user needs to ensure that the TXIF
flag is never tested immediately following a
write to TXREG. If necessary, ‘NOP’ instruc-
tions can be inserted but simply rearrang-
ing the code is usually sufficient.

Asi que ya sabes ponle un nop despues de hacer el movwf  TXREG. y el problema tendria que solucionarse

« Última modificación: 20 de Junio de 2009, 10:05:44 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Transmisión USART asincrono. (solucionado)
« Respuesta #13 en: 19 de Junio de 2009, 17:08:32 »
Eso explica porque no andaba.
Muchas gracias Sander.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Transmisión USART asincrono. (solucionado)
« Respuesta #14 en: 19 de Junio de 2009, 23:17:46 »
vaya esa nota nunca la habia leido....donde se obtienen ese tipo de tips's???
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA


 

anything