El LED parpadeante con ATMega8 no parpadea

Como soy un completo novato, pensé en comenzar con algo realmente simple: hacer que un led parpadee. Según varios sitios web, esto es algo que todo el mundo debería poder hacer... Hmmm... En mi caso, el LED no hace nada. Permanece oscuro. ¿Por qué?

Este es el programa que he escrito (en una máquina con Ubuntu 12.04):

#define F_CPU 1000000UL

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

void sleep(int milliseconds)
{
while (milliseconds > 0)
{
    _delay_ms(1);
    milliseconds--;
}
}

int main()
{
// set lowest bit to output in DDRB register
DDRB |= 0x01;

while(1)
{
    // switch led on
    PORTB &= 0x01;
    sleep(500);

    // switch led off
    PORTB &= 0x00;
    sleep(500);
}

return 0;
}

Luego seguí estos pasos:

  1. Compilé mi programa:

    avr-gcc -mmcu=atmega8 prueba-001-parpadeo.c -o prueba-001-parpadeo.o -Os

  2. Maleficio

    avr-objcopy -j .text -j .data -O ihex test-001-blinkingled.o test-001-blinkingled.hex

  3. Subido al microcontrolador (usando un AVRISPmkII):

    sudo avrdude -p m8 -P usb -c avrispv2 -U flash:w:test-001-blinkingled.hex -F -v

con el siguiente resultado:

salida avanzada

Esta es una imagen de mi circuito muy básico: (utilizo un viejo adaptador de 9 V para la alimentación, así que usé 2 resistencias para regular el voltaje a 4,95 V)

Mi circuito de protoboard

¿Qué estoy haciendo mal? Si ves otras cosas extrañas o estúpidas, ¡edúcame!

Nunca use resistencias para "regular" el voltaje. ellos no Utilice un regulador de voltaje adecuado. Esto es probablemente parte de su problema.
Tiene reloj interno? Necesita tapas de desacoplamiento de la fuente de alimentación además de usar un regulador adecuado.
¡Eres un mago! ¿Dónde está la conexión entre su computadora y el chip ATMEGA8?

Respuestas (3)

cuatro problemas

  1. Está utilizando un divisor de voltaje de resistencia para alimentar su MCU. Malo. Malo malo. Necesitas un regulador adecuado. O una fuente de alimentación USB (IE 5v). Diablos, use 3 baterías AA en lugar de 9v si no tiene un regulador. ¿La línea ATMega puede tomar qué, rango normal de 2.5 a 5v? No tiene nada que realmente dependa de un 5v completo, sin código sensible/dependiente del reloj.

  2. Solo alimenta un lado del ATMega. Hay dos pines de alimentación y dos de tierra. NO son redundantes. Un conjunto es Digital VCC y GND, el otro es Analógico VCC y GND. Idealmente, debe usar un inductor entre los pines DVCC y AVCC, para circuitos analógicos sensibles al ruido, pero como mínimo, DVCC y AVCC deben estar conectados, al igual que DGnd y AGnd.

  3. También se recomienda un límite de desacoplamiento para ambos (~0,1 uf), pero podría usar uno solo para DVCC/DGnd.

  4. Utiliza un bit a bit Y (&). Solo se establecerán los bits que ya están configurados. [0 & 1 = 0] [1 & 0 = 0] [0 & 0 = 0] [1 & 1 = 1]
    Su código nunca encenderá el LED. Necesita un OR bit a bit | (la barra vertical o tubería) para encenderlo. Un Bitwise Y con un bit invertido lo apagará (PortB &= ~0x01). Alternativamente, se puede usar un Bitwise XOR ^ (símbolo de intercalación) para alternar.

PORTB |= 0x01;
sleep(500);

PORTB &= ~0x01;
sleep(500);

PORTB ^= 0x01;
sleep(500);

AVR Freaks tiene un excelente tutorial sobre operaciones bit a bit aquí , para C general, pero también se enfocan en AVR/Atmega/Attiny, incluida la manipulación de puertos/bits.

Hola... ¿Puede indicarme un tutorial bueno y fácil de entender sobre este direccionamiento bit a bit de los puertos IO? Muchas gracias
// switch led on
PORTB &= 0x01;
sleep(500);

// switch led off
PORTB &= 0x00;
sleep(500);

No exactamente. Dado que su LED está atado bajo, debe configurar el bit de puerto alto para encenderlo.

PORTB |= _BV(PB0);

Y necesita configurarlo bajo para apagarlo.

PORTB &= ~_BV(PB0);
#define F_CPU 1000000UL

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



void main() 
{
DDRB |= 0x01;

while(1)
{
  // switch led on
   PORTB |= 0x01 ; ///
   _delay_ms(500) ;      

  // led off
   PORTB  &= ~0x01; 
  _delay_ms(500) ;
 }
Tenga en cuenta que la pregunta tiene una respuesta aceptada hace tres años.
Y nadie cubrió el no usar resistencias en serie para ATMega8, ¿pueden conducir directamente?