Estoy cargando el siguiente código en ATmega32A PU 1535 para encender el LED en el pin 40, PORTA 0:
#include <avr/io.h>
#include <util/delay.h>
#define __DELAY_BACKWARD_COMPATIBLE__
#ifndef F_CPU
#define F_CPU 16000000UL /* 16 MHz clock speed */
#endif
int
main(void)
{
DDRA |= (1<<PA0); /* Nakes PORTA as output */
while (1)
{
PORTA |= (1<<PA0); /* turn 1st led on */
_delay_ms(150); /* 0.15s delay, but is on by 10ms actually */
PORTA &= ~(1<<PA0); /* turn led off */
_delay_ms(10); /* delay 0.01s, but is off by 150ms actually*/
}
}
El LED parpadea, pero como se señaló en el LED de comentarios está encendido a 10 ms y a 150 ms. ¿Cómo es así? La única forma en que puedo obtener este resultado es que los retrasos realmente se llaman antes de IO, como este:
_delay_ms(150)
PORTA |= (1<<PA0); /* turn 1st led on */
_delay_ms(10);
PORTA &= ~(1<<PA0); /* turn led off */
Ya que _delay_ms no advierte contra las optimizaciones del compilador ni da sugerencias especiales en esa dirección debo estar haciendo algo mal.