Antes de (durante) escribir este post he resuelto el problema. Así que en vez de utilizarlo para preguntar lo uso para informaros del resultado.
Tengo un diseño que hace (debería hacer) lo siguiente:
1º.- Espero a leer un trama TTL de datos mediante una Interrupción externa.
2º.- Recibo efectivamente dicha trama TTL de datos, la almaceno y emito un beep anunciando su llegada.
3º.- Transmito lo leído al PC con el fin de obtener permiso para ejecutar una acción.
4º.- Espero contestación del PC o Timeout por falta de respuesta.
5º.- Si la contestación es positiva activo durante un tiempo determinado un Relé (con carga conectada), emito tres Beeps y hago parpadear un Led. Si es negativa no hago nada y continúo por el punto 6º.
6º.- Vuelvo al punto 1º.
A efectos de prueba configuro la respuesta del PC siempre positiva.
Y así la ejecución sin embargo se produce de la siguiente forma.
1º.- Espero a leer un trama TTL de datos.
2º.- Recibo efectivamente dicha trama TTL de datos y la almaceno, emito un beep anunciando su llegada.
3º.- Transmito lo leído al PC con el fin de obtener permiso para ejecutar una acción.
4º.- Espero contestación del PC o Timeout por falta de respuesta.
5º.- El PC me dá la contestación positiva.
6º.- Activo el relé, emito tres Beeps y hago parpadear un Led.
7º.- Transcurrido un tiempo desactivo el relé.
8º.- Vuelvo al punto 2º.
Osea tras recibir la primera trama entro en un bucle infinito de la forma:
Beep (trama leída) transmito al PC y recibo contestacion de éste, Activo el relé, tres beeps y parapadeo, desactivo el relé, Beep (trama leída) transmito al PC y recibo contestacion de éste, Activo el relé, tres beeps y parapadeo, desactivo el relé,
Beep (trama leída) transmito al PC y recibo contestacion de éste, Activo el relé, tres beeps y parapadeo, desactivo el relé,
Beep (trama leída) transmito al PC y recibo contestacion de éste, Activo el relé, tres beeps y parapadeo, desactivo el relé,
Beep (trama leída) transmito al PC y recibo contestacion de éste, Activo el relé, tres beeps y parapadeo, desactivo el relé, .... una y otra vez, una y otra vez hasta que le quito la corriente a la placa.
Solución: Quito la carga del relé y todo arreglado, funciona correctamente hago todo un ciclo completo y se queda a la espera de una nueva trama. Pongo la carga y vuelve el problema cíclico de nuevo. Ok.
¿Cual es la causa?
La causa es la generación de ruido, interferencias, que se producen al efectuar el corte del circuito conectado al relé (2 amperios de carga resistiva). Este ruido es captado por por la interrupción externa como una trama aleatoria y procede a procesarla como una real (en el fondo no es mas que una nueva colección de números y no tengo forma de decidir si es o no aleatoria). Como el PC está configurado en modo test para aceptar todas las tramas como válidas le contesta que adelante, que active el relé, asi que vuelve a activar el relé y al desactivarlo vuelve de nuevo el problema.
Solución:
A.- Software. Deshabilitar la interrupción externa antes de desactivar el relé y volverla a habilitarlar tras su desactivación, esperando unos microsegundos a que se disipe la tormenta.
B.- Hardware. Filtrar adecuadamente el circuito externo conectado al relé para eliminar el ruido y evitar que la tormenta se produzca.
Ea, y eso es todo (por ahora)
Si véis alguna solución más comentadla y así sabremos todos un poco mas.