TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: _CMaGNo_ en 29 de Mayo de 2006, 16:51:17
-
Hola a todos. Tengo un problema con un programa en CCS C que maneja interrupciones. El programa es algo parecido a lo siguiente:
#int_TIMER1 // Timer1 interrupt
FuncionIntTImer1();
}
void main() {
initTimer1(); // Funcion para inicializar Timer1
do { // Ciclo principal
// Intrucciones del ciclo principal
} while (TRUE);
}
El hecho es el programa funciona bien, se queda en el ciclo principal infinitamente hasta que ocurre la interrupcion por desbordamiento del Timer1 y se llama a la funcion que en este caso llame FuncionIntTimer1() que a su vez llama a otras funciones. Despues que esto ocurre el programa no retorna al ciclo principal y en las funciones que llama FuncionIntTimer1() no hay ningun ciclo infinito. No se si me explique bien.
Creo que debe tener algo que ver con el vector de interrupciones ... pero no se como manejar eso en C.
Gracias de antemano y disculpen el enredo :D
-
La pila de los pic es muy limitada, creo recordar que solo admite 3 o 4 llamadas a funciones (no recuerdo cuantas son exactamente, hay que mirar el tamaño de la pila [stack]), seguramente estes sobrepasando el número de llamdas. Como recomendación es imprescindible poner el menor número posible de instrucciones en la interrupción y tratar los datos en el bucle principal (bucle while del main).
Un saludo.
-
Si jfh900, creo que por ahi es la cosa. Estoy usando un Pic16F877A, en la interrupcion solo llamo a una funcion y esta a su vez a otras, lo cual es casi que asbsolutamente necesario, ya que si quito esos llamados tendria que hacer funciones con codigo redundante. Lo otro es que en el ciclo de la funcion main solo llamo a 1 funcion.
Se me ocurre como alternativa usar funciones "En linea" con la directiva #INLINE. Nunca lo he manejado, solo he leido algo sobre eso.
Si alguien puede darme una ayuda con eso o con otra alternativa, estaría muy agradecido.
PD: El código del programa es extenso, asi que no se que tan conveniente sea usar la directiva #INLINE. Gracias
-
Pues ya he intentado con la directiva #INLINE en todas las funciones que llamo y tampoco funciona.
Alguna sugerencia?
-
Finalmente he descubierto el origen del problema, lo cual me deja aun mas desconcertado. Resulta que todo funciona muy bien hasta que llamo a la funcion setup_ccp1 ya sea para activar el modo PWM o para desactivarlo. Despues de eso ya no vuelve al ciclo de la funcion main.
Alguien sabe por que? :?
-
Por que no posteas el código. Sin mas datos no podemos hacer nada.
Un saludo
-
OK, tienes razon. El problema es que el codigo es muy largo ... voy a tratar de hacer una version "lite" con lo escencial
-
Ponlo en un fichero Zip.
Saludos