Yo sinceramente, no sé si hay forma infalible de que un programa sepa si otro está corriendo. Una cosa es que esté en memoria, o que ciertos registros tengan el valor correcto, pero de ahí a saber que el programa no está colgado en un bucle infinito... ya te digo, no lo sé.
Luego está el tema del reset. Es un poco jodido tener que pegar un botonazo, por el rollo del scandisk y todo eso, y el riesgo de corrupción de datos. Se podría hacer algo más fino, entrando por el teclado, y simulando la pulsación de una secuencia de teclas (Alt+Ctr+Supr etc, etc...) pero claro, ese sistema no es fiable del todo, porque cuando el PC se cuelga de verdad, no hay nada que hacer. Evidentemente, si se pudiera hacer por teclado, se podría hacer por soft ¿no?
Personalmente creo que cualquier sistema de watch-dog por hard es, en cierto modo, un parche a un malfuncionamiento del resto del sistema. Si el PC está bien y el sistema operativo es serio, no tendría por qué haber cuelgues totales. Mi PC lleva varios meses (quizás años) sin resetearse, más que cuando es obligatorio durante la instalación de soft nuevo y cosas de esas. Y tampoco es que esté parado, es un W2000 con el Apache, el servidor ftp, el Outlook, el antivirus, etc., siempre corriendo, más los programas que uso yo, que son muchos y diversos.
Pero en fin, supongo que ya habrás estudiado el tema, así que vamos al grano. Habría que definir varias cosas.
1º. Dónde vas a meter el circuito. Yo creo que lo suyo es que el circuito esté fuera, directamente sujeto al conector serie, y que tome la alimentación, por ejemplo, del conector del teclado. Se podría pensar en sacar tensión de las propias señales del puerto serie, pero teniendo en cuenta que habrá por medio un relé (que consume bastante) y que el circuito debe funcionar incluso durante un reset, cuando el estado de las señales puede no ser el que interesa, creo que esa opción no es viable. La otra forma sería meter el circuito dentro de la torre, y alimentarlo de un conector de alimentación para unidades de disco. Esta última opción es más... elegante, porque no andarías con cables por ahí colgando (el de alimentación y el que vaya hasta el pulsador de reset).
2º. El diseño del circuito. Pensándolo un poco, no merece la pena meter un max232, porque en realidad, los datos siempre van a ir del PC al PIC, y bastaría con un simple adaptador con componentes discretos para las señales que vas a usar. Yo pienso que con una vas que escarbas, para los datos. La comunicación a esa distancia es muy segura y no haría falta que el PIC respondiera ni cosas así. Además, ya puestos, y como esta señal estaría invertida (los adaptadores de linea tipo max232, entre otras cosas, invierten las señales), quizás fuera mejor usar un PIC más pequeño, tipo
12F629, e implementar la comunicación por soft. Si además substituímos el relé por un transistor (el reset se hace poniendo una señal a masa), y teniendo en cuenta que este PIC puede correr con un oscilador interno con una precisión suficiente para este caso, el circuito cabría perfectamente en la carcasa de un conector RS232, y sería muy barato.
3º. La lógica del circuito. Yo pienso que podría ser algo así: El PIC almacenaría dos registros, por ejemplo de 2 bytes cada uno, que podemos llamar REGA y REGB. REGA sería el tiempo en segundos que permitimos que tarde en arrancar el PC. REGB sería el tiempo en segundos que permitimos entre señales del programa supervisor. El PIC, cuando arranca (o se resetea), empieza a contar segundos. Mientras el PC no le diga lo contrario enviándole un carácter determinado (que llamaré A), el PIC considera que el PC está arrancando, lo que llamaré "modo arranque", así que va contando segundos, y comparando el contador con REGA. Si el contador llega a REGA, activa el reset. Cuando el PC arranca, el programa supervisor le envía al PIC el carácter A para indicárselo. Entonces el PIC pasa a "modo normal" y a partir de entonces, el PIC empieza a contar de nuevo, pero ahora compara el contador con REGB. Ahora, el programa supervisor tiene que enviar cada cierto tiempo el carácter B, que le indica al PIC que todo va bien. Cada vez que el PIC recibe el carácter B, pone a cero el contador, pero si en algún momento el contador llega a igualar a REGB, entonces el PIC pasa de nuevo a modo arranque, y activa el reset durante unos segundos. Además, habría un programita de configuración que permitiera modificar el valor de REGA y REGB, por ejemplo enviando el carácter C y luego los dos bytes de REGA o el carácter D y luego los dos bytes de REGB. El PIC almacenaría esos valores en la EEPROM. En cuanto a la seguridad en el envío de datos, se puede obligar a que los datos se envíen por triplicado o cualquier método simple que permita recuperar los errores, teniendo en cuenta que el trasiego de datos va a ser pequeñísimo.
En fin, yo lo veo muy muy simple, e interesante también para mí, así que si te interesa, dame un mail o escríbeme al privado y lo vemos.