Autor Tema: USART con 16F877A, XC8 y una migraña  (Leído 4717 veces)

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

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
USART con 16F877A, XC8 y una migraña
« en: 28 de Septiembre de 2012, 15:49:40 »
Hola, que tal,

Estoy intentando mandar datos por el USART de un PIC 16F877A, con C, con el XC8 de Microchip, y recibo cualquier dato menos el esperado

Les paso el código del PIC
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

__CONFIG( FOSC_XT & WDTE_OFF & PWRTE_ON & BOREN_ON );

#define _XTAL_FREQ                          4000000 // Velocidad clock en Hz

#define LONGITUD_CADENA_DATOS_USART         32

near struct Datos_USART {
    unsigned int    PosTX;
    unsigned int    PosRX;
    char        TX[LONGITUD_CADENA_DATOS_USART];
    char        RX[LONGITUD_CADENA_DATOS_USART];
} datosUSART;

/******************************************************************************
 * USART
 ******************************************************************************/

void activar_USART_TX(void)
{
    TRISCbits.TRISC6 = 0; // RC6/TX salida
    TRISCbits.TRISC7 = 1; // RC7/RX entrada   TXSTAbits.BRGH   = 1; // Baud Rate high speed

    SPBRG            = 0b00001100; // 12 - FOSC 4 MHz 19.200 (19.231) 0.16% Error
    TXSTAbits.SYNC   = 0; // Modo asincrónico
    RCSTAbits.SPEN   = 1; // Serial port enabled
    //PIE1bits.TXIE    = 1; // Enables the USART transmit interrupt
    RCSTAbits.RX9    = 0; // Selects 8-bit reception
    TXSTAbits.TX9    = 0; // Selects 8-bit transmission
    TXSTAbits.TXEN   = 1; // activa la transmisión
}
//------------------------------------------------------------------------------

void desactivar_USART_TX(void)
{
    TXSTAbits.TXEN   = 0; // desactiva la transmisión
}
/******************************************************************************
 * Funciones generales
 ******************************************************************************/
/* Transmisión de datos */
void enviar_datos(void)
{
    activar_USART_TX();

    for ( char i=0; i<20; i++ )
    {
        TXREG = datosUSART.TX[ i ]; // carga el dato a enviar
        while ( PIR1bits.TXIF == 0 ) ; // 1 = The USART transmit buffer is empty
    }

    desactivar_USART_TX();
}
/******************************************************************************
 * Atención de las interrupciones
 ******************************************************************************/
/* Escucha todas las interrupciones y las deriva */
void interrupt interrupciones(void)
{
    if ( INTCONbits.INTF )
    {
        enviar_datos();
        INTCONbits.INTF = 0;
    }
}
/******************************************************************************
 * Configuración e inicialización del PIC
 ******************************************************************************/

void configurar_RB0(void)
{
    TRISBbits.TRISB0 = 1; // RB0 como entrada
    INTCONbits.INTE = 1; // Activa interrupción en RB0
}
//------------------------------------------------------------------------------

void activar_interrupciones_globales(void)
{
    OPTION_REGbits.INTEDG = 1;
    INTCONbits.GIE   = 1; // Enables all unmasked interrupts
    INTCONbits.PEIE  = 1; // Enables all unmasked peripheral interrupts
}
//------------------------------------------------------------------------------

void inicializar_variables(void)
{
    datosUSART.PosRX = 0;
    datosUSART.PosTX = 0;
    for ( char i=0; i<LONGITUD_CADENA_DATOS_USART; i++)
    {
        datosUSART.RX[i] = 0;
        datosUSART.TX[i] = 0;
    }

    datosUSART.TX[  0 ] = 0b01000001; // A
    datosUSART.TX[  1 ] = 0b01000010; // B
    datosUSART.TX[  2 ] = 0b01000011; // C
    datosUSART.TX[  3 ] = 0b01000100; // D
    datosUSART.TX[  4 ] = 0b01000101; // E
    datosUSART.TX[  5 ] = 0b01000110; // F
    datosUSART.TX[  6 ] = 0b01000111; // G
    datosUSART.TX[  7 ] = 0b01001000; // H
    datosUSART.TX[  8 ] = 0b01001001; // I
    datosUSART.TX[  9 ] = 0b01001010; // J
    datosUSART.TX[ 10 ] = 0b01001011; // K
    datosUSART.TX[ 11 ] = 0b01001100; // L
    datosUSART.TX[ 12 ] = 0b01001101; // M
    datosUSART.TX[ 13 ] = 0b01001110; // N
    datosUSART.TX[ 14 ] = 0b01001111; // O
    datosUSART.TX[ 15 ] = 0b01010000; // P
    datosUSART.TX[ 16 ] = 0b01010001; // Q
    datosUSART.TX[ 17 ] = 0b01010010; // R
    datosUSART.TX[ 18 ] = 0b01010011; // S
    datosUSART.TX[ 19 ] = 0b01010100; // T

    TXREG = 0;
}
/******************************************************************************
 * Main
 ******************************************************************************/
void main(void)
{
    configurar_RB0();

    inicializar_variables();

    activar_interrupciones_globales();

    while ( 1 ) { ; }
}

Básicamente, cuando presiono un pulsador conectado a RB0, la interrupción llama a la función enviar_datos()
Esta función llama a activar_USART_TX() para configurar y activar la transmisión, envía 20 letras mayúsculas, de la A a la T, y desactiva la transmisión
En la PC, en lugar de recibir 20 caracteres (char de 8 bits), recibo estos 54   :5]  :huh:
Código: [Seleccionar]
(char) x  (int) 120
(char) x  (int) 120
(char) þ  (int) -2
(char) x  (int) 120
(char)     (int) 30
(char) x  (int) 120
(char) þ  (int) -2
(char) x  (int) 120
(char)     (int) 30
(char) x  (int) 120
(char) à  (int) -32
(char) x  (int) 120
(char) þ  (int) -2
(char) x  (int) 120
(char) à  (int) -32
(char) x  (int) 120
(char)     (int) 30
(char) ?  (int) 63
(char) x  (int) 120
(char) þ  (int) -2
(char) ?  (int) 63
(char) x  (int) 120
(char)     (int) 30
(char) ?  (int) 63
(char) x  (int) 120
(char) þ  (int) -2
(char) x  (int) 120
(char)     (int) 30
(char) ?  (int) 63
(char) x  (int) 120
(char)     (int) 15
(char) À  (int) -64
(char) x  (int) 120
(char) à  (int) -32
(char) x  (int) 120
(char) ð  (int) -16
(char) ?  (int) 63
(char) x  (int) 120
(char) à  (int) -32
(char) x  (int) 120
(char) à  (int) -32
(char) x  (int) 120
(char) ÿ  (int) -1
(char) ?  (int) 63
(char) x  (int) 120
(char) à  (int) -32
(char) ?  (int) 63
(char) x  (int) 120
(char) x  (int) 120
(char)     (int) 30
(char) x  (int) 120
(char) à  (int) -32
(char) x  (int) 120
(char) þ  (int) -2

¿Qué estoy haciendo mal?

Gracias.
« Última modificación: 28 de Septiembre de 2012, 15:52:57 por LucasBols »
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado fantaxmax

  • PIC16
  • ***
  • Mensajes: 107
    • Libertycraft - Minecraft
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #1 en: 28 de Septiembre de 2012, 16:44:00 »
has probado hacerlo en ccs?, no conozco el programa que ocupas, ejemplo en el ccs harias esto

Código: C
  1. //aqui van los fuses, cabeceras etc...
  2. #include <16F877A.h>
  3.  
  4. #fuses NOMCLR, XT, NOWDT //no conozco los otros fuses
  5.  
  6. #use delay(clock=4M)
  7. #use rs232(UART1, baud=19200)
  8. #int_EXT
  9. void int_ext(){//al activarse la interrupcion ingresa aqui
  10. printf("ABCDEFGHIJKLMNOPQRST");//envias tu cadena y el pic vuelve donde estaba
  11. }
  12. void main(){
  13. enable_interrupts(GLOBAL);//activas las interrupciones
  14. enable_interrupts(INT_EXT);//activas la interrupcion externa
  15. ext_int_edge( L_TO_H );//configuras el flanco de activacion de la interrupcion, en el flanco de subida se activara la interrupcion
  16. while(true){sleep();}//aqui el pic se duerme.
  17.  
  18. }

creo que con ccs el programa lo puedes hacer mas facil, ese programa debiese ser capaz de enviar la cadena de texto que tu deseas, en el programa que ocupas actualmente no te puedo ayudar mucho

Saludos!
"El presente es suyo, El futuro es mio" N.T.
El conocimiento es gratuito e ilimitado, solo debes saber donde buscarlo.

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #2 en: 28 de Septiembre de 2012, 18:34:16 »
Hola fantaxmax,

gracias por responder,

acabo de instalar el CCS v4.109, el código que me pasaste parece muy simple, voy a probar y te cuento,

saludos
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado fantaxmax

  • PIC16
  • ***
  • Mensajes: 107
    • Libertycraft - Minecraft
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #3 en: 28 de Septiembre de 2012, 18:58:20 »
Hola fantaxmax,

gracias por responder,

acabo de instalar el CCS v4.109, el código que me pasaste parece muy simple, voy a probar y te cuento,

saludos

espero te sirva, Saludos!

el ccs es bastante simple de usar, y tiene una gran cantidad de librerias ya hechas, funciones built-in etc...
"El presente es suyo, El futuro es mio" N.T.
El conocimiento es gratuito e ilimitado, solo debes saber donde buscarlo.

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #4 en: 28 de Septiembre de 2012, 20:33:44 »
fantaxmax, de nuevo por aca, y como todo obsesivo, unos amigos estan prendiendo el fuego para un asado y yo on el bendito USART,

bueno, te cuento, él código que me pasaste, con el hiperterminal me tira esto:

"
%5EUeu…ý"

literal sin las comillas, y un programa que hice captura esto:

