ATmega32A _delay_ms después de las llamadas IO

0

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.

    
pregunta 4pie0

1 respuesta

1

Volvería a comprobar cómo está conectado el LED al ATmega32. Si PA0 está conectado al cátodo (terminal negativo) del LED, el ajuste del pin a bajo (masa) causaría que se encienda y no se apague. Esto se considera una configuración 'baja activa' ya que el LED está activo (encendido) cuando la salida es baja. También puede tener controles bajos activos cuando usa transistores para cambiar una carga dependiendo de cómo están conectadas las cosas.

    
respondido por el Gorloth

Lea otras preguntas en las etiquetas