Cómo contar usando interrupciones

1

Tengo un problema en el que quiero contar cuántas veces presiono un interruptor usando una interrupción. Intenté colocar la variable de conteo dentro de la principal, pero afirma que el conteo no existe. Pongo el recuento dentro del pragma, pero sé que se restablecerá el valor del recuento a 0. ¿Cómo debo abordar este problema?

Estoy usando el STM8S003K3

volatile int count = 0;

#pragma vector = 8
__interrupt void EXTI_PORTD_IRQHandler(void){   
   count++;
   PD_ODR_ODR3 = !PD_ODR_ODR3;
}

void main() {
   __disable_interrupt();
   PD_ODR = 0;             //  All pins are turned off.
   PD_DDR = 0xff;          //  All pins except PD4 are outputs.
   PD_CR1 = 0xff;          //  Push-Pull outputs.
   PD_CR2 = 0xff;          //  Output speeds up to 10 MHz.
   //
   //  Now configure the input pin.
   //
   PD_DDR_DDR4 = 0;        //  PD4 is input.
   PD_CR1_C14 = 0;         //  PD4 is floating input.
   //
   //  Set up the interrupt.
   //
   EXTI_CR1_PDIS = 2;      //  Interrupt on falling edge only.
   EXTI_CR2_TLIS = 0;      //  Falling edge only.
   __enable_interrupt();

   while (1) {
       __wait_for_interrupt();
   }
}
    
pregunta G. Han

1 respuesta

3

Conviértalo en una variable global volátil; Declararlo e inicializarlo fuera de todas las funciones. Luego incrementa dentro de su ISR e imprime el valor modificado en main (). Algo como:

static volatile int count = 0;

isr(){
  count++;
...
}

void main(){
  debug_print(count);
...
}

La palabra clave volátil es para evitar que su compilador optimice la variable, ya que no se ve que cambie en el flujo normal del programa.

EDITAR: Declarar la variable estática, como sugirió Lundin, restringe su alcance a este archivo en particular, para que la variable no sea visible fuera de este archivo de origen. Debe usar esto solo si el ISR y main () están definidos dentro del mismo archivo.

    
respondido por el TisteAndii

Lea otras preguntas en las etiquetas