LED Blinken ohne millis und delay

Hallo Leute,

ich möchte 2 Leds zum Blinken/toggeln bringen, aber das ganze ohne die Funktionen millis und delay realisieren...

Hat jemand eine einfache idee fürs toggeln?

Bin eher Anfänger in Sachen Arduino...

Grüße

ohne die Funktionen millis und delay

Warum?

Wie soll etwas ohne Zeitreferenz "kontrolliert" blinken? No! Unter der Bedingung bleibt dir nur eine interne/externe Interruptquelle z.B der Watchdog Oder eine endlose Kette von NOPs(aber da ist selbst delay() noch 1000mal sinnvoller)

Die Nutzung von Zeitreferenzen ist die einzige sinnvolle programmatische Möglichkeit. Ansonsten kannst du extern beschalten (Kondensator aufladen und Spannung messen und den nachher wieder entladen oder so nen Kram), aber genau dafür hat man doch den Arduino, damit man so zeug nicht in Hardware lösen muss, sondern Software nutzen kann.

Habs hinbekommen...

Hatte nen interrupt der jede sekunde aufgerufen wird. da hab ich dann einfach mit {digitalWrite(PRE, !digitalRead(PRE));} gearbeitet...

War dann doch einfach ;)

digitaRead() und digitalWrite() in einem Interrupt? Ich glaube, das ist nicht wirklich optimal.

togru:
ich möchte 2 Leds zum Blinken/toggeln bringen, aber das ganze ohne die Funktionen millis und delay realisieren…

Hat jemand eine einfache idee fürs toggeln?

Also ‘sinnvoll’ ist für Dich überhaupt kein Kriterium, sondern nur die Vermeidung der beiden Funktionen kombiniert mit ‘einfach’?

Also einfach wäre das: Du ballerst den seriellen Ausgangspuffer voll bis zum Anschlag, und dann wartet die print-Funktion immer so lange, bis wieder Platz zum Senden eines Zeichens im Ausgangspuffer frei ist.

Beispielcode zum Togglen der Board-LED an Pin-13 ohne delay und ohne millis():

#define LED 13
void setup() {
  Serial.begin(9600);
  pinMode(LED,OUTPUT);
}

int toggleCount=1000;

void loop() {
  for (int i=0;i<toggleCount;i++) Serial.print('X');
  digitalWrite(LED,!digitalRead(LED));
}

In der for-Schleife werden immer 1000 Zeichen an Serial geschickt. Da Serial bei 9600 Baud nur ca. 960 Zeichen pro Sekunde senden kann, landet ‘Serial.print(‘X’)’ in einer Busy-Waiting-Loop und wartet fast ständig, daher läuft die loop()-Funktion nur ungefähr einmal pro Sekunde durch und toggelt dann die LED.

Wofür braucht man so einen Scheiß?

Oder ist die eigentliche Aufgabenstellung eine andere gewesen (Hausaufgabe?), und Du hast hier keine vollständige Aufgabenstellung gepostet?

Eine sinnvolle Realisierung von nicht extrem zeitkritischen und eher langsamen Timings wie “Blinken im für Menschen wahrnehmbaren Frequenzbereich” besteht in der Verwendung der millis() oder “micros()” Funktion.

Oder war jetzt die eigentliche Aufgabe nur, dass man ‘micros()’ statt ‘millis()’ verwenden soll?

Als Lösung für eine Hausaufgabe " Blinken ohne delay() und millis() " verdient dein Ansatz einen Sonderpunkt, jurs.

Andere Alternative wäre die Ansteuerung eines Motors, der eine Blende vor der LED bewegt. Das wäre einfach, wenn man den Arduino weglässt.

Hallo,

sinnvoll ist das alles nicht. Selbst mit externen Interrupt. Man kann sehr schlecht die Blinkfrequenz ändern. Am Ende braucht man immer einen ausreichend hoch aufgelösten Timer. Ob man da nun einen internen Timer extra verwendet oder den Interrupt im ms Takt befeuert oder gleich mit millis arbeitet ist am Ende vollkommen egal und kommt auf’s gleich raus.

Ich verstehe auch den Sinn der Aufgabe vom TE nicht. Wofür und warum? Das kam zu kurz rüber.
Wenn es irgendwo sinnvoll zu sein scheint können wir besser helfen.

Nein ist ein Projekt, das mit einem Betriebsstundenzähler usw zusammenhängt...

Ging mir eigentlich nur darum, ob es eine Funktion gibt, die eine LED zum togglen bringt.

Ging mir eigentlich nur darum, ob es eine Funktion gibt, die eine LED zum togglen bringt.

meinst du evtl. den operator !

static bool x;
x = !x;

Ja genau das meinte Ich!

Aufjedenfall funktioniert jetzt alles wie ich es mir vorgestellt habe ;)