todo el trabajo es bueno y el programador no informa de ningún error, pero cuando se conecta un led a un pin de cada puerto, el led parpadeante tiene muy poca luz y la tensión de salida del pin también es baja. ¿Tiene alguna sugerencia sobre este problema? IC dañado?
Como no conocemos ninguna de las especificaciones de su configuración, no podré entrar en demasiados detalles. Sin embargo, la buena noticia es que todo suena como si estuviera funcionando.
El voltaje que producirá un pin, depende del voltaje de entrada para el AtMega16. (Hay algunas excepciones, como el puerto A, etc., pero lo mantendré básico). Entonces, si la MCU funciona con 3vDc y debería esperar ver 3v en un pin de salida que esté activo.
La corriente máxima que puede suministrar (proporcionar) el AtMega16 es de 20 mA. Esto no es demasiado Esta es la razón por la que las personas suelen usar un transistor que se activa mediante un pin Atmega, para controlar los dispositivos que necesitan más energía. Aquí hay un ejemplo del uso de un transistor:
YaquenosabemosquétipodeLEDestáusandoycuálessonsusespecificaciones,¡elhechodequepuedaverloparpadearesfantástico!Aunqueestáoscuro,parecequetienestodolistoyfuncionando.TambiéndeboseñalarqueF_CPU1000000
eslafrecuenciaconlaqueseejecutaelchip.Sielchipesnuevoynolotieneconectadoaunafuentederelojexterna,creoquetienelaconfiguracióncorrecta.LamayoríadelosAtMegavienenconunosciladorinternode8Mhzyunjuegodefusiblesdivididopor8,porloquelafrecuenciadeoperaciónpredeterminadaesde1Mhz.
Comodijo@ChintalagiriShashank,delay_ms()
debeusarseconvaloresmenoresa262ms/MHz.Aquíestáelextractodela Documentación AVR-GCC :
El retraso máximo posible es de 262.14 ms / F_CPU en MHz.
Cuando el usuario solicite un retraso que exceda el máximo posible,
_delay_ms () proporciona una funcionalidad de resolución disminuida. En este modo, _delay_ms () trabajará con una resolución de 1/10 ms, proporcionando
Retrasos de hasta 6.5535 segundos (independientemente de la frecuencia de la CPU). El usuario
no será informado sobre la resolución disminuida.
Si la cadena de herramientas avr-gcc tiene __builtin_avr_delay_cycles (sin signo largo)
soporte, el retraso máximo posible es 4294967.295 ms / F_CPU en MHz. por
valores mayores que el máximo retraso posible, los desbordamientos resultan en
sin demora, es decir, 0 ms.
Aquí hay una versión más limpia de tu código, aunque solo funciona con el Puerto B.
int main (void)
{
DDRB = 0xff; // Set Data Direction for port B as output
sei(); // Enable Interrupts
while(1){
PORTB = 0xff; // 'turn on' all port B pins
_delay_ms(250);
_delay_ms(250);
PORTB = 0x00; // Clear all port B pins
_delay_ms(250);
_delay_ms(250);
}
return 0;
}
Anexo
Como AngryEE señalado , también debe definir F_CPU
ANTES DE #include <util/delay.h>
. Así:
#define F_CPU 1000000
#include <util/delay.h>