Autor Tema: No entiendo enable_interrupts(global)  (Leído 10907 veces)

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

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
No entiendo enable_interrupts(global)
« en: 28 de Enero de 2008, 07:51:41 »
Según traduzco del manual de CCS:

"enable_interrupts(global) no habilita ninguna interrupción en concreto, pero sí activa las interrupciones que hayan sido previamente habilitadas".

¿En qué se diferencia habilitar de activar?

Imaginen que quiero usar las interrupciones INT_EXT1 e INT_TIMER1, pero que la segunda sólo esté habilitada mientas se mantiene pulsado un botón conectado a la primera. En otras palabras, que el timer1 sólo esté activo mientras el botón esté pulsado.

El código que he usado es el siguiente:

Código: [Seleccionar]
int1 botonPulsado=0;
#INT_EXT1
void int1_handler(){
   if(!botonPulsado){
      botonPulsado=1;
      ciclosTimer1=400;               
      ext_int_edge(1,L_TO_H);
      enable_interrupts(INT_TIMER1);   
      clear_interrupt(INT_TIMER1);   
      //1. ¿Debería poner aquí otro enable_interrupts(global)?
   }else{
      disable_interrupts(INT_TIMER1);
      botonPulsado=0;     
      ext_int_edge(1,H_TO_L);     

   }
}
#INT_TIMER1
void timer1_handler(){
   if(botonPulsado){ //2. Entiendo que esto no sería necesario, pues si el botón no está pulsado la interrupción timer1 estaría deshabilitada ¿no?
      if(--ciclosTimer1==0){         
         write_eeprom(0,read_eeprom(1));
         delay_ms(20);     
         reset_cpu();
      }
   }
main(){
      ext_int_edge(1,H_TO_L);
      enable_interrupts(INT_EXT1);   
      clear_interrupt(INT_EXT1);
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
      enable_interrupts(INT_TIMER1); //3. ¿es necesario habilitarlo si sólo quiero que entre en funcionamiento cuando se produzca INT_EXT1?
      clear_interrupt(INT_TIMER1);
      enable_interrupts(GLOBAL);
      disable_interrupts(INT_TIMER1);//4. la deshabilito porque no quiero que entre en funcionamiento aún
      while(true){...};
}

Y una última cosa: si tengo un delay en el programa, ¿las interrupciones no esperan a que termine el delay, verdad?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: No entiendo enable_interrupts(global)
« Respuesta #1 en: 28 de Enero de 2008, 07:59:59 »
En los registros de control de las interrupciones del micro hay un bit de habilitación para cada fuente de interrupción y otro que es global para todas.Para habilitar una interrupción deben estar seteados tanto uno como otro.

El enable_interrupts(global) basta con que lo pongas una vez al comienzo del programa y después trabajar con los bits de habilitación específicos para cada fuente de interrupción.

Los delays no entorpecen a las interrupciones,estas se producen si se da el caso,a no ser que el delay esté dentro de alguna rutina de atención a la interrupción,cosa que no es nada recomendable.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: No entiendo enable_interrupts(global)
« Respuesta #2 en: 28 de Enero de 2008, 10:18:32 »
Podríamos añadir a lo dicho por Modulay que si tienes tropecientas mil interrupciones y quieres deshabilitarlas todas, no tienes que ir una por una, si no que con la global las deshabilitas de un plumazo.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Jorge_

  • PIC10
  • *
  • Mensajes: 30
Re: No entiendo enable_interrupts(global)
« Respuesta #3 en: 28 de Enero de 2008, 10:22:02 »
Se suele utilizar cuando grabas en la memoria eeprom, así lo recomienda Microchip.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: No entiendo enable_interrupts(global)
« Respuesta #4 en: 28 de Enero de 2008, 11:12:12 »
El problema era que tenía un delay en una interrupción pues requería escribir un dato en la EEPROM y, aunque la interrupción estaba deshabitilitada, CCS se empeñaba en deshabilitarme las interrupciones en el main para evitar la re-entrada.

Ya sé que suena raro, pero eso es lo que me parece que estaba ocurriendo. En cuanto he eliminado el delay (extrayendo la rutina de escritura de la EEPROM al main y activándola mediante un flag) todo funciona correctamente, aún no estando habilitada la interrupción.

Es como si CCS tuviera alergia a los delay en las interrupciones cuando hay bucles en el main.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No entiendo enable_interrupts(global)
« Respuesta #5 en: 28 de Enero de 2008, 11:31:13 »
No es bueno hacer delays dentro de interrupciones.
En tu caso, si no quieres sacar la escritura de la eeprom al main, también podrías haber dejado un while() chequeando el bit que indica que finalizó la escritura en la eeprom.
De todas formas, la solución de sacarlo al main es también muy buena.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: No entiendo enable_interrupts(global)
« Respuesta #6 en: 28 de Enero de 2008, 12:04:52 »
Después de la escritura en la EEPROM había un reset_cpu(), por lo que no importaba demasiado el delay.

Lo que no acabo de entender es: estando la interrupción deshabilitada, por qué CCS se preocupaba de que contuviese un delay. ¡qué cosas más raras! Simplemente quito el delay y ya todo funciona bien. Sospecho que debe haber algo más...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: No entiendo enable_interrupts(global)
« Respuesta #7 en: 28 de Enero de 2008, 12:34:03 »
Después de la escritura en la EEPROM había un reset_cpu(), por lo que no importaba demasiado el delay.
Si importa, para que le de tiempo a la eeprom de grabarse (tipicamente entre 4 a 10mseg), de todas formas si es un 16F como en realidad no se 'resetea' funcionará igual pero con el tiempo la aplicación dejará de andar bien.

En cuanto al reset_cpu() depende para que micro lo uses, si es para un 16F lo último que había visto del assembler generado por dicha instrucción era para tener 'excesivo' cuidado.  CCS debiera (si es que no lo hizo) avisar que el uso de dicha función para los 16F debe ser solo en el main.

Si quieres ahondar en el tema, te dejo este link.

http://www.todopic.com.ar/foros/index.php?topic=13890.0


Lo que no acabo de entender es: estando la interrupción deshabilitada, por qué CCS se preocupaba de que contuviese un delay. ¡qué cosas más raras! Simplemente quito el delay y ya todo funciona bien. Sospecho que debe haber algo más...

Bueno, si estás en un 16F, irremediablemente se llenará el stack... provocando un funcionamiento errático a tu software.

« Última modificación: 28 de Enero de 2008, 12:36:51 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: No entiendo enable_interrupts(global)
« Respuesta #8 en: 28 de Enero de 2008, 12:41:18 »
Hola Maunix, es un 18F2455.

Me pongo a estudiar el hilo que me aconsejas. Muchas gracias.

Abandoné el ASM en tiempos del 6502, pero viendo que es la respuesta para todo en esto de los PIC voy a tener que volver sobre él.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: No entiendo enable_interrupts(global)
« Respuesta #9 en: 28 de Enero de 2008, 12:54:37 »
Hola Maunix, es un 18F2455.

Me pongo a estudiar el hilo que me aconsejas. Muchas gracias.

Abandoné el ASM en tiempos del 6502, pero viendo que es la respuesta para todo en esto de los PIC voy a tener que volver sobre él.

El assembly ayuda a comprender el funcionamiento del hardware, pero si lees el funcionamiento del hardware, de cada módulo, etc, no te hará falta usar el assembly.   Lo digo como fan del assembly  :mrgreen: , pero es cierto cuando hay 'problemas' un profundo conocimiento de la arquitectura y del set de instrucciones ayudan bastante a detectar y resolver rápidamente un problema.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: No entiendo enable_interrupts(global)
« Respuesta #10 en: 28 de Enero de 2008, 13:01:47 »
Otra cosa, CCS tiene por costumbre deshabilitar las interrupciones cuando se entra en una ISR, de modo que no se aniden las ISR. Una vez que se atiende la ISR se vuelven a habilitar las interrupciones y como es lógico si alguna se ha activado durante la atención de la ISR anterior se atiende.

Creo que hay una directiva para evitar que CCS te deshabilite las interrupciones cuando entras en una ISR, pero ahora no recuerdo cual es.

Saludos
Reinier

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: No entiendo enable_interrupts(global)
« Respuesta #11 en: 28 de Enero de 2008, 13:13:32 »
Gracias Maunix. Los datasheet de 400 hojas asustan un poco; sólo me leo algunas partes, pero poco a poco voy aprendiendo cosas nuevas gracias a vosotros.

Gracias reiniertl; lo investigaré.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: No entiendo enable_interrupts(global)
« Respuesta #12 en: 28 de Enero de 2008, 13:52:48 »
Otra cosa, CCS tiene por costumbre deshabilitar las interrupciones cuando se entra en una ISR, de modo que no se aniden las ISR. Una vez que se atiende la ISR se vuelven a habilitar las interrupciones y como es lógico si alguna se ha activado durante la atención de la ISR anterior se atiende.
:shock:, sencillamente lo veo innecesario.  El microhardware del PIC automáticamente deshabilita el GIE al ingresar al vector de interrupción y este se rehabilita con un RETFIE.  No le veo el sentido a que el CCS además deshabilite los IE de cada interrupción en particular, jamás se encadenaran.

En un 18F puede que uno inhabilite las interrupciones de alto nivel al ingresar en el bajo nivel, es esto a lo que te refieres? pero llegado el caso no tiene sentido hacer eso porque significa que algo elegimos mal ya que deshabilitar las interrupciones de alto nivel para que las de bajo se ejecuten sin molestias es lo mismo que usar todas de bajo nivel o todas de alto nivel y listo.




- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No entiendo enable_interrupts(global)
« Respuesta #13 en: 28 de Enero de 2008, 14:26:05 »
Yo diría que no se pierden, Reinier. Creo recordar que me ha pasado el caso de llegar una interrupción durante el transcurso de otra y ejecutarse si era más prioritaria, o esperar a la finalización de la actual y ejecutarse luego si era menos prioritaria.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: No entiendo enable_interrupts(global)
« Respuesta #14 en: 28 de Enero de 2008, 14:35:36 »
Me parece que no he entendido bien el concepto, tal vez lo leí luego de un toque de carambuco (tendré que beber buen ron o me van a hechar de aquí)

Bueno nada, es probable que me haya equivocado.


 

anything