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.2 K Visitas
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 17 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 17 años

Bueno señores pues sigo teniendo problemas con la sincronización... de vez en cuando pierde el norte... y ya el PIC no responde a ningún comando enviado desde el puerto serie y me consta que el PIC está recibiendo datos, pues cada vez que recibo un dato en la rutina #INT_RDA hago un output_toggle de cierto pin asociado a un LED.

No sé bien como hacer lo que comenta bactering del perro guardian, me podríais concretar un poco más en detalle como puedo hacerlo? o alguna otra sugerencia que me ayude a intentar solucionar el problema?

Gracias una vez más!

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

Os dejo la rutina que estoy utilizando.... por si veis algun fallo o podéis sugerirme alguna cosa... actualmente cuando se produce la sincronización y a la vista del código cuando envío datos desde el PC se enciende el LED_AZUL que me indica que la rutina está recibiendo cosas... lo que no sé es si el PIC llega a leer la trama completa (secuencia de 3 bytes) o bien lo que lee no cumple que sea un comando valido y por eso se queda ahí...

Utilizo una rutina llamada es_comando que recibe el primer byte y si no se encuentra dentro de los comandos permitidos vuelve a poner el index a 0, para posicionarse de forma correcta en el primer byte de comando. Lo que ya no se es si desajuste por fallo de sincronización es a nivel de bits...

Ciao.

#INT_RDA
void serial_interrupt()
{
disable_interrupts(INT_RDA);

// Hacemos un reset del WDT para que no se cuelgue
restart_wdt();

if (kbhit()) {
output_toggle(LED_AZUL);
if (index==0) {
input_ready=FALSE;
comando=getc();
if (es_comando(comando)) {
index++;
} else {
index=0;
}
} else if (index==1) {
dato1=getc();
index++;
} else if (index==2) {
dato2=getc();
input_ready=TRUE;

index=0;

}
}
enable_interrupts(INT_RDA);
}

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

Mmm, me parece que si lo que recibes no es un comando deberías de vaciar el buffer de entrada... Si por ejemplo recibes una trama (entiendo que son tramas de 3 bytes) y el primer byte no coincide con un comando, pero el segundo, que se supone que son datos, coincide con un comando... entonces tendrías un problema.

No se si será eso lo que te está pasando.

Un saludo.

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

Salvo que se haya desincronizado, porque si ves el código todo depende de lo que valga la variable index, ya que dependiendo de index se supone que se trata del 1er, 2nd o 3rd byte.

Por ejemplo si dejo la rutina así:

#INT_RDA
void serial_interrupt()
{
disable_interrupts(INT_RDA);

output_toggle(LED_STOP);

// Hacemos un reset del WDT para que no se cuelgue
restart_wdt();

if (kbhit()) {
if (index==0) {
input_ready=FALSE;
comando=getc();
if (es_comando(comando)) {
index++;
} else {
index=0;
}
} else if (index==1) {
dato1=getc();
index++;
} else if (index==2) {
dato2=getc();
input_ready=TRUE;
output_toggle(LED_AZUL);
index=0;

}
}
enable_interrupts(INT_RDA);
}

Lo curioso es que en la rutina que acabo de poner, cuando llega el tercer byte va cambiando un led azul encendido, apagado, encendido, etc, con cada tres bytes, el caso es que por mucho que envie 3 bytes conteniendo un comando, cuando se produce la desincronización con ninguno de los X bytes sucesivos que contiene el byte comando, no cambia el led, es por ello lo de mi pregunta de si se puede desincronizar a nivel de bit?

ciao.

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

Hola XyVy, la configuración serie que te comentaban en un post anterior, ¿ la tienes igual en el PIC que en el PC, por ejemplo : 9600 Bauds, 8 bits de datos y Sin Paridad ?

Responder
Página 4 / 7
Compartir: