fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Desincronización en...
 
Avisos
Vaciar todo

Desincronización en transmisión serie

33 Respuestas
6 Usuarios
0 Reactions
19 K Visitas
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

Hola Señores, tengo un problema y pregunto sobre este tema por si me podéis echar un cable con alguna sugerencia.

Resulta que tengo un PIC 16F876a que me controla unos motores mediantes relés y a su vez el PIC es controlado por un PC mediante una comunicación serie, el problema que tengo es que tras varias transmisiones entre PIC y PC, parece que el PIC pierde el norte y no contesta más....

Para que os hagáis una idea, desde el PC siempre transmito 3 bytes con los comandos, y siempre espero 2 bytes de respuesta del PIC que informan de la operación realizada, algunos comandos implican retardos, pero estos retardos se realizan posteriormente a contestar al PC por parte del PIC, y antes de volver a enviarle una orden al PIC me espero un ratito... el caso es que tras varias transmisiones ya no recibo nada del PIC.

Hay que tener en cuenta que uso una rutina enganchada al Timer0, para que el PIC haga otras tareas referentes a los fines de carrera de los motores.

He probado en comunicarme mediante puerto serie, con la aplicación que tengo desarrollada en C, como mediante con el Hyperterminal y en los dos casos sucede lo mismo, el PIC parece no seguir contestando, lo curioso es que a veces sucede antes y otras veces despues.

Alguna idea de porque, pues necesito controlar el PIC desde el PC y ya descarte i2c pues también tenía problemas.

Ciao y gracias.

Responder
32 respuestas
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

Si los datos están correctos, y supongo que además están bien, pues funciona perfectamente durante un tiempo, pero luego al tiempo se "desincroniza" la comunicación (o eso creo). Porque observo que recibe pero por lo visto no recibe correctamente, de ahí mi pregunta si se puede desincronizar a nivel de bit. Además imagino que si los datos de configuración no fueran correctos, ni siquiera conectaría no? o se desincronizaría directamente con el primer byte no? y yo envío muchos comandos antes de la desincronización.

Ciao.

Responder
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

Una pregunta, alguien podría describirme de una forma sencilla como hago para poner un temporizador cuando recibo el primer byte, de forma que si pasa x tiempo y no recibo el tercero pueda resetear el contador de bytes recibidos? Creo que a lo mejor arreglamos algo por si se pierde algun byte no?

Ciao.

Responder
sphinx
Respuestas: 651
(@sphinx)
Ardero
Registrado: hace 17 años

Si los datos están correctos, y supongo que además están bien, pues funciona perfectamente durante un tiempo, pero luego al tiempo se "desincroniza" la comunicación (o eso creo). Porque observo que recibe pero por lo visto no recibe correctamente, de ahí mi pregunta si se puede desincronizar a nivel de bit. Además imagino que si los datos de configuración no fueran correctos, ni siquiera conectaría no? o se desincronizaría directamente con el primer byte no? y yo envío muchos comandos antes de la desincronización.

Ciao.
Por eso te lo preguntaba XyVy. Si resulta que en el PC tienes 9600 baudios, 8 bits de datos, sin paridad, y en el PIC tienes 9600 Bauds, 7 bits de datos y 1 bit de paridad, puede que se líe la cosa. A lo mejor al principio te funciona bien. Por eso lo de asegurarte de que tienes estos datos bien.

Por otro lado:
Una pregunta, alguien podría describirme de una forma sencilla como hago para poner un temporizador cuando recibo el primer byte, de forma que si pasa x tiempo y no recibo el tercero pueda resetear el contador de bytes recibidos? Creo que a lo mejor arreglamos algo por si se pierde algun byte no?

Ciao.
Por que no intentas hacer una prueba simple para ver que está ocurriendo:
Con este programa, utiliza un hyperterminal de windows (pon la frecuencia de reloj que tienes para tu PIC, y los pines que estés utilizando). Cada carácter que le envíes desde el PC, lo debes de ver de vuelta en el hyperterminal. Intenta que sean más de 15 o 20, o 50 caracteres los que ves correctamente enviados de vuelta al PC. Para asegurarte de que no es un problema físico, si no un problema en tu programa:
#include <16F876A>
#fuses XT, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

#int_rda
void rda_isr(void)
{
char c;

c = getc(); // Coge en carácter que el envía el PC
putc(c); // Lo reenvía de vuelta al PC
}

//========================
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1);
}

Ah! Asegúrate de que tienes el cable correctamente hecho. Necesitas mínimo 3 hilos: TX, RX y GND.

Otra cosa, he visto que decías antes que has puesto stream=PC. Te comento, en el campo stream puedes poner cualquier cosa. Al fin y al cabo es una etiqueta que vas a utilizar posteriormente para enviar o recibir para ese puerto rs232. Es decir, que si defines:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=PC, ERRORS)

Entonces después puedes utilizar por ejemplo alguna de las siguientes funciones:
- caracter = getc(PC) // Recibe un carácter en la variable caracter.
- fgets(cadena,PC) // para recibir una cadena. Esta función espera hasta que llega el carácter 0x0D (un "ENTER").Donde cadena, por ejemplo es :
cadena = char[10];
- putc(caracter,PC) // Envia el contenido de caracter.
....
....

Responder
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

El eco lo tenía activado pero lo he desactivado tanto en mi programa PC como en el rutina del PIC, de hecho he pegado aquí el rutina sin el codigo de eco para evitar dejar el codigo muy farragoso.

Y si mientras hay sincronización se devolvía todo correctamente.

En el PIC tengo puesto:
#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, restart_wdt, stream=PC)

y en el PC:
dcb.BaudRate=CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits=ONESTOPBIT;

dcb.fParity = FALSE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fNull=FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = TRUE;

Por otro lado el cable está correctamente como comentas usando 3 hilos, TX, RX y GND, teniendo en cuenta que la GND del circuito está unida a la GND del cable serie.

Como digo el fallo debe ser otra cosa, de todos modos haber si podeis echarme una mano con la rutina de temporización, pues no sé si he hecho bien las cuentas y se estoy utilizando correctamente el Timer.

Gracias por intentar ayudarme!! 😉

Responder
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

Una pregunta más... ¿tienes algo más conectado en la misma alimentación? Algo del tipo un motor o similar... al igual te está entrando ruido en la linea...

Responder
Página 5 / 7
Compartir: