TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: DarkVect en 03 de Abril de 2009, 09:41:18
-
Hola amigos,
He estado buscando por el foro y no he encontrado nada respecto al problema que tengo:
Comunico un 16F819 a 4MHz con un PC a través de un MAX232. El PIC responde a ciertas teclas del PC enviado unos ciertos bytes de configuración interna. Todo funciona perfectamente hasta 9600 baudios. Si pongo 19200 empiezo a recibir bytes incorrectos y además hay algunos que no llegan.
A qué puede deberse?
El cable que uso es de calidad y mide 1,5 metros así que por ahí no creo que haya problema.
Gracias y un saludo!
-
Hola.
Pues debe ser porque la USART es software ... intenta subirle al cristal del oscilador.
Saludos
-
La UART es por software, estoy usando simultáneamente SPI para comunicarme con otro dispositivo y eso va bien. El cristal no puedo tocarlo, crees que sólo puede ser eso?
-
He estado provando y sigo con el mismo problema, no hay forma de que envíe bien a 19200 bauds.
La única interrupción que utilizo es la el Timer2 a 20ms y comunico por SPI cada 0,5s. Como los puertos de la UART coinciden con los usados en SPI la comunicación RS-232 la emulo por software con el comando de CCS #use rs232(baud=19200, xmit=PIN_B1, rcv=PIN_B2).
Como digo, el cristal es de 4Mhz y creo que debería ir de sobras con él, no?
-
Hola.
Coloca tambien FORCE_SW
Saludos
-
Puede ser por el cristal, prueba con 20.
salu2.
-
He añadido la instrucción DISABLE_INTS y ya funciona!!
#use rs232(baud=19200, xmit=PIN_B6, rcv=PIN_B7, BITS=8, PARITY=N, DISABLE_INTS)
Saludos!
-
DISABLE_INTS significa que deshabilitará las interrupciones cuando se ejecute rutinas de I/O en la UART?
te quedaste con 4MHz verdad?
un saludo
-
Me he quedado con 4Mhz y 19200 que es lo máximo posible en este caso.
La instrucción DISABLE_INTS desahabilita las interrupciones durante el envío de UN caracter. Es decir durante 10 bits en una configuración 8N1 típica. A 19200 bps significa que como mucho, una interrupción se retarda 521us.
En mi caso ese retraso es totalmente permisble, así que todo ok.
Resumiendo:
El problema estaba en que a 9600 bps el tiempo de bit es suficientmente grande como para que salte la interrupción en medio, se sirva y al volver estemos todavía en el mismo bit. A 19200 eso ya no pasa y por lo tanto, la cagamos...
PD: la solución me la ha dado un gurú del foro de CCS.
-
Esas son las cosas que no se aprenden en los libros.
Gracias por el dato DarkVect!
Un saludo desde Alicante.
-
De nada, para eso entramos todos al foro: para ayudar cuando podemos y ser ayudados cuando nos falla algo :)