TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dogflu66 en 08 de Septiembre de 2011, 08:45:28
-
Estoy utilizando las interrupciones de la Uart en modo recepción, y todo va correcto, cuando se ejecuta la función que gestiona la interrupción las interrupciones globales son deshabilitadas de forma automática, hasta aquí bien, pero cuando termina la función no me vuelve a activar las interrupciones con lo que me fastidia bastante.
¿Se puede seleccionar en el CCS que al terminar la rutina las vuelva a activar de forma automática?.
#int_RDA //Interrupción Uart Rx
void bufer_uart(){
_bufer1();
Enable_Interrupts(Global) // Esta línea la ignora el compilador.
}
La única forma que tengo de que vuelvan a funcionar es activándolas en la función main.
-
Me respondo a mi mismo:
En otra función la terminaba de esta forma:
void Función () {
'
'
return rx_char;
ENABLE_INTERRUPTS(GLOBAL); //Activa interrupciones
}
Y tenia que terminarla de esta otra:
void Función () {
'
'
ENABLE_INTERRUPTS(GLOBAL); //Activa interrupciones
return rx_char;
}
-
es bastante raro eso que te pasa, yo tanto en mikroC como C18 al llegar al fin de las interrupciones automaticamante restaura los datos, y pone el GIE enable.
-
Me respondo a mi mismo:
En otra función la terminaba de esta forma:
void Función () {
'
'
return rx_char;
ENABLE_INTERRUPTS(GLOBAL); //Activa interrupciones
}
Y tenia que terminarla de esta otra:
void Función () {
'
'
ENABLE_INTERRUPTS(GLOBAL); //Activa interrupciones
return rx_char;
}
Si las habilita correctamente al salir de la función de interrupciones, el problema lo tenia en una función que al entrar tiene que deshabilitar las interrup. globales, pero al salir ejecutaba el "return rx_char;" antes de la habilitación de las mismas, por el motivo que sea el CCS no lo permite de esta manera, hay primero que habilitarlas y luego ejecutar el "return rx_char;", por lo tanto entiendo que si se usa "return" en la función, ésta tiene que formar la ultima sentencia.
-
return rx_char en una rutina de atención a interrupción? :undecided: Eso no es correcto, en las funciones de interrupción no se retorna dato y tampoco se reciben, por eso son del estilo:
void isr_xxxxx(void){
}
Que recuerde CCS se encargaba de activar el GIE, puede ser algún problema de la versión que usas :tongue:
Saludos!
-
Hola Suky, la función que usa Return y me estaba estropeando "el dudoso equilibrio de un programa que trabaja con interrupciones" es llamada desde el main.
Y a modo de anécdota, por lo que he podido observar, las interrupciones "Globales" en CCS controlan los bits GIE y PEIE, y estas son controladas magníficamente por el compilador C de CCS.
Y como comentario personal, demasiado control para el compilador y poco control para el programador.