TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: alperez en 12 de Noviembre de 2012, 09:11:27
-
Hola a todos, tengo un problema con la uart1 de un pic24f, resulta que el pic transmite bien (a traves de un max487) y para recibir utilizo la interrupcion y hasta aqui todo bien. Pero lo que recibo es basura.
A ver si alguien me puede dar una pista de por donde puedo buscar el error, llevo un buen rato buscando y no encuentro nada.
Pro cierto, al pin enable:¿deberia ponerle una pull-down? Esto ya funciona perfectamente en dos pic con CCS, pero en c30 se me atraganta
Esta es la interrupcion:
/* Interrupción por recepcion de uart1 */
void __attribute__((interrupt,no_auto_psv)) _U1RXInterrupt(void)
{
IFS0bits.U1RXIF = 0; //Ponemos a 0 el flag de la interrupcion de recepcion
rcvchar=0x00; // Inicializo carácter recibido
if(DataRdyUART1()){ // Si hay algo pendiente de recibir ...
rcvchar=ReadUART1(); // lo descargo y ...
putsUSBUSART(rcvchar); //para ver que recibimos
CDCTxService();
addcbuff(rcvchar); // lo añado al buffer
}
if(U1STAbits.OERR) U1STAbits.OERR=0;//si hay error de overflow es borrado
}
La configuracion de la interrupcion y del periferico:
AD1PCFGL = 0xffff; // todos los puertos digitales
TRISFbits.TRISF3 = 0; // RF3 configurado como salida
TRISCbits.TRISC14 = 0; // RC14 configurado como salida
TRISDbits.TRISD1 = 0; // PIN TX como salida
TRISDbits.TRISD2 = 1; // PIN RX como entrada
// Asignacion de pines remapeables para el uso de la uart
iPPSInput(IN_FN_PPS_U1RX,IN_PIN_PPS_RP23); // Asignamos el pin remapeable RP23 a UART1RX
iPPSOutput(OUT_PIN_PPS_RP24,OUT_FN_PPS_U1TX); // Asignamos el pin remapeable RP24 a UART1TX
/*Activamos la interrupcion por recepcion prioridad 7 UART1. */
ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR7 & UART_TX_INT_DIS);
OpenUART1(UART_EN & UART_IDLE_CON & UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT &
UART_IrDA_DISABLE & UART_MODE_SIMPLEX & UART_UEN_00 &
UART_UXRX_IDLE_ZERO & UART_BRGH_FOUR , UART_IrDA_POL_INV_ZERO &
UART_SYNC_BREAK_DISABLED & UART_TX_ENABLE & UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS , BRGVAL);
-
No entiendo como una cosa en principio tan sencilla se puede complicar tanto. He buscado y rebuscado y no hay respuestas válidas, he probado todo los ejemplos que he visto y nada. La única diferencia que tiene éste es que es un PIC 3v3 comunicandose con un PIC 5v, pero los pines son 5v tolerantes.
Lo único que me cabe pensar es un problema de impedancias o yo que sé.
Tenía ambos comunicándose con un max487 y lo he quitado, ya están directos y nada. Tengo a Tx funcionando perfecto pero Rx nada. Luego pondré una pulldown a ver si es que no "sabe" ditinguir entre +5v y +3v3
¿Alguien sabe como puedo localizar las erratas de este PIC (24fj256gb106)?
-
En la pagina de microchip con toda la informacion del PIC
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en531081
vas a la parte inferior a Documentation & Software y tienes el Dasheet Errata
http://ww1.microchip.com/downloads/en/DeviceDoc/80369n.pdf
-
En la pagina de microchip con toda la informacion del PIC
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en531081
vas a la parte inferior a Documentation & Software y tienes el Dasheet Errata
http://ww1.microchip.com/downloads/en/DeviceDoc/80369n.pdf
Gracias
-
Bien, el problema está aquí:
putsUSBUSART(rcvchar); //para ver que recibimos
CDCTxService();
-
Se que hace ya casi un año de tu ultimo post, pero te voy a comentar lo que estoy haciendo y haber si puedes echarme una manilla.
Tengo el mismo micro que tu, y quiero mandarle cosas por el PC y que haga lo que yo quiero el micro, en principio me vale con una aplicacion en VB de pinchar a un boton y que mande el caracter L, y si el micro ve que es la L que encienda un LED. con eso ya me apaária por que lo que me está constando es realizar la conexion...:S
podrias ayudarme? un saludo
-
Se que hace ya casi un año de tu ultimo post, pero te voy a comentar lo que estoy haciendo y haber si puedes echarme una manilla.
Tengo el mismo micro que tu, y quiero mandarle cosas por el PC y que haga lo que yo quiero el micro, en principio me vale con una aplicacion en VB de pinchar a un boton y que mande el caracter L, y si el micro ve que es la L que encienda un LED. con eso ya me apaária por que lo que me está constando es realizar la conexion...:S
podrias ayudarme? un saludo
Conexion hard o soft?
Pon mas datos, que tienes hecho y como quieres realizar la comunicación. Yo utilizo la uart2 con el pickit 2 clone para hacer debug y funciona muy bien
-
Conexion hardware. en vez de tener un rs232 y un max232, tengo un conversor de USB-RS232 que me hace ese trabao entrgandome las tensiones TTL para el micro, tengo toda la placa (fisica) desarrollada pero ahora tengo que empezar a programar la apliccion VB (muy sencillita) y el micro. pero a la hora de programar el micro me encuentro con problemas de como comenzar, que librerias incrluir y que sentecias debo de poner xke no tengo ninguna guia buena en la que guiarme.
Programo el micro con el pickit 2. si deseas te mando el esquema para que lo puedas ver.
Saludos
-
tienes que tener en cuenta que NO todos los pines del pic son 5v tolerantes, teniendo en cuenta eso, tienes que configurar los pines como entrada o salida según proceda, configurar los pines remapeables, NO todos los pines son remapeables, algunos tienen funciones especificas, y desde luego configurar la UART. Mas arriba tienes como lo tengo yo.
Para calcular la velocidad de transmision debes tener en cuenta la velocidad de FOSC.
Estoy asumiendo que lo vas a programar en XC16, por que en CCS es distinto.
¿Por cierto, por que no lo comunicas a través del USB y te ahorras ese conversor de USB-RS232?
-
Pues tenia pensado programarlo con el C30 pero si me aconsejas que el X16 es mejor lo haré con ese.
En cuanto a los pines, si se que tengo que configurarlo y si te das cuenta segun mi esquema tengo dos pines remapeables que asignar a la UART.
He intentado programarlo en USB pero me da muchisimos problemas, no consigo que cuando conecto la placa al ordenador, me aparece continuamente el mensaje de "dispositivo USB no encontrado" he modificado miles de archivos y nada. por eso lo he dado por imposible y he decidido pasarme al RS232.
Empezaré de la manera que lo tienes tu arriba y si me van surgiendo problemas te los postearé.
Mi cristal es de 12MHz y tengo otro de 8 por si no fuera bien con el de 12Mhz. Que me aconsejas?
-
C30 y XC16 son prácticamente lo mismo, pero XC16 es mas nuevo. En la página 200 del datasheet tienes la forma de calcular el baud rate y en este (http://ww1.microchip.com/downloads/en/DeviceDoc/en026583.pdf) documento tienes mas información incluyendo el porcentaje de error sobre diferentes frecuencias FCY con los dos BRG posibles.
-
Estoy calculado lo que me has estado comentado, y no entiedno muy bien lo del BRGH = 0 o igual a 1, que diferencias hay entre los dos?
Un saludo
-
mira a ver si te sirve, yo tampoco lo entendía
http://www.todopic.com.ar/foros/index.php?topic=39579.0
-
Pues tampoco me ha aclarado mucho jajaja,
yo es que tengo dos cristales, uno de 12Mhz, y otro de 8mHZ, si que es verdad que me he fijado en la pagina con el eerror y tal, que aparecen los baud rate para 1,4,8,12 y 16 FCY , pero claro si pongo mi cristal de 12MHZ serian FCY=6 no?
puede funcionar con el? o tendria que poner mejor el de 8Mhz?
Al utilizar las 2 formulas dependiendo del BRGH, me da el mismo error en ambas, como tu decias en tu post 0,16% entonces es indiferente cual utilice? asesorame pofavor
uN SALUDO y gracias por todo ;)
-
FCY es FOSC/2 (en tu caso 6MHz) pero según creo lo puedes cambiar para los periféricos (BIT's DOZE).
Yo actualmente tengo este micro a 55536 bps con un cristal de 4Mhz, quiero decirte que a mi entender las tablas son orientativas, el por qué de esta velocidad tan "rara" es otra historia.
Creo que es indiferente cuál utilices si el error es el mismo, 0.16% es despreciable.
Yo tuve una historia con esto por que además queria utilizar el USB y hay que elegir el xtal cuidadosamente para que cuadre todo, el PLL el BRG, etc...
-
Te acuerdas que te dije que el USB no me funcionaba? Pues bien, he modificado ciertas cosillas, y ahora parece que he conseguido que me funcione...tengo que hacer pruebas, pero he podido instalar el driver que antes ni eso me permitia...es un paso grandote...
No tendrás tu algo de información por ahi, de como mandar cosas por el usb, que me dijiste que era más facil que el rs232???
-
No es más fácil, es que te ahorras el usb-rs232
Para enviar debes tener el driver usb-cdc y windows se encargará de crear el puerto serie virtual
-
Si ya lo tengo instalado!, ayer ya estuve haciendo pruebas con una interfaz del Visual Basic, y encendiendo un LED desde el ordenador, la verdad es que me alegré mucho cuando lo consegui!
Muchas gracias por todo lo que me has contado y ayudado!
Saludos
-
Me alegro que te funcione, ahora dale un poco más de caña a ese PIC, por que con lo que haces lo tienes aburrido :)
Mira mi proyecto: https://www.facebook.com/rsietu yo con este pic no me aburro seguro jajajaja