Mein erstes AVR C Programm - LED blinkt nicht

Ich habe ein einfaches Programm erstellt, das auf einen ATMega328P-Chip ( Datenblatt ) gesetzt werden soll. Ich habe mein erstes Programm in ATMEL Studio geschrieben, mit dem ich eine LED mit einer Rate von 0,5 Hz bei extrem geringem Stromverbrauch blinken lassen wollte. Hier ist mein Code:

/*
 * 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);
    }
}

Ich erwarte, dass dieser Code mit diesem Mikrocontroller PORTD-Register 4 für 1 Sekunde einschaltet und dann für eine Sekunde ausschaltet.

Derzeit hat der PortD4 keine Spannungsänderungen und bleibt geerdet, während das Gerät mit Strom versorgt wird.

Jede Erklärung dazu wäre willkommen!

In diesem Fall verwende ich das Arduino Pro Mini-Board für das Prototyping.

Pin 4 des Pro mini ist mit der gemeinsamen Anode einer RGB-LED verbunden, und der G-Pin der LED ist von einem 510-Ohm-Widerstand mit GND verbunden. Ich habe die Verkabelung mit einem funktionierenden Arduino getestet, und die LED leuchtet sogar bei 3,3 Volt ziemlich hell.

Geben Sie hier die Bildbeschreibung ein

Wie hast du die LED verkabelt?
@RonBeyer Pin 4 des Pro mini ist mit der gemeinsamen Anode einer RGB-LED verbunden, und der G-Pin der LED ist von einem 510-Ohm-Widerstand mit GND verbunden. Ich habe die Verkabelung mit einem funktionierenden Arduino getestet, und die LED leuchtet sogar bei 3,3 Volt ziemlich hell.
PORTD4 == 1; //CHECK IF pin 13 of the micro to high. Pin 13 wird nicht gesetzt.
Das von Ihnen verlinkte Datenblatt ist für den ATmega32, nicht für den ATmega328! Dies sind völlig getrennte Prozessoren. Wenn Sie das Datenblatt der 32er als Referenz verwenden, werden Sie es sehr schwer haben :-) Das ist das richtige: atmel.com/images/…
Sie müssen Compiler-Warnungen aktivieren. Dieser Code hätte auf keinem anständigen Compiler sauber kompiliert werden dürfen.
@Lundin hat es nicht. Der Compiler beschwert sich darüber, dass F_cpu nicht definiert ist.
Es sollte so etwas wie "Wertberechnung wird nicht verwendet" sagen und auf die Fehler hinweisen.

Antworten (3)

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);
    }
}

Das Problem ist, wie Sie den Port "einstellen", den Sie verwenden, ==der ein Vergleichsoperator ist, keine Zuweisung. Versuchen Sie es einfach mit =.

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
    }        
}

Möglicherweise müssen Sie auch die Richtung des Ports irgendwo einstellen. Sie würden dies tun, indem Sie DDRDto be 0b00001000setzen, was Pin 4 von Port D auf einen Ausgang setzen sollte.

Sehen Sie sich meine Bearbeitung an, Sie können PORTDdirekt anschreiben, ich habe den einfachsten Weg gezeigt, aber Sie können auch ein bisschen manipulieren, wie zPORTD &= ~(1 << 4)
Nein, ich werde es entfernen, war nur ein Tippfehler, der keinen Compilerfehler verursacht.
Was bedeutet "|="?
@KrishnShweta "Or Equals", es ist eine andere Schreibweise:PORTD = PORTD | 0b00001000;
Ich verstehe das Konzept von "==" und "=", aber was ist die Notwendigkeit, &= und |= zu schreiben?
@KrishnShweta Es ist eine Abkürzungsmethode, ähnlich wie +=, ++, -=, --, usw. Es ist nur eine Kurzschrift, es wird zu demselben kompiliert. Ich persönlich finde es einfacher zu lesen.
Hey, Ron. Ich habe meinen Code geändert, was in der Frage vergeblich ist. Ich werde ein anderes Board ausprobieren, um zu sehen, ob ich ein schlechtes habe.
@tuskiomi Sehen Sie sich diese verwandte Frage an, da Sie anscheinend ein ähnliches Problem haben.
@RonBeyer Ich habe das Problem herausgefunden - siehe meine Antwort unten, aber ich akzeptiere deine, weil es eine konventionellere Lösung ist.
@Krishn Shweta ist einer der Grundoperatoren. Sie müssen zuerst C lernen. Ohne C-Kenntnisse können Sie uC nicht programmieren
@ PeterJ_01 Ich kenne c und ich lerne heutzutage Embedded C :) Ich habe eigentlich gefragt, was das nützt, wenn es = statt == ist ... Meine Formulierung war falsch
Ich habe meine LED-Blinkprogramme in Embedded C gemacht, dort habe ich "& |" nicht verwendet. also habe ich mich darüber gewundert. @PeterJ_01

Drei Probleme:

  1. Wenn Sie delay.h sind, müssen Sie die CPU-Geschwindigkeit definieren. #define F_CPU 8000000ULin Ihrem Fall.
  2. Port D muss als Ausgang eingestellt werden, indem Bit 4 im DDRD-Register gesetzt wird, typischerweise vor der Superschleife.DDRD = 0b00010000
  3. Mit PORTD4 greifen Sie nicht auf diesen Port-Pin zu. Sie würden PORTD verwenden, ähnlich wie ich oben das DDRD-Register demonstriert habe. Persönlich würde ich Ihren Superloop umschreiben zu:

    while (1) 
    {
        PORTD ^= 0b00010000;
        _delay_ms(1000);
    }
    
^= ist das xor op, richtig? Außerdem unterscheidet sich Ihr Bit, das Sie setzen, von Rons. Er verwendet den vierten von links, warum verwenden Sie den vierten von rechts?
@tuskiomi das ist es
Würde ich auch den Wert von F_CPU ändern wollen, da ich einen Taktteiler verwende, um Strom zu sparen?
@tuskiomi Stellen Sie F_CPU auf die Taktfrequenz in Hz ein. Ich würde mich nicht um den Taktteiler kümmern. Die Energieeinsparungen auf diesem Niveau sind vernachlässigbar.

Am Ende war das einzige, was am Code falsch war, die Korrekturen, aber das kanonische Hauptproblem dieser Situation war ein fehlerhaftes Arduino-Board. ein einfacher Austausch hat das Problem behoben.

Warum die negativen Stimmen? Dies hat das Problem behoben
Ich habe nicht abgelehnt, aber Sie sind nicht spezifisch genug. Was waren die Änderungen? Das ist keine gute Antwort
@laptop2d der Arduino Pro Mini wurde gemauert. Ich habe ein neues verwendet, um das Problem zu beheben. was ist nicht zu verstehen?