El LED parpadea mientras el bucle no funciona AVR timer 0

0

Es extraño y raro. Estoy tratando de parpadear un LED en PD0 a 2hz, pero no funciona. Me parece que mientras loop no funciona en absoluto. He revisado el código triple. ¿Cuál es el problema aquí?

uint8_t c=0; 

int main(void){

DDRD= 1<<0 ;
TCCR0 = (1 << CS02) |  (1 << CS00); // (clk_i/o )/1024 ( Prescaler) 

TIMSK |= 1<< TOIE0;
sei();

  while (1){ 
  if ( c >=30 ) { PORTD ^= 1<<0; c=0; }                //61.035/30= 2.034 hz
  }

  }

ISR (TIMER0_OVF_vect){
  c++;   //16000000/1024/256=61.035 hz
  }  

Por supuesto, yo sé la solución. Es mediante la adición de una línea aleatoria de código al bucle while, y funciona de nuevo. ¡¡Extraño!! ¿Cuál sería el problema? error del compilador ??

uint8_t c=0; 

int main(void){

DDRD= 1<<0 ;
TCCR0 = (1 << CS02) |  (1 << CS00); // (clk_i/o )/1024 ( Prescaler) 

TIMSK |= 1<< TOIE0;
sei();

  while (1){ 
  if ( c >=30 ) { PORTD ^= 1<<0; c=0; }                //61.035/30= 2.034 hz
  _NOP();
  }

  }

ISR (TIMER0_OVF_vect){
  c++;   //16000000/1024/256=61.035 hz
  }  
    
pregunta Atmega 328

1 respuesta

5

Al NO declararlo volátil, le da permiso al compilador para optimizar.

En el primer bucle, el compilador conoce el valor de C en todo momento, porque nada más en el bucle puede modificar C (y no es volátil), por lo que C siempre es 0, el bucle no necesita hacer cualquier cosa. El código funciona perfectamente porque eso es lo que pediste.

En el segundo bucle, llamas a un procedimiento (oops, función de vacío) NOP() que podría hacer absolutamente cualquier cosa. Entonces, a menos que el compilador realice un análisis completo del programa en todas las bibliotecas (y no lo hace), ¿cómo sabe si NOP() modifica C?

No, por lo que no puede hacer suposiciones sobre el valor de C y debe recuperarlo de la memoria.

El segundo programa no está funcionando , hace lo que usted espera por accidente .

Si la "línea adicional aleatoria" no involucró una llamada, por ejemplo, era una instrucción NOP del ensamblado en línea, probablemente verías un comportamiento diferente.

Declare C volatile.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas