TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: RedPic en 30 de Octubre de 2013, 10:24:24

Título: Deshabilitar interrupciones menos una ...
Publicado por: RedPic en 30 de Octubre de 2013, 10:24:24
No se si esto es así o me lo estoy inventando, la verdad es que aparentemente no funciona ¿o sí?  :shock:

Veréis, tengo tropecientas interrupciones todas habilitadas y todas ellas en perfecto orden de marcha. Hay un momento en que quiero deshabilitarlas todas menos una, la INT_TIMER1, que deseo permanezca activa.

Hago esto:

Código: CSS
  1. disable_interrupts(INTR_GLOBAL);
  2.       enable_interrupts(INT_TIMER1);
  3.       clear_interrupt(INT_TIMER1);
  4.  
  5.       // Aqui hago lo que me parece oportuno
  6.  
  7.       enable_interrupts(INTR_GLOBAL);

¿Es cierto que entre el disable global y el enable global está viva mi interrupción INT_TIMER1?

Porque la verdad es que no lo parece, quiero decir que no hace lo que se supone que tiene que hacer. En fin, que en vuestras manos encomiendo mi interrupción espiritual.  :mrgreen:

¡Ah! por cierto CCS C 4.140
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: BrunoF en 30 de Octubre de 2013, 11:03:56
Hola Diego,

disable_interrupts(INTR_GLOBAL);

Deshabilita TODAS las interrupciones. Es el bit INTCON,GIE y sirve para poder deshabilitar/habilitar TODAS. Es decir que de momento que deshabilitas la Global, el resto deja automáticamente de funcionar, aún si las tienes habilitadas. Lamentablemente lo que quieres hacer es justo al revés. Debes dejar habilitada la GLOBAL y deshabilitar todas excepto la del TIMER1.

Saludos!
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: RedPic en 30 de Octubre de 2013, 15:28:07
Hummmm Gracias Bruno, entonces la ayuda del CCS debe estar mal ... cosa que tampoco es muy de extrañar.

Si buscas sleep() en la ayuda pone exactamente este ejemplo con comentarios:

Código: CSS
  1. disable_interrupts(INT_GLOBAL);
  2.    enable_interrupt(INT_EXT);
  3.    clear_interrupt();
  4.    sleep(SLEEP_FULL);   //sleep until an INT_EXT interrupt
  5.    //after INT_EXT wake-up, will resume operation from this point


De ahí que creí que mi implementación debería funcionar, aunque como os digo hace lo que tu me dice, Bruno, o sea que no funciona.
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: MerLiNz en 30 de Octubre de 2013, 15:55:13
debes desactivarlas todas una a una, si tienes por ejemplo T1, T2.... activadas debes desactivarlas una a una. Otra solucion seria coger el registro entero INTCONx y ponerlo a 0 o hacerle algo asi, ahora mismo no se que pic es, pero la idea es poner todos los registros posibles de interrupciones a 0 excepto el que deseas mantener.
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: MGLSOFT en 30 de Octubre de 2013, 21:19:13
Las interrupciones para salir de Sleep son diferentes, aun así, en el ejemplo deshabilitan todas las demás...

Mira el código asm generado por ese ejemplo, y veras como lo hace...
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: BrunoF en 31 de Octubre de 2013, 14:50:43
Creo que has hecho una pregunta más que interesante, Diego...

He estado investigando a ver si tenía la teoría errónea, y puedo decir que la tenía mínimamente desactualizada, tal vez en gran parte porque no suelo utilizar la función sleep del microcontrolador.

Ahora, he mirado el datasheet del 16F87X y aparece esta lógica de interrupciones:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=41638.0;attach=21183)

Donde se puede ver claramente que el bit INTCON,GIE debe estar activo para que ocurra cualquiera de las interrupciones presentes en el microcontrolador, incluso si el microcontrolador está durmiendo. Este es el comportamiendo que te mencionaba.

Luego, he mirado el datasheet de los 18F2455/2550/4455/4550:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=41638.0;attach=21185)

Donde se puede apreciar que la lógica cambia rotundamente, y ahora algunas interrupciones pueden despertar al uC del sleep, aún sin estar necesariamente activos los bits GIE o GIEH (para baja y alta prioridad respectivamente).

Resumiendo, en cuanto al funcionamiento de las interrupciones, habrá que tener más cuidado ya que varía mucho según el modelo de microcontrolador en cuestión.

Saludos,

Bruno
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: RedPic en 31 de Octubre de 2013, 15:37:43
Interesante, MGLSOFTy BrunoF, muy interesante. Voy a ver si busco la lógica de las interrupciones del micro con el que estoy trabajando: el 24FJ256GA110

Imagino que para el caso de no ser su uso para el sleep() tenga que hacer lo que recomiendáis MerLiNz y tú Bruno, que deshabilite una a una las que no quiero, o sea todas menos la que necesito.
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: BrunoF en 31 de Octubre de 2013, 15:52:45
Interesante, MGLSOFTy BrunoF, muy interesante. Voy a ver si busco la lógica de las interrupciones del micro con el que estoy trabajando: el 24FJ256GA110

Imagino que para el caso de no ser su uso para el sleep() tenga que hacer lo que recomiendáis MerLiNz y tú Bruno, que deshabilite una a una las que no quiero, o sea todas menos la que necesito.

En  primera instancia me parece que sí, que deberás deshabilitar todas excepto la global pertinente y la que te interese mantener activa.

Saludos!
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: MGLSOFT en 31 de Octubre de 2013, 17:47:40
Como dicen los americanos, aplique RTFM !!  :D :D :D :D
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: AngelGris en 31 de Octubre de 2013, 18:15:14
  Yo, del primer gráfico interpreto que sí puede despertar al micro sin que esté activado el GIE. Notar que la línea de Wake-up sale desde las compuertas OR y no de la AND final.
Por supuesto debe estar activa la interrupción que se pretenda utilizar para despertar al micro.

  Sí tiene que activarse PEIE si se pretende que algún periférico lo despierte.
Título: Re: Deshabilitar interrupciones menos una ...
Publicado por: BrunoF en 01 de Noviembre de 2013, 20:53:48
Creo que tienes razón AngelGris. Eso haría que teóricamente el ejemplo del sleep() del CCS funcione en ambas familias.

Saludos!