Autor Tema: Interrupciones Uart en "C" de CCS  (Leído 3437 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Interrupciones Uart en "C" de CCS
« 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.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Interrupciones Uart en "C" de CCS
« Respuesta #1 en: 08 de Septiembre de 2011, 09:06:31 »
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;
}
Saludos desde Granada, España.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Interrupciones Uart en "C" de CCS
« Respuesta #2 en: 08 de Septiembre de 2011, 13:55:33 »
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.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Interrupciones Uart en "C" de CCS
« Respuesta #3 en: 08 de Septiembre de 2011, 16:58:13 »
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.
« Última modificación: 08 de Septiembre de 2011, 17:00:49 por dogflu66 »
Saludos desde Granada, España.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Interrupciones Uart en "C" de CCS
« Respuesta #4 en: 08 de Septiembre de 2011, 22:36:45 »
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!
No contesto mensajes privados, las consultas en el foro

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Interrupciones Uart en "C" de CCS
« Respuesta #5 en: 09 de Septiembre de 2011, 03:12:05 »
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.
Saludos desde Granada, España.