Problema con convertidor A/D y la interrupcion externa

Saludos a todos, Estoy trabajando con el pic 18F458 que es el similar del 16f877, es decir tiene la misma distribucion de pines pero con mas memoria.

El problema consiste en que quiero utilizar dos canales del convertidor y la interrupcion externa, he configurado y trabajado de forma independiente cada uno y trabajan bien, realizan la conversion correctamente las dos entradas, igualmente con la interrupcion y el disparo, pero cuando uno en el mismo programa los convertidores y la interrupcion se altera la salida de pulsos que quiero generar, se pierde el sincronismo con la red electrica y funciona de manera irregular mostrando solo algunos pulsos.

Los pulsos son para controlar unos tiristores.

Si pueden orientarme al respecto lo aprecio mucho.
 
A que te referís con interrupción externa?. A una interrupción que viene de un terminal INTx?.
Como sea, esos pulsos que generas lo hacés dentro del programa principal al parecer.
Esa interrupción externa va a hacer que el tiempo en ejecutar un ciclo de programa varíe. Si la salida la generás dentro del main (o cualquier función llamada por este) con tiempos estrictos, la interrupción puede suceder en cualquier instante cuando se ejecute esa sección crítica y alterar los tiempos. El problema va a ser mayor cuanto mayor se el tiempo en ejecutar la interrupción.

Una opción sería deshabilitar interrupciones cuando se ejecuta esa sección crítica y habilitarlas al salir de la misma.
Otra sería que el código que genera los pulsos de salida este en una rutina de interrupción que no pueda ser interrumpida (prioridad alta) por la interrupción externa (prioridad baja).

Depende de que sea más urgente o crítico en cuanto al tiempo: si detectar y manejar la interrupción externa, o generar los pulsos de salida. Creo que tardar algún que otro milisegundo en detectar la interrupción externa no afectaría tanto como que los pulsos de salida varíen en esa cantidad de tiempo.

Si ponés el código fuente al cual hacés referencia lo podemos ver en más detalle.

Saludos
 
He encontrado la respuesta a mi problema aunque no la solucion todavia. El problema radica en que estaba utilizando retardos dentro de la rutina de la interrupcion con lo cual se producen errores en la ejecucion del programa, lo ideal es hacer uso de las rutinas de interrupcion lo mas breve que se pueda y permitir que regrese al programa principal lo mas rapido posible.
 
Atrás
Arriba