AVR extraño comportamiento del LED de conmutación

2

Sigo un tutorial básico para AVR .

Todo parece bien pero la velocidad? El problema es que si dejo la velocidad del xtal comentado, el código funciona, pero si lo coloco en 8 MHz o 16 MHhz [Estoy usando una placa Arduino con 328p], el led permanece encendido por mucho tiempo y no responde. Entonces, ¿por qué si dejo la velocidad comentada funciona?

Verifiqué la velocidad en los fusibles y la cambié a 8 interna, 16 MHz externa y el mismo problema, ¿qué es esta trampa noob?

Aquí el código del enlace:

//#define F_CPU 16000000UL         /* 8MHz crystal oscillator */

    #define BUTTON_PORT PORTB       /* PORTx - register for button output?? PULL UP? */
    #define BUTTON_PIN PINB         /* PINx - register for button input */
    #define BUTTON_BIT PB3          /* bit for button input/output */

    #define LED_PORT PORTD          /* PORTx - register for LED output */
    #define LED_BIT PD4             /* bit for button input/output */
    #define LED_DDR DDRD            /* LED data direction register */

    #define DEBOUNCE_TIME 25        /* time to wait while "de-bouncing" button */
    #define LOCK_INPUT_TIME 250     /* time to wait after a button press */



#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>

/* function prototypes */

void delay_ms(uint16_t ms);
void init_io();
int button_is_pressed();
void toggle_led();

int main(void)
{

    init_io();

    while(1)
    {
        if (button_is_pressed())
        {
            toggle_led();
            _delay_ms(LOCK_INPUT_TIME);
        }
    }
}

void init_io()
{
    /* set LED pin as digital output */
    LED_DDR = _BV (LED_BIT);

    /* led is OFF initially (set pin high) */
    LED_PORT |= _BV(LED_BIT);

    /* turn on internal pull-up resistor for the switch */
    BUTTON_PORT |= _BV(BUTTON_BIT);
}

int button_is_pressed()
{
    /* the button is pressed when BUTTON_BIT is clear */
    if (bit_is_clear(BUTTON_PIN, BUTTON_BIT))
    {
        _delay_ms(DEBOUNCE_TIME);
        if (bit_is_clear(BUTTON_PIN, BUTTON_BIT)) return 1;
    }

    return 0;
}

void toggle_led()
{
    LED_PORT ^= _BV(LED_BIT);
}
    
pregunta MaKo

1 respuesta

1

¿Podría indicar qué tipo de AVR tiene?

Pensaría que mientras no defina la F_CPU, la rutina de demora tomará el valor predeterminado para calcular la demora. Ahora, si simplemente le dice a la CPU que asuma un reloj más rápido (esto es lo que hace al redefinir F_CPU), tiene que contar mucho más para alcanzar el mismo retraso. Como el reloj físico sigue siendo lento, la demora se desactivará por algún factor muy desagradable.

Si está utilizando Atmel Studio 6 (+), eche un vistazo al asistente ASF que tiene una plantilla específica para el sysclock. Entonces solo es cuestión de definir correctamente board_sysclk.h (que se genera automáticamente) y una llamada a sysclk_init ();

¿Qué es lo que realmente conectaste con el pin externo?

Además, se debe tener cuidado al exceder un valor específico (esto difiere para varias partes). En el caso de una frecuencia de reloj alta, deberá ajustar los estados de espera del flash antes de cambiar la fuente del reloj.

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas