En este ejemplo la funcion delay(...) se pierde. En la simulacion se salta.
Ya este ejemplo ya lo hice con cvavr, iar y trabaja normal.
En un atmega8.
#include <avr/io.h>
void delay( unsigned int a)
{
while(a){
a--;
}
}
int main(void){
char a=0;
DDRB=255;
PORTB=0x00;
delay(50);
while(1){
PORTB=a;
++a;
delay(10000);
if(a>254)
a=0;
}
return 0;
}
Si activas la optimización es lógico que elimine el delay, el compilador ve un bucle que no hace nada y lo elimina. Sino quieres lo mantenga puedes poner esto.
volatile unsigned int b;
void delay( unsigned int a)
{
b = a;
while(b){
b--;
}
} Aunque lo mejor es que uses las funciones de delay que vienen con avr-gcc. Bien las funciones que se encuentran en "util/delay.h" y que requieren que actives la optimización, que uses valores constantes para llamar a las funciones y que definas den el código la velocidad a la que esta funcionando el microcontrolador (# define F_CPU) para que funcionen correctamente.
void _delay_us(double __us)
void _delay_ms(double __ms)
O las funciones de delay básicas ("util/delay_basic.h")
static inline void _delay_loop_1(uint8_t __count); //Cosume 3x __count ciclos de CPU
static inline void _delay_loop_2(uint16_t __count); //Cosume 4x __count ciclos de CPU
Saludos,
Miguel Ángel.