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);
}