Estoy tratando de aprender cómo escribir programas en el microcontrolador, y comencé con cosas muy simples como el parpadeo del LED con una frecuencia determinada o controlado por un botón. Sin embargo, tengo problemas con el uso de _delay_ms () de delay.h. Como entendí, para el correcto trabajo de esta función, la optimización debe estar activada . Cuando escribo un programa en el microcontrolador, en lugar de parpadear el LED, el LED se enciende constantemente con bajo brillo. Cuando intenté simplemente encenderlo sin demoras, el brillo es mucho mayor, así que por alguna razón el microcontrolador da un poco de voltaje intermedio, me pregunto por qué y cuál podría ser el problema. A continuación describo exactamente lo que estaba haciendo. El código (main.c) se ve así (estoy usando attiny26, y supongo que funciona a 1MHz).
#define F_CPU 1000000UL // 1 MHz clock speed
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA |= (1<<PA0); //A0 as output
while(1) //infinite loop
{
PORTA |= (1<<PA0);// LED at A0 ON
_delay_ms(1000); // 1 second delay
PORTA &= ~(1<<PA0); //LED at A0 OFF
_delay_ms(1000); // 1 second delay
}
}
Hago un archivo de objeto con
avr-gcc -mmcu=attiny26 -O1 -c main.c
donde -O1 es para el nivel 1 de optimización. Entonces
avr-objcopy -O ihex main.o main.hex
y escriba al microcontrolador:
sudo avrdude -c usbasp -p t26 -B 100 -U flash:w:main.hex:i
Todos los pasos fueron completamente sin ningún error o advertencia. Como dije antes, el comportamiento resultante es extraño: el LED está encendido constantemente con brillo bajo de litio. Mientras tanto, si escribo en el programa del microcontrolador, donde simplemente enciendo el LED (eliminar todos los retrasos), el LED se encenderá con el brillo completo. Estaba pensando si la optimización en sí misma puede ser un problema, pero en el régimen sin demoras, el programa funciona correctamente en cualquier caso, con optimización o sin.
Controlar cualquier cosa con el botón requeriría el desalojo, y la misma función _delay_ms (), que no funciona para mí.
UPD : comentar #define F_CPU 1000000UL
o aumentar el argumento de _delay_ms()
no ayuda. Pero aumentar el tiempo de retardo al hacer la iteración for (i=0; i<100000; i++) {_delay_ms(1000);}
hace que el LED se encienda constantemente con brillo total. Los tiempos de iteración más pequeños probados (10, 100, 1000, 10000) no proporcionan el brillo total del LED.