Mi primer programa AVR C- el LED no parpadea

6

Creé un programa simple para colocarlo en un chip ATMega328P ( Hoja de datos ). Escribí mi primer programa en el estudio ATMEL que quería usar para parpadear un LED a una velocidad de 0.5Hz con un consumo de energía extremadamente bajo. Aquí está mi código:

/*
 * GccApplication1.c
 *
 * Created: 11/12/2017 8:56:49 PM
 * Author : Brice
 */ 

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

int main(void)
{
    clock_prescale_set(clock_div_128); //set the clock to use the 8MHz internal clock divided by 128 for an internal frequency of 250KHz, consumes 0.4mA while not sleeping.

    while (1) 
    {
        PORTD4 == 1;//Set pin 13 of the micro to high.
        _delay_ms(1000);
        PORTD4 == 0;//Set pin 13 of the micro to low;
        _delay_ms(1000);
    }
}

Lo que espero que haga este código con este microcontrolador es activar el registro PORTD 4 durante 1 segundo, luego desactivarlo por un segundo.

actualmente, el PortD4 no tendrá cambios de voltaje y permanecerá conectado a tierra mientras el dispositivo esté encendido.

Cualquier explicación de esto sería apreciada!

Para esta instancia, estoy usando la mini placa Arduino Pro para la creación de prototipos ..

el pin 4 del Pro mini está conectado al ánodo común de un led RGB, y el pin G del LED está conectado desde una resistencia de 510 Ohmios a GND. He probado el cableado con un arduino en funcionamiento, y las luces LED se iluminaron a 3.3 voltios con bastante brillo.

    
pregunta tuskiomi

3 respuestas

5
int main(void)
{
    clock_prescale_set(clock_div_128); //set the clock to use the 8MHz internal clock divided by 128 for an internal frequency of 250KHz, consumes 0.4mA while not sleeping.

    while (1) 
    {
        PORTD4 == 1;//Set pin 13 of the micro to high.
        _delay_ms(1000);
        PORTD4 == 0;//Set pin 13 of the micro to low;
        _delay_ms(1000);
    }
}

El problema es cómo "configura" el puerto, está utilizando == , que es un operador de comparación, no una asignación. Intenta simplemente usando = .

void main()
{
    DDRD = 0xFF;         //PD as output
    PORTD= 0x00;         //keep all LEDs off

    while(1)
    {
        PORTD &= 0b11110111;       //turn LED off
        _delay_ms(500);   //wait for half second
        PORTD |= 0b00001000;       //turn LED on 
        _delay_ms(500);   //wait for half second
    }        
}

Es posible que también deba establecer la dirección del puerto en algún lugar. Para hacerlo, establezca DDRD como 0b00001000 , lo que debería establecer el Pin 4 del puerto D en una salida.

    
respondido por el Ron Beyer
2

Tres problemas:

  1. Si está retrasado.h, debe definir la velocidad de la CPU. #define F_CPU 8000000UL en su caso.
  2. El puerto D debe configurarse como una salida al establecer el bit 4 en el registro DDRD, generalmente antes del superloop. %código%
  3. PORTD4 no es la forma de acceder a ese pin de puerto. Usaría PORTD, de manera similar a como demostré el registro DDRD anterior. Personalmente, reescribiría su superloop a:

    while (1) 
    {
        PORTD ^= 0b00010000;
        _delay_ms(1000);
    }
    
respondido por el Matt Young
-2

Al final, lo único que estaba mal con el código eran las correcciones, pero el principal problema canónico de esta situación era una placa arduino defectuosa. un simple reemplazo solucionó el problema.

    
respondido por el tuskiomi

Lea otras preguntas en las etiquetas