Modificando la variable dentro del vector de Interrupción. AVR

0

Mi pregunta es de nuevo sobre la modificación de variables dentro del ISR. Si la variable se usa solo dentro de ISR, no tengo que declararla como volátil, ¿verdad? Después de investigar un poco, descubrí que la variable debía declararse como estática y dentro de la función ISR. Pero tampoco ayudó.
Estoy usando Arduino Ide, así que no tengo muchas opciones de depuración. Estoy usando un indicador LED para verificar si la variable se ha incrementado, como puede ver a continuación:

ISR(TIMER2_COMPA_vect) {
  static  unsigned int count20ms = 0;
  count20ms += 5;
  PORTD ^= (1 << PD6);        // Indicates that ISR executes
  if (count20ms == 10) {
     PORTD ^= (1 << PD7);      // Indicates that counter incremented
     count20ms = 0;
  }
}

Puedo observar que ISR se ejecuta a través de un LED parpadeante en el PD6. Pero Condición cuenta20ms == 10 nunca es cierto. Y así, el LED conectado al PD7 nunca parpadea.
¿Cómo debe comportarse una variable estática?

    
pregunta DaurenD

2 respuestas

3

La gente en avrfreaks.net me respondió

  

Blockquote   Sí, pensé que sí, habilitas las interrupciones COMPA, COMPB y OVF, pero solo proporcionas ISR () para COMPA. Tan pronto como ocurran las otras dos condiciones, saltarán a _bad_interrupt y desde allí "JMP 0" para que el AVR siga "reiniciando".

No proporcioné el controlador de interrupciones para las interrupciones que tenía habilitadas. La acción predeterminada del compilador AVR para esta situación se restablece.

Código de configuración, donde TIMSK2 es responsable de habilitar las interrupciones:

void setup() {
  DDRD = 0xff;
  TCCR2A = (1 << WGM12);            
  TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); 
  TIMSK2 = 0x07;            // <<<<< Enabling 3 Interrupts vectors
  TCNT2 = 0x00;             
  OCR2A = 250;              
}

Habilitando 3 Interrupciones de vectores, pero proporcionando solo un manejador. Eso hizo que el AVR se reiniciara.

Más información sobre las interferencias de AVR aquí

    
respondido por el DaurenD
0
  

Entonces, si la variable se usa solo dentro de ISR, no tengo que declararla como   volátil, ¿verdad?

La volatilidad se usa si una variable puede cambiar sin el conocimiento del compilador. Por ejemplo, si lee un registro dos veces, el compilador puede decidir que la segunda lectura es inútil y optimizarlo. Declarar una variable utilizada para leer un registro volátil hará que el compilador haga lo que usted codificó. También se usa para variables que no tienen un propósito aparente. Por ejemplo, una configuración de variable para contar solo el número de veces a través de una sección de código se puede usar en la depuración a través de la inspección utilizando el IDE (no con el IDE de Arduino sino con otros). Dado que la variable aparece en el compilador como no utilizada, el compilador puede optimizarla.

    
respondido por el st2000

Lea otras preguntas en las etiquetas