tone() und LED-Ausgabe parallel funktioniert nicht!?

Hallo,

ich möchte mit auf einem PIN meines Leonardo ein Ton ausgeben, parallel dazu soll eine LED leuchten.
Beides soll x Sekunden als Benachrichtigung bei bestimmten Events ausgegeben werden.
Als Ausgabe des Tons verwende ich einen Piezo an PIN 12, die LED ist an PIN 13.
Leider schaltet die LED aber immer sofort wieder ab, wo ist mein Fehler?
Ich hab folgendes probiert

  // init 
  int speakerPIN =12;
  int ledPIN = 13;
  int signalTime = 5000;

  // void setup() ...
  // void loop() ...
 
  tone(speakerPIN, 2000, signalTime);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime);
  digitalWrite(ledPIN, LOW);

Auch mit

  tone(speakerPIN, 2000);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime);
  noTone(speakerPIN);
  digitalWrite(ledPIN, LOW);

wird es nicht anders.

Dirk

dischneider:
... Leonardo ...
Als Ausgabe des Tons verwende ich einen Piezo an PIN 12

Also ich lese in der Leonardo-Doku:
PWM: 3, 5, 6, 9, 10, 11, and 13.

Warum schließt Du den Piezo nicht an einen der PWM-Pins an, die in der Board-Dokumentation stehen?

dischneider:
Auch mit
...
wird es nicht anders.

So isses.

Hmm, gute Frage.
Warum sollte ich denn einen PWM-Port nehmen, hab in der Doku zu tone() nix dahingehend gefunden ...
tone() schaltet doch den DigitalOut nur ein und aus und macht keine PWM?

Aber auch der Tausch der beiden Ports bringt keinen Unterschied zu vorher.
Also Status unverändert.

Dirk

So wie ich das lese macht Tone PWM per Software auf jedem Pin. Braucht also nicht die Hardware PWM Pins.

dischneider:
Also Status unverändert.

Merkwürdig.
Welche Arduino-Software Version verwendest Du?

In den Release Notes http://arduino.cc/en/Main/ReleaseNotes steht zur Version ARDUINO 1.0.2 ausdrücklich drin:
Fix for tone() on the Leonardo. (Shigeru Kanemoto)

Bist Du vielleicht noch auf einer älteren Arduino-Version?

Oder ist das ein Ausschnitt aus einem größeren Programm, dem der RAM-Speicher ausgegangen ist und das deshalb nicht mehr funktioniert?

@Serenifly:
Was ja passen würde, die Ausgabe von tone() funktioniert ja problemlos, nur die parallele Ansteuerung einer LED auf einem DigitalOut-PIN leider nicht.

Dirk

Wegen Überschneidung als Nachtrag @jurs:
Software ist 1.0.5
Ja, ist ein Ausschnitt aus einem größeren Sketch.
Aber es funktioniert eben auch im "kleinen", also minimierten Code nicht.
tone() tut wie soll, parallele Ansteuerung einer LED lässt diese nur kurz "aufblinken" und nicht die gewünschte Zeit anbleiben.

dischneider:
Aber es funktioniert eben auch im "kleinen", also minimierten Code nicht.
tone() tut wie soll, parallele Ansteuerung einer LED lässt diese nur kurz "aufblinken" und nicht die gewünschte Zeit anbleiben.

Und bei der LED ist auch nicht der Vorwiderstand komplett falsch berechnet, so dass sie beim Aufblinken mehr als 40mA Strom ziehen könnte und der Atmega wegen Überstrom an diesem Pin instabil arbeitet?

Nein, der Vorwiderstand passt.
220 Ohm begrenzt den Strom auf max 27mA, Eigenschaften der LED vernachlässigt.
Ohne tone() tut sie auch wie gewünscht.
Hatte auch schon einen Schalttransistor testweise zwischengesetzt, keine Änderung.

Das liegt daran, dass die tone() Funktion im Hintergrund abläuft.
Du schaltest den Ton ein und sozusagen gleichzeitig die LED, der Ton ist 5s an und die delay Funktion läßt die LED nach 5s, dann gleichzeitig mit dem Ton ausgehen.
Gib mal statt delay(signalTime); delay(signalTime + 1000); ein und du wirst sehen, dass die LED 1s anbleibt.

Und das hat auch nichts mit dem Leonardo zu tun...

Nein, passiert nicht.
LED blinkt kurz auf und ist wieder aus.

Und das was du beschreibst, mit den zeitgleich an und aus, ist je das, was ich eigentlich will ...

Danke für den Ansatz.

OK, jetzt verstehe ich ....
Also doch ein Leonardo Thema ? Auf dem Mega funktioniert's jedenfalls.

dischneider:
LED blinkt kurz auf und ist wieder aus.

Das ist ja echt zum Mäusemelken.

Passiert das denn nur, wenn die LED direkt nach dem tone-Befehl gesetzt wird?

Was passiert mit einem kleinen delay() nach dem Einschalten des Tons, z.B.: mit:

  tone(speakerPIN, 2000, signalTime);
  delay(10);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime-10);
  digitalWrite(ledPIN, LOW);

oder wenn erst die LED gesetzt wird

  digitalWrite(ledPIN, HIGH);
  tone(speakerPIN, 2000, signalTime);
  delay(signalTime);
  digitalWrite(ledPIN, LOW);

Da passiert ebenfalls das gleiche.
Das Problem scheint an der Timernutzung der tone()-Funktion zu liegen.
Mit

  digitalWrite(ledPIN, HIGH);
  for (int i = 0; i < signalTime * 2; i++) {
  digitalWrite(speakerPIN, HIGH);
  delayMicroseconds(250);
  digitalWrite(speakerPIN, LOW);
  delayMicroseconds(250);
  }
  digitalWrite(ledPIN, LOW);

funktioniert es.
Das ist zwar nicht die perfekte, aber immerhin eine funktionierende Lösung.
Also Tonausgabe selbst generiert ...

Danke für die Hilfe, bin gerne zum Testen bereit, wenn noch jemand eine perfekte Idee hat ...

Dirk