Código: [Seleccionar]
(char) ¹ (int) 185
(char) ¬ (int) 172
(char) P (int) 80
(char) ¨ (int) 168
(char) ( (int) 40
(char) T (int) 84
(char) ” (int) 148
(char) Ô (int) 212
(char)  (int) 20
(char) * (int) 42
(char) J (int) 74
(char) j (int) 106
(char) Š (int) 138
(char) ª (int) 170
(char) Ê (int) 202
(char) ê (int) 234
(char)
(int) 10
(char)  (int) 21
(char) % (int) 37
(char) 5 (int) 53
(char) E (int) 69
(char) U (int) 85
(char) e (int) 101
(char) u (int) 117
(char) … (int) 133
(char) ý (int) 253
(char) ­ (int) 173
(char) m (int) 109
(char) P (int) 80
(char) ¨ (int) 168
(char) ( (int) 40
(char) T (int) 84
(char) ” (int) 148
(char) Ô (int) 212
(char)  (int) 20
(char) * (int) 42
(char) J (int) 74
(char) j (int) 106
(char) Š (int) 138
(char) ª (int) 170
(char) Ê (int) 202
(char) ê (int) 234
(char)
(int) 10
(char)  (int) 21
(char) % (int) 37
(char) 5 (int) 53
(char) E (int) 69
(char) U (int) 85
(char) e (int) 101
(char) u (int) 117
(char) … (int) 133
(char) ý (int) 253

me parece que tengo un problema con el max232, que opinas?

muchas gracias
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado fantaxmax

  • PIC16
  • ***
  • Mensajes: 107
    • Libertycraft - Minecraft
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #5 en: 28 de Septiembre de 2012, 21:00:23 »
probablemente sea el max232, voy a pasarlo a un pic, pero no tendria como probarlo con la interrupcion, pero es basicamente lo mismo, aunque no deberia tener problemas al transmitir, yo he usado la funcion rs232 del ccs siempre y nunca me ha fallado, prueba el circuito en el proteus, y si transmite correctamente la cadena es el max232, si no sabes usar el proteus, me preguntas nomas a travez de mi correo, bueno te cuento luego como me fue.
"El presente es suyo, El futuro es mio" N.T.
El conocimiento es gratuito e ilimitado, solo debes saber donde buscarlo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #6 en: 28 de Septiembre de 2012, 22:10:04 »
  También pueden ocurrir esos errores de transmisión con emisor y receptor no están configurados a la misma velocidad.

  XC8 es la nueva versión de HiTech. Busca en el foro que hace un tiempo subi unas rutinas de UART y funcionaban muy bien. Las he simulado en Proteus, probado entre PICs y también de PIC a PC tanto en Windows como en Linux.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #7 en: 28 de Septiembre de 2012, 23:40:52 »
Revisa de que calculaste el baudrate en el modo alta velocidad pero no se establece en la configuración.  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #8 en: 29 de Septiembre de 2012, 22:26:19 »
probablemente sea el max232, voy a pasarlo a un pic, pero no tendria como probarlo con la interrupcion, pero es basicamente lo mismo, aunque no deberia tener problemas al transmitir, yo he usado la funcion rs232 del ccs siempre y nunca me ha fallado, prueba el circuito en el proteus, y si transmite correctamente la cadena es el max232, si no sabes usar el proteus, me preguntas nomas a travez de mi correo, bueno te cuento luego como me fue.
con una resistencia de 10k a masa y un cablecito de 1 hilo a los 5v (o 3.5)
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #9 en: 29 de Septiembre de 2012, 22:30:25 »
  También pueden ocurrir esos errores de transmisión con emisor y receptor no están configurados a la misma velocidad.

  XC8 es la nueva versión de HiTech. Busca en el foro que hace un tiempo subi unas rutinas de UART y funcionaban muy bien. Las he simulado en Proteus, probado entre PICs y también de PIC a PC tanto en Windows como en Linux.
es el de Microchip http://www.microchip.com/pagehandler/en-us/family/mplabx/
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #10 en: 29 de Septiembre de 2012, 22:39:17 »
Revisa de que calculaste el baudrate en el modo alta velocidad pero no se establece en la configuración.  ;-)

esto es en una funcion
Código: [Seleccionar]
   TXSTAbits.BRGH   = 1; // Baud Rate high speed
    SPBRG            = 0b00001100; // 12 - FOSC 4 MHz 19.200 (19.231) 0.16% Error

 :? voy a probar cambiando el max232
« Última modificación: 29 de Septiembre de 2012, 22:41:21 por LucasBols »
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado fantaxmax

  • PIC16
  • ***
  • Mensajes: 107
    • Libertycraft - Minecraft
Re: USART con 16F877A, XC8 y una migraña
« Respuesta #11 en: 29 de Septiembre de 2012, 22:48:52 »
probablemente sea el max232, voy a pasarlo a un pic, pero no tendria como probarlo con la interrupcion, pero es basicamente lo mismo, aunque no deberia tener problemas al transmitir, yo he usado la funcion rs232 del ccs siempre y nunca me ha fallado, prueba el circuito en el proteus, y si transmite correctamente la cadena es el max232, si no sabes usar el proteus, me preguntas nomas a travez de mi correo, bueno te cuento luego como me fue.
con una resistencia de 10k a masa y un cablecito de 1 hilo a los 5v (o 3.5)

no entendi, lo que me quisiste decir?, si es por probar el codigo mediante la interrupcion, no lo puedo hacer porque no tengo pics dual in line, tengo 2 16f690 ya en placa y no trabajan con la interrupcion, y asegurate que la velocidad del pic y del pc sean la misma, como configuras en el codigo del mplabx, 19,2kbaudios,
"El presente es suyo, El futuro es mio" N.T.
El conocimiento es gratuito e ilimitado, solo debes saber donde buscarlo.