Warum leuchtet diese LED auf meinem Arduino immer, obwohl ich ihr gesagt habe, dass sie sich ausschalten soll?

Ich bin Softwareentwickler und versuche zu verstehen, wie Computer auf einer niedrigeren Ebene funktionieren.

Ich habe den Arduino Uno Microcontroller gekauft und alle Tutorials von LadyAda befolgt.

Ich habe festgestellt, dass die LED (nicht die Power-LED) immer eingeschaltet ist, es sei denn, sie blinkt, selbst wenn ich das folgende Programm bereitstelle, das den Speicher löscht und die LED ausschalten sollte:

#include <EEPROM.h>

void setup()
{
  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);

  // turn the LED on when we're done
  digitalWrite(13, LOW);
}

void loop()
{
}

Warum leuchtet die LED immer? Ich habe dies gegoogelt und ein paar ähnliche Fragen in einem anderen Forum wie diesem gelesen , aber ich habe noch keine Antwort gefunden.

Warum würdest du erwarten, dass es aus ist? Und was meinst du mit "es sei denn, es blinkt?" Wo ist das Blinken?
Sie werden das EEPROM verschleißen, wenn Sie es kontinuierlich schreiben. Ich denke, es ist in Ihrem Setup in Ordnung, aber beachten Sie die begrenzte Anzahl von Schreibvorgängen in das EEPROM. Tun Sie es nicht, es sei denn, es ist absolut notwendig.
Wenn Sie die LED ausschalten möchten, reduzieren Sie Ihr Programm auf das absolute Minimum: Entfernen Sie die forSchleife, fügen Sie a hinzupinmode(13,OUTPUT);
@Phil Frost, danke. Weil ich es hier ausschalte: DigitalWrite(13,LOW); Bitte bedenken Sie, dass ich ein Anfänger bin, mit Ausnahme von gcse electronics vor 15 Jahren.
@Hippie, danke. Könnten Sie erklären, warum dies das EPROM verschleißen würde? Das Programm kommt mit der IDE.
@ woo51977 Der Kommentar besagt, dass Sie es einschalten. "LOW" bedeutet nicht unbedingt "OFF", je nachdem wie die LED angeschlossen ist.
Es läuft nur während setup() und das ist mir zunächst nicht aufgefallen. Aber EEPROM hat eine begrenzte Anzahl von Programmierzyklen (100.000) und Arduino ist leicht in der Lage, es in kurzer Zeit abzunutzen, wenn es immer wieder beschrieben wird.
Werfen Sie einen Blick auf File => Examples => 01.Basics => Blinkund arbeiten Sie von dort aus, um das Verhalten der LED zu ändern.
@ w0051977 Von welcher LED sprichst du, es ist nicht die Ein-LED, richtig?
@ Garrett Fogerlie, ich glaube, es gibt nur zwei LEDs. Eines ist das Power-Licht. Es ist nicht die Betriebsanzeige, auf die ich mich beziehe.
Und was ist die andere LED? Wie ist es mit dem Mikroprozessor verbunden?
@PhilFrost Die andere LED ist nur eine Betriebsanzeige, sie ist nicht mit der MCU verbunden. Sie können sich meine ursprüngliche Antwort im Bearbeitungsverlauf ansehen, um ein Beispiel dafür zu erhalten, wie sie verbunden ist.

Antworten (3)

Ich glaube, Ihr Problem ist, dass Sie diesen Pin nicht als Ausgang festlegen. Verwenden Sie pinMode(13, OUTPUT)diese Option, um Pin 13 als digitalen Ausgang zu konfigurieren. Da GPIO-Pins als Ein- oder Ausgänge verwendet werden können, müssen Sie dem Mikrocontroller mitteilen, auf welchen Modus dieser Pin eingestellt werden muss.

#include <EEPROM.h>
int led = 13;

// the setup routine runs once when you press reset:
void setup() 
{                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);

  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);

  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
}

void loop() 
{
}

Sie können das grundlegende Hallo-Welt-Beispiel hier sehen , das über das Blinken der Pin-13-LED hinausgeht.

Außerdem sollten Sie beim Schreiben in das EEPROM vorsichtig sein, da es, wie in den Kommentaren erwähnt, nur eine Lebensdauer von ~ 100.000 Zyklen hat.

Danke. Ich beziehe mich auf A. Die Aussage in Ihrer Antwort scheint es nicht auszuschalten.
@ w0051977 Ich habe meine Antwort aktualisiert.
Danke. Könnten Sie erläutern, was Sie meinen mit: "Sie sollten beim Schreiben auf das EPROM vorsichtig sein"? Ich habe dies als Brett zum "Spielen" gekauft, um mein Verständnis zu verbessern. Müsste ich nicht jedes Mal in das EPROM schreiben, wenn ich ein Programm in c erstelle?
@ w0051977 Atmels AVRs haben 3 verschiedene Speichertypen: Flash, EEPROM und RAM. Wenn Sie das Board programmieren, schreibt es normalerweise nur in den Flash-Speicher des AVR, sodass das EEPROM ziemlich unberührt bleibt. Es gibt auch einen Bootloader im Flash-Bereich, Ihr Programm wird nach dem Bootloader zum Flash hinzugefügt. Mit dem Bootloader können Sie den Atmega-Prozessor über seriell (oder USB zu seriell) programmieren. Aber haben Sie keine Angst, damit zu spielen, beachten Sie nur, dass er eine begrenzte Lebensdauer hat.
Danke. Das Programm in Ihrer Antwort hat die LED ausgeschaltet.
@w0051977 es hat es mit ausgeschaltet digitalWrite(led, HIGH)oder hast du benutzt digitalWrite(led, LOW)?
Ich habe diese Aussage in LOW geändert.

Niemand hat die Frage wirklich beantwortet. Warum erlischt die LED nur, wenn Pin 13 bei Digital Write LOW auf OUTPUT gesetzt wird? Sicher, ich verstehe, dass im INPUT-PULLUP-Modus über einen Pull-up-Widerstand Spannung an den Pin angelegt wird, wodurch die LED theoretisch schwach leuchten kann. Aber die Realität ist, dass die LED hell leuchtet, wenn Pin 13 ein INPUT ist, niedrig oder hoch. Wenn Pin 13 auf INPUT/LOW gesetzt ist (was die Standardeinstellung beim Einschalten ist), woher kommen die Spannung und der Strom, um die LED anzusteuern? Und wagen Sie es nicht, wieder über den Pull-up-Widerstand zu quatschen. Wie gesagt, die LED ist hell, egal ob Pin 13 INPUT-LOW oder INPUT-HIGH ist.

Es scheint, dass der UNO r3 anders funktioniert als frühere Versionen. REF-Schema: http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf Pin 13 ist ein Eingang für einen Operationsverstärker. Wenn an Pin 13 eine Spannung anliegt, passt der Operationsverstärker diese Spannung an seinem Ausgang an, die die LED ansteuert. Da INPUT-Pins eine hohe Impedanz haben, schwebt ihre Spannung ohne einen Pull-Down-Widerstand, oder vielleicht gibt es eine winzige Leckage vom Mikrocontroller und ohne einen Pull-Down-Widerstand liegt Spannung am Pin an. Operationsverstärkereingänge haben eine theoretische unendliche Impedanz.

Dies ist eine Designverbesserung. Mit der alten Version konnte Pin 13 nicht als INPUT-PULLUP verwendet werden, da die Spannung nur 1,7 V betragen würde, da die LED den Strom abführt, der durch den Pull-up-Widerstand kommt. Mit dem UNO R3 wird der Operationsverstärker den Pull-up-Strom nicht ableiten, sodass wir Pin 13 als INPUT_PULL-UP festlegen können. Der Pro-mini hat jedoch noch das alte Design, und wenn Sie Pin 13 als INPUT-PULLUP verwenden möchten, müssen Sie den Widerstand von der Platine schnippen.

Nur zu deiner Information. Es gibt einen Stack für Arduino arduino.stackexchange.com
Dies sollte die akzeptierte Antwort sein. Die Frage war, warum etwas passiert. Die andere Antwort zeigt nur eine Problemumgehung.

Jeder, der Probleme mit L (Pin 13) auf Ihrem Arduino Uno hat, fügen Sie diesen Code so wie er ist auf einem leeren Bildschirm im IDE-Fenster ein. Es wird das Problem lösen.


const int led = 13;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led,LOW);
}

Hoffe das hilft :)