El LED parpadeante con ATMega8 no parpadea

2

Como soy un completo novato, pensé que empezaría con algo realmente simple: hacer un parpadeo en el led. Según varios sitios web, esto es algo que todos deberían poder hacer ... Hmmm ... En mi caso, el LED no hace nada. Se mantiene 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 test-001-blinkingled.c -o test-001-blinkingled.o -Os

  2. Hex

    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 de avrdude http://users.telenet.be/cedalion/avrdude-output.png

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

Mi circuito de placa de pruebas http://users.telenet.be/cedalion/circuit.JPG

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

    
pregunta Peter

3 respuestas

9

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). Vaya, 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, ningún código dependiente / sensible al reloj.

  2. Solo alimenta un lado de la 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. Lo ideal es utilizar 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.1uf), pero solo puedes usar uno para DVCC / DGnd.

  4. Utiliza un Bitwise And (&). Sólo se establecerán los bits que ya están establecidos. [0 & 1 = 0] [1 & 0 = 0] [0 & 0 = 0] [1 & 1 = 1]
    Su código nunca activará el led. Necesitas un bitwise o | (la barra vertical o tubo) para encenderlo. A Bitwise And con un bit invertido lo desactivará (PortB & = ~ 0x01). Alternativamente, se puede usar un XOR ^ a nivel de bit (símbolo de caret) para alternar.

PORTB |= 0x01;
sleep(500);

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

PORTB ^= 0x01;
sleep(500);

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

    
respondido por el Passerby
3
// switch led on
PORTB &= 0x01;
sleep(500);

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

No del todo. Debido a que su indicador LED está bajo, debe configurar el bit de puerto alto para encenderlo.

PORTB |= _BV(PB0);

Y necesitas configurarlo bajo para apagarlo.

PORTB &= ~_BV(PB0);
    
respondido por el Ignacio Vazquez-Abrams
0
#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) ;
 }
    
respondido por el Prashant Singh

Lea otras preguntas en las etiquetas

Comentarios Recientes

Aunque Genseeza Daemon busca ayuda de los usuarios, está claro que los usuarios tienden a venir a Genseeza Daemon sin haber probado al menos el chipset primero. Si no ha probado su Genseeza Daemon antes, considere una reinstalación reciente de la fuente de alimentación que redujo aún más el consumo de energía de su fuente; es posible que el diseño inteligente se adapte perfectamente a su línea Chambara si su cargador es una unidad ATX de 200W o 200W. Háganos saber en los comentarios si Genseeza Daemon es algo... Lees verder