Autor Tema: Deshabilitar interrupciones menos una ...  (Leído 2588 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Deshabilitar interrupciones menos una ...
« 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
« Última modificación: 30 de Octubre de 2013, 10:28:51 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Deshabilitar interrupciones menos una ...
« Respuesta #1 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!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Deshabilitar interrupciones menos una ...
« Respuesta #2 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.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Deshabilitar interrupciones menos una ...
« Respuesta #3 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.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Deshabilitar interrupciones menos una ...
« Respuesta #4 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Deshabilitar interrupciones menos una ...
« Respuesta #5 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:


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:


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
« Última modificación: 31 de Octubre de 2013, 14:56:05 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Deshabilitar interrupciones menos una ...
« Respuesta #6 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.
« Última modificación: 31 de Octubre de 2013, 15:41:02 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Deshabilitar interrupciones menos una ...
« Respuesta #7 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!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Deshabilitar interrupciones menos una ...
« Respuesta #8 en: 31 de Octubre de 2013, 17:47:40 »
Como dicen los americanos, aplique RTFM !!  :D :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Deshabilitar interrupciones menos una ...
« Respuesta #9 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Deshabilitar interrupciones menos una ...
« Respuesta #10 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!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything