2 Impulse schnell Hintereinander aussenden

Hallo zusammen,

ich möchte gerne 2 Blitzröhren schnell hintereinander ansteuern. Die Elektronik steht soweit. Ich muss nur noch die Steuerung voll enden.

Dazu muss ich 2 Impulse (z.b. digitalWrite()) von zwei verschiedenen Pins mit einem definierten Abstand schalten. Der Abstand sollte im Bereich von 100-700 ns liegen. Die Dauer der Impulse ist egal.

Da kann ich nicht mehr mit delay() arbeiten und im Internet habe ich auch nichts wirklich gefunden.

Hat vielleicht jemand einen Tipp?

Hallo,

dann kannste NOP verwenden.

#define NOP __asm__ __volatile__ ("nop")

void setup() {
  NOP;
  NOP;

}

void loop() {

}

Ein NOP dauert ein Takt, also hier 62,5ns, falls du dir eine for Schleife bauen solltest, musste den Schleifenoverhead beachten.

Hallo,

nochwas, digitalWrite dauert ca. 4µs, hat also eine Verzögerung, ist dem Pin Nummern Komfort geschuldt. Direkter Portzugriff wäre bestimmt sinnvoll bei den sportlichen Zeiten.

Inline Asselmbler.

Wenn ich richtig(mit 16MHz) gerechnet habe, dann wirst du mit einem NOP zwischen 2 Toggle Befehlen auskommen können. Wenn zu kuz, dann ein paar mehr.

Ein Toggle Befehl müsste dann in etwa so aussehen:

PINB = (1 << PB5);

digitalWrite() ist zu lahm dafür.

Zusammenfassend. Die Ansteuerung der Pins direkt über den Port und die Wartezeiten dazwischen (ein oder mehrere NOP) mußt Du in Assembler schreiben.

Grüße Uwe

So könnte es schon reichen:
(auch in Assembler bekommt man den Abstand zwischen den beiden Toggle nicht kürzer)

#include <CombiePin.h>

Combie::Pin::OutputPin<2> blitzA;
Combie::Pin::OutputPin<3> blitzB;

void blitz()
{
  blitzA.toggle();
  //hier evtl inline NOPs einbauen
  blitzB.toggle();

  delay(100); // danach wieder abschalten
  blitzA.setLow();
  blitzB.setLow();
}

void setup() 
{
  blitzA.init();
  blitzB.init();
}

void loop() // jede Sekunde ein doppelblitz
{
  delay(1000);
  blitz();
}

nicht ausgemessen

Edit:
Korrigiert.

CombieLib.zip (50.9 KB)

Ich denke du wirst mit der Granularität von 62,5ns nicht glücklich werden.

@combie

bei so kritischen Timings solltest du dem Beispiel wohl noch ein noInterrups()/interrupts() spendieren, oder?

  noInterrupts();

  blitzA.toggle();
  //hier evtl inline NOPs einbauen
  blitzB.toggle();

  interrupts();

Hi,

ein völlig uncooler Vorschlag: Ein einfaches R-C-Zeitglied mit hinten einem nichtinvertierendem Schmitt-Trigger (gibts auch als Einzelgatter in SMD für 11 Cent) dran, der dem ersten Signal um eine feste Zeit, oder über Poti einstellbar nachläuft.

Gruß André

Whandall:
Ich denke du wirst mit der Granularität von 62,5ns nicht glücklich werden.

Hallo,

mal von Kaninchenzüchter zu Kaninchenzüchter, sorry das muss sein :slight_smile: . Welches Problem könnte es mit den 62,5ns geben? Das ist für mich der kleinste machbare Zeitbereich. Alles andere sind Vielfache davon. Wenn man 10x NOP hintereinander schreibt, sollte doch genau eine Wartezeit von 625ns enstehen.

In dem Bereich 100-700 ns gibt es also 11 verschiedene Settings,
da wäre mir ein Poti am Monoflop doch deutlich lieber, da es viel feiner einstellbar ist (Granularität?).

Gerade die unteren 100 sind nicht präzise zu erreichen, 62,5 sind 37,5% zu wenig, 125 25% zu viel.
Selbst am oberen Ende des Bereichs geht der Fehler kaum unter 10%.

Für meine Blitzschaltung würde ich mir den Zeitversatz nahezu stufenlos wünschen,
das geht nur mit Hardware oder einem viel schnelleren Prozessor.

Hallo,

jetzt verstehe ich wie du das meinst. Auf Grund des krummes Basiswertes kommt man nicht genau auf die gewünschten Ganzzahlen. Gut.

Den Arduino mit 20 MHz takten dann gibt es 50nS Abstufungen.

Hallo Uwe,

mir fiel das schon in anderen Threads auf. Du schreibst das Einheitenzeichen von Sekunde immer groß. Das wäre Siemens, der Leitwert. :grin: :grin: :grin: Sollte auch in Italien so sein.

uwefed:
Den Arduino mit 20 MHz takten dann gibt es 50nS Abstufungen.

Das passt dann zwar genau auf die Grenzen, aber es bleiben immer noch nur 13 Stufen.

Kommt halt darauf an wozu man es braucht.

Tja...
evtl. ist ja ein Tiny85 was...
Da kann immerhin Timer 1 mit 64MHz laufen.
2 Komparregister...
Damit sollte man eine feinere Abstufung hin bekommen.

Aber wie auch immer....
Digitaltechnik und Stufen, gehört zusammen.

Doc_Arduino:
Hallo Uwe,

mir fiel das schon in anderen Threads auf. Du schreibst das Einheitenzeichen von Sekunde immer groß. Das wäre Siemens, der Leitwert. :grin: :grin: :grin: Sollte auch in Italien so sein.

Hallo Doc_Arduino. Ich besitze einige immerwiederkehrende Rechtschreibfehler, die ich immer wieder gerne benutze. Außerdem noch einige für Bundesdeutsch komische Eigenheiten des östereichischen Hochdeutschen und einige Eigenheiten die sich aus dem Verhochdeutschen meines Dialekt ableiten.

Werd versuchen die Einheitszeichen des Leitwert nicht mehr mit dem der Zeit zu verwechseln (von sec bin ich ja auch vor einiger Zeit abgekommen)

Grüße Uwe