Forum: Analoge Elektronik und Schaltungstechnik 24V 1ms Impuls verlängern


von Nuri O. (nurios)


Lesenswert?

Mahlzeit,

ich bekomme aus einer Hühnerklappensteuerung einen 24V Impuls von ca. 1 
ms, welchen ich mit einem Arduino über einen Optokoppler Auswerten 
möchte.

Diesen möchte ich, damit ich den auch sauber auswerten kann, auf 100 ms 
verlängern.

Hatte zu erst an ein RC glied gedacht, bin mir aber nicht ganz sicher, 
ob das so sauber funktioniert.

Hat jemand eine wie man so etwas am saubersten realisiert und nicht 
allzu kompliziert löst?

Gerne auch ohne ICs, dann lernt man vielleicht noch etwas in analoger 
Schaltungstechnik.

Mfg

von Nerd 8. (nerd81)


Lesenswert?

Google nach Monoflop

von Nemopuk (nemopuk)


Lesenswert?

1 ms ist doch nicht zu schnell für deinen Arduino (egal welcher). Selbst 
wenn es so wäre, könntest du attachInterrupt() verwenden.

Dein Ansatz mit dem R/C Glied ist schon OK. Als R könnte der interne 
Pull-Up des Mikrocontrollers dienen. Zwischen Eingang und GND kommt ein 
Kondensator mit 1 uF. Und der Ausgang des Optokopplers zieht den Eingang 
auf Low. Durch den Kondensator wird der Impuls verlängert. Nicht genau 
auf 100ms aber ungefähr.

: Bearbeitet durch User
von Jörg R. (solar77)


Lesenswert?

Nerd 8. schrieb:
> Google nach Monoflop

74HC4538

von Peter D. (peda)


Lesenswert?

Nuri O. schrieb:
> ich bekomme aus einer Hühnerklappensteuerung einen 24V Impuls von ca. 1
> ms, welchen ich mit einem Arduino über einen Optokoppler Auswerten
> möchte.

Das ist doch weit mehr als ausreichend.
Bei 16MHz Quarz kann der Arduino 62,5ns Pulse erfassen.

von Lutz (lutz66)


Lesenswert?

Wenn es um robuste störsichere Auswertung geht kann man mit einem 
transistor und einen widerstand einen kondensator entladen, 
zeitkonstante 0.25ms und dann mit einem weiteren R aufladen, 
zeitkonstante 50ms
Das ganze dann per adc mit 10 khz sampeln

Das wäre eine sehr robuste störsichere lösung bei der man viel lernen 
kann

Andernfalls was auch gut ist, interrupt auslösen mit fallender flanke 
und dann den digitalausgang mit z.B 8 khz 10 mal hinzereinander abfragen

Wenn dann die mehrheit low ist als puls erkannt, das ganzen kann man mit 
einem tiefpass mit 2-5us zeitkonstante noch entstören, ist auch sehr 
robust

Eine weitere lösung ist den digitaleingang permanent zu sampeln, wieder 
z.b 10khz und mittels ringspeicher länge 10 den gleitenden mittelwert zu 
berechenen, bzw auf integer level die summe, für digital high wäre die 
10 und für low 0, fällt der wert unter 3 oder 4 ist low erkannt

von Nemopuk (nemopuk)


Lesenswert?

Man kann sich auch einen Knopf an die Backe nähen.

: Bearbeitet durch User
von Sebastian S. (amateur)


Lesenswert?

Kein Problem!
Ein ganz normaler Arduino kann in der Zeit sogar mehrfach "hingucken".
Dazu brauchst Du den Impuls nicht zu "verfälschen" (verlängern).

von Michael B. (laberkopp)


Lesenswert?

Nuri O. schrieb:
> Diesen möchte ich, damit ich den auch sauber auswerten kann, auf 100 ms
> verlängern.

Mikrocontrollerprogrammierung ist nicht so dein Ding ?


Auch ein Arduino kann PinChange Interrupts auswerten, da darf der Impuls 
so kurz sein wie er will.

Lern programmieren an statt die Defizite mit Extrahardware vor dir 
herzuschieben.

https://docs.arduino.cc/libraries/pinchangeinterrupt/

von Chantalle (chantalle2000)


Lesenswert?

Für den fall, das dein code für einen schleifendurchlauf länger als 1 ms 
benötigt, was durchaus sehr wahrscheinlich ist

Die robuste und rechenzeitoptimierze lösung wäre z.B mittels 
tomerinterrupt den eingang mit 16 khz abzufragen und einen ringbuffer 
mit 16 speicherplätzen anzulegen, für den summe schaut man immer wie der 
älteste wert war und entfernt den aus der summe und addiert den neuesten 
dazu, wenn  man von low aktiv für das klappensignal ausgeht, dann wäre 
16 klappe zu, und wenn sie öffnet läuft der bis 0 und dann wirder hoch, 
legst du die schwelle z.B bei 6, dann würde man bei diesem wert ein flag 
setzen, klappe auf, das passiert alles in der timerinterruptroutine

Wenn du in deiner programmschleife das flag abfragt, wirst du wenn es 
aktiv ist in die entsprechende routine springen, und auch gleichzeitig 
das flag zurücksetzen, das ist dann wie die angefragte pulsverlängerung, 
nur besser/eleganter

Was beim programmieren hilft und fast fertigen code für die 
interruptroutine bereitstellt ist auch chatgpt, wenn du sagst wie du es 
machen willst als ringbuffer interrupt gleitende summe über 16 flag 
setzen usw, dann ist der code fast fertig

von Chantalle (chantalle2000)


Lesenswert?

Michael B. schrieb:
> Lern programmieren an statt die Defizite mit Extrahardware vor dir
> herzuschieben.

Was ich hier nie verstehen werde, wenn man nicht helfen möchte, wieso 
man dann zeit investiert für solche Kommentare

Jeder fängt mal an und hat noch nicht das notwendige wissen und dann 
sind die ideen wie man etwas löst eben nicht optimal

Aber ich habe festgestellt, je weniger fundiertes wissen umso mehr 
werden andere diffamiert

Wers braucht, Männer

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Chantalle schrieb:
> Jeder fängt mal an und hat noch nicht das notwendige wissen und dann
> sind die ideen wie man etwas löst eben nicht optimal

Und du sagst dem Verirrten der seinem Navi folgt und langsam am Weg 
zweifelt: du bist auf dem richtigen Weg, dein Navi leitet dich, da 
hinterm Feldweg über den Fluss und die Mauer rauf ist schon richtig.

Von mir kriegt der Verirrte ein klares "Falsch" und eine 
Arduino-Library. Von Chantalle nix

: Bearbeitet durch User
von Chantalle (chantalle2000)


Lesenswert?

Michael B. schrieb:
> Chantalle schrieb:
>> Jeder fängt mal an und hat noch nicht das notwendige wissen und dann
>> sind die ideen wie man etwas löst eben nicht optimal
>
> Und du sagst dem Verirrten der seinem Navi folgt und langsam am Weg
> zweifelt: du bist auf dem richtigen Weg, dein Navi leitet dich, da
> hinterm Feldweg über den Fluss und die Mauer rauf ist schon richtig.
>
> Von mir kriegt der Verirrte ein klares "Falsch" und eine
> Arduino-Library. Von Chantalle nix

Ich habe eine lösung beschrieben, ist deiner wahrnehmung entgangen, 
vielleicht ja bewusst, wer weiß das schon

von H. H. (hhinz)


Lesenswert?

Popcorn! Noch jemand ohne Popcorn!?

von Lutz (lutz66)


Lesenswert?

Michael B. schrieb:
> Auch ein Arduino kann PinChange Interrupts auswerten, da darf der Impuls
> so kurz sein wie er will.
>
> Lern programmieren an statt die Defizite mit Extrahardware vor dir
> herzuschieben.

Sagt einer der es offensichtlich selber nicht kann, per interrupt wo die 
pulse so kurz sein dürfen wie sie wollen

Das ist definitiv falsch, genauso wie die verwendung flankengetriggerter 
monoflops

Der will ja nur auf das lffnen der klappe teagieren, nicht auf jede 
Störung

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nuri O. schrieb:
> Hatte zu erst an ein RC glied gedacht, bin mir aber nicht ganz sicher,
> ob das so sauber funktioniert.
So ginge das sauber:
1
Signal ----->|-----o------
2
0/24V              |      |
3
                  ===    22k
4
                1u |      |
5
                   |      o--- uC
6
                   |      |
7
                   |     5k6
8
                   |      |
9
GND ---------------o------o---'

von Lutz (lutz66)


Lesenswert?

Chantalle schrieb:
> Für den fall, das dein code für einen schleifendurchlauf länger als 1 ms
> benötigt, was durchaus sehr wahrscheinlich ist
>
> Die robuste und rechenzeitoptimierze lösung wäre z.B mittels
> tomerinterrupt den eingang mit 16 khz abzufragen und einen ringbuffer
> mit 16 speicherplätzen anzulegen, für den summe schaut man immer wie der
> älteste wert war und entfernt den aus der summe und addiert den neuesten
> dazu, wenn  man von low aktiv für das klappensignal ausgeht, dann wäre
> 16 klappe zu, und wenn sie öffnet läuft der bis 0 und dann wirder hoch,
> legst du die schwelle z.B bei 6, dann würde man bei diesem wert ein flag
> setzen, klappe auf, das passiert alles in der timerinterruptroutine
>
> Wenn du in deiner programmschleife das flag abfragt, wirst du wenn es
> aktiv ist in die entsprechende routine springen, und auch gleichzeitig
> das flag zurücksetzen, das ist dann wie die angefragte pulsverlängerung,
> nur besser/eleganter


Genau so!

von Jörg R. (solar77)


Lesenswert?

H. H. schrieb:
> Popcorn! Noch jemand ohne Popcorn!?

Soviel Popcorn wie man hier aktuell braucht möchte ich gar nicht 
futtern.


Lutz schrieb:
> Michael B. schrieb:
>> Auch ein Arduino kann PinChange Interrupts auswerten, da darf der Impuls
>> so kurz sein wie er will.
>>
>> Lern programmieren an statt die Defizite mit Extrahardware vor dir
>> herzuschieben.
>
> Sagt einer der es offensichtlich selber nicht kann, per interrupt
> wo die pulse so kurz sein dürfen wie sie wollen

Femtosekunden reichen auch?

> Das ist definitiv falsch, genauso wie die verwendung flankengetriggerter
> monoflops

Unsinn.

> Der will ja nur auf das lffnen der klappe teagieren, nicht auf jede
> Störung

Man, man, man:-(

von Michael B. (laberkopp)


Lesenswert?

Lutz schrieb:
> Der will ja nur auf das lffnen der klappe teagieren, nicht auf jede
> Störung

Boh, Entprellung wurde erfunden, und im Gegensatz zu dir habe ich zur 
Kenntnis genommen, welche Aussenschaltung er derzeit verwendet:

Nuri O. schrieb:
> welchen ich mit einem Arduino über einen Optokoppler Auswerten

und Nein, der schaltet keine femtosekunden, sondern immer behäbig genug 
damit ein AVR PinChange auf jeden Fall mitkommt.

Also Lutz: lern programmierrn.

von R. L. (roland123)


Lesenswert?

Chantalle schrieb:
> Was ich hier nie verstehen werde, wenn man nicht helfen möchte, wieso
> man dann zeit investiert für solche Kommentare

die meisten, die hier 24 Stunden im forum sind, wollen nicht primär 
helfen, sondern ihr ego aufbessern. Mit freundlicher Hilfe für andere 
durch Fachwissen gelingt das nur wenigen. Andere niedermachen, als 
unfähig bezeichnen und beleidigen ist für die meisten die einzige 
Möglichkeit.

von Michael (bastler2)


Lesenswert?

Nuri O. schrieb:
> ich bekomme aus einer Hühnerklappensteuerung einen 24V Impuls von ca. 1
> ms, welchen ich mit einem Arduino über einen Optokoppler Auswerten
> möchte.
>
> Diesen möchte ich, damit ich den auch sauber auswerten kann, auf 100 ms
> verlängern.

Du brauchst den Impuls nicht zu verlängern, Du kannst einen 
Hardware-Zähler vom Arduino verwenden, um die externen Impulse zu 
zählen.

In der loop()-Schleife liest Du den Zähler aus, und vergleichst ihn mit 
dem letzten Wert. Hat sich der Wert verändert, gab es einen (oder 
mehrere) Impuls(e). Du weißt dann zwar nicht wann genau der Impuls war, 
aber das dürfte bei der Hühnerklappe egal sein, ob Du in 10 
Millisekunden oder 100 Millisekunden reagierst.

Wegen Störung und Prellen wirst Du Dir kaum Sorgen machen müssen, da der 
Impuls sicherlich elektronisch (ohne Relais) erzeugt wird.

Ein Beispiel, wie das mit dem Hardware-Zähler geht, findest Du unter:

https://deepbluembedded.com/arduino-counter-timer/

von Lutz (lutz66)


Lesenswert?

Michael B. schrieb:
> Lutz schrieb:
>> Der will ja nur auf das lffnen der klappe teagieren, nicht auf jede
>> Störung
>
> Boh, Entprellung wurde erfunden, und im Gegensatz zu dir habe ich zur
> Kenntnis genommen, welche Aussenschaltung er derzeit verwendet:
>
> Nuri O. schrieb:
>> welchen ich mit einem Arduino über einen Optokoppler Auswerten
>
> und Nein, der schaltet keine femtosekunden, sondern immer behäbig genug
> damit ein AVR PinChange auf jeden Fall mitkommt.
>
> Also Lutz: lern programmierrn.

Du scheinst wirklich sehr ahnungslos zu sein, wie kommt man auf 
entprellen wenn man von einem sensor einen 1ms puls bekommt

Aber störungen über lange zuleitungen sind real

Sicher es kommt auf den anspruch an, wem 99.9% als Zuverlässigkeit hoch 
genug ist, und für das hobby ist dies ausreichend, der macht das so

Wenn man etwas entwickelt, das zig hunderttausendfach produziert wird 
und jeweils tausende stunden fehlerfrei laufen soll, der sieht das 
anders

Und ja, auch bei denen die das beruflich machen sind sehr viele die das 
nicht gut machen, >90%

Ich weiß wovon ich da schreibe, weil irgendwer sucht dann ja die 
ursachen

: Bearbeitet durch User
von Nuri O. (nurios)


Lesenswert?

Nemopuk schrieb:
> 1 ms ist doch nicht zu schnell für deinen Arduino (egal welcher).

Dann hast du mich noch nicht programmieren sehen! Ich bin froh wenn mein 
code die 100ms sieht :D

Muss aber auch sagen, dass ich an programmieren nicht ganz so viel Spaß 
habe. Dafür umso mehr an Schaltung aufbauen, rumspielen, messen und vor 
allem neues lernen.

Chantalle schrieb:
> Die robuste und rechenzeitoptimierze lösung wäre z.B mittels
> tomerinterrupt den eingang mit 16 khz abzufragen und einen ringbuffer
> mit 16 speicherplätzen anzulegen

Das klingt sehr weit außerhalb meiner Kompetenz, aber kannst du gute 
Literatur empfehlen, um sich da reinzulesen?

Lothar M. schrieb:
> So ginge das sauber:

Wird getestet, danke!

von Peter X. (dcf)


Lesenswert?

Nuri O. schrieb:

> Wird getestet, danke!

Ansonsten 74HC4538:-)

von Michael B. (laberkopp)


Lesenswert?

Lutz schrieb:
> Ich weiß wovon ich da schreibe

Offensichtlich nicht

Lutz schrieb:
> Aber störungen über lange zuleitungen sind real

Durch einen Optokoppler hindurch ? Das müssen schon sehr massive 
Störungen sein um die LED austeichend lange (femtosekunden reichen hier 
nicht) zum Leuchten zu bringen damit die Ausgsngsspannung einen Impuls 
liefert.

Lutz schrieb:
> Du scheinst wirklich sehr ahnungslos zu sein, wie kommt man auf
> entprellen wenn man von einem sensor einen 1ms puls bekommt

Schau dir einfach Peter Danneggers Entprellroutine an, die hier im Forum 
so prominent ist. Da lernst du noch was beim programmieren.

von Lutz (lutz66)


Lesenswert?

>> Ich weiß wovon ich da schreibe
>
> Offensichtlich nicht
>
>
> Schau dir einfach Peter Danneggers Entprellroutine an, die hier im Forum
> so prominent ist. Da lernst du noch was beim programmieren.

Das schöne ist ja wenn man so arrogante besserwisser persönlich im 
beruflichen umfeld trifft, die sind dann nach 3 wochen so klein, man 
sieht sie nicht mehr.
Aber ja  die glauben ja tatsächlich das sie so gut sind, bis das 
gegenteil unausweichlich vorliegt

von R. L. (roland123)


Lesenswert?

Nuri O. schrieb:
> Nemopuk schrieb:
>> 1 ms ist doch nicht zu schnell für deinen Arduino (egal welcher).
>
> Dann hast du mich noch nicht programmieren sehen! Ich bin froh wenn mein
> code die 100ms sieht :D
>
> Muss aber auch sagen, dass ich an programmieren nicht ganz so viel Spaß
> habe. Dafür umso mehr an Schaltung aufbauen, rumspielen, messen und vor
> allem neues lernen.

in dem Fall würde ich ein RS-Flipflop nehmen, das von dem 1ms Impuls 
gesetzt wird und vom Arduino zurückgesetzt werden kann. An den Ausgang 
des Flipflops kommt ein Eingang vom Arduino und eine LED. Dann hast du 
alle Zeit der Welt, um den Zustand einzulesen und das Flipflop 
zurückzusetzen. Mit der LED hast du auch noch eine Funktionskontrolle. 
Wenn alles funktioniert, kannst du es immer noch eleganter in SW lösen.

von Nemopuk (nemopuk)


Lesenswert?

R. L. schrieb:
> in dem Fall würde ich ein RS-Flipflop nehmen, das von dem 1ms Impuls
> gesetzt wird und vom Arduino zurückgesetzt werden kann

Ist schon im Arduino drin und nennt sich Counter.

Er geht auf 1, wenn ein Impuls erkannt wurde. Und per Software kann man 
ihn wieder auf 0 zurück setzen.

von R. L. (roland123)


Lesenswert?

Nemopuk schrieb:
> Ist schon im Arduino drin und nennt sich Counter.
>
> Er geht auf 1, wenn ein Impuls erkannt wurde. Und per Software kann man
> ihn wieder auf 0 zurück setzen.

mein Vorschlag war auch nicht für dich, sondern für den TO

von Chantalle (chantalle2000)


Lesenswert?

Nuri O. schrieb:
> Chantalle schrieb:
>> Die robuste und rechenzeitoptimierze lösung wäre z.B mittels
>> tomerinterrupt den eingang mit 16 khz abzufragen und einen ringbuffer
>> mit 16 speicherplätzen anzulegen
>
> Das klingt sehr weit außerhalb meiner Kompetenz, aber kannst du gute
> Literatur empfehlen, um sich da reinzulesen?

also ChatGPT ist da eine gute quelle, wenn du deine Aufgabe sauber 
formulierst bekommst du Code mit Erklärung, und man kann auch nachfragen 
und ganz wichtig ChatGPT ist immer sehr höflich und macht einen nicht 
blöd an

Wenn du die Frage so formulierst

"ich möchte mit arduino mit arduino IDE per Timer Interrupt mit 16 kHz 
einen Digitaleingang abfragen und in einen Ringbuffer der länge 16, für 
high einen 1 eintragen und für low eine 0, dann soll nach jeder Abfrage 
die gleitende Summe ermittelt werden, d.h. von der Summe den ältesten 
Wert aud dem Ringbuffer entfernen und den aktuellen dazuaddieren.
Wenn die Summe unter 4 fällt soll ein Flag gesetzt werden
Im Hauptloop will ich bei jedem Durchlauf das Flag abfragen und wenn 
gesetzt in die Routine springen, in der Routine wird das Flag dann auch 
wieder zurückgesetzt, kannst du den Code schreiben"

spuckt er den Code raus, ich habe im dann aber gesagt das es besser wäre 
den Ringbuffer mit 1 zu iniiaisieren und die summe sum mit 16, weil beim 
start ja nicht aktive sein soll, aber das ist das erste Ergebniss, 
weiter unten nochmal die Korektur

// === Konfiguration ===
const uint8_t INPUT_PIN = 2;       // Digitaleingangspin
const uint8_t BUFFER_SIZE = 16;    // Länge des Ringbuffers
const uint16_t SAMPLE_RATE = 16000; // 16 kHz

// === Ringbuffer & Logik ===
volatile uint8_t ringBuffer[BUFFER_SIZE];
volatile uint8_t bufferIndex = 0;
volatile uint8_t sum = 0;
volatile bool flagLowSignal = false;

void setup() {
  pinMode(INPUT_PIN, INPUT);  // Eingangspin konfigurieren
  Serial.begin(9600);         // Optional für Debugging

  // Buffer initialisieren
  for (uint8_t i = 0; i < BUFFER_SIZE; i++) {
    ringBuffer[i] = 0;
  }

  // Timer1 initialisieren für 16 kHz Interrupt
  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;

  // Timer-Berechnung: 16 MHz / (Prescaler * TargetRate) - 1
  // Prescaler = 1 → 16 MHz / 16000 = 1000 → OCR1A = 999
  OCR1A = 999;
  TCCR1B |= (1 << WGM12);     // CTC-Modus
  TCCR1B |= (1 << CS10);      // Prescaler = 1
  TIMSK1 |= (1 << OCIE1A);    // Interrupt aktivieren
  interrupts();
}

ISR(TIMER1_COMPA_vect) {
  // Eingang lesen
  uint8_t value = digitalRead(INPUT_PIN);

  // Gleitende Summe berechnen
  uint8_t oldValue = ringBuffer[bufferIndex];
  sum = sum - oldValue + value;

  // Ringbuffer aktualisieren
  ringBuffer[bufferIndex] = value;
  bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;

  // Flag setzen, wenn Summe < 4
  if (sum < 4) {
    flagLowSignal = true;
  }
}

void loop() {
  if (flagLowSignal) {
    // Flag zurücksetzen
    noInterrupts();
    flagLowSignal = false;
    interrupts();

    // Behandlung der Bedingung (z. B. Ausgabe)
    Serial.println("Signal unter Schwellwert!");
    // Hier kann deine Routine aufgerufen werden
  }

  // Sonstige Logik im Loop
}


hier dann noch mal die Korrektur

// === Konfiguration ===
const uint8_t INPUT_PIN = 2;       // Digitaleingangspin
const uint8_t BUFFER_SIZE = 16;    // Länge des Ringbuffers
const uint16_t SAMPLE_RATE = 16000; // 16 kHz

// === Ringbuffer & Logik ===
volatile uint8_t ringBuffer[BUFFER_SIZE];
volatile uint8_t bufferIndex = 0;
volatile uint8_t sum = BUFFER_SIZE;  // Anfangssumme = 16
volatile bool flagLowSignal = false;

void setup() {
  pinMode(INPUT_PIN, INPUT);  // Eingangspin konfigurieren
  Serial.begin(9600);         // Optional für Debugging

  // Buffer initialisieren mit lauter 1en
  for (uint8_t i = 0; i < BUFFER_SIZE; i++) {
    ringBuffer[i] = 1;
  }

  // Timer1 initialisieren für 16 kHz Interrupt
  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;

  // Timer-Berechnung: 16 MHz / (Prescaler * TargetRate) - 1
  // Prescaler = 1 → 16 MHz / 16000 = 1000 → OCR1A = 999
  OCR1A = 999;
  TCCR1B |= (1 << WGM12);     // CTC-Modus
  TCCR1B |= (1 << CS10);      // Prescaler = 1
  TIMSK1 |= (1 << OCIE1A);    // Interrupt aktivieren
  interrupts();
}

ISR(TIMER1_COMPA_vect) {
  // Eingang lesen
  uint8_t value = digitalRead(INPUT_PIN);

  // Gleitende Summe berechnen
  uint8_t oldValue = ringBuffer[bufferIndex];
  sum = sum - oldValue + value;

  // Ringbuffer aktualisieren
  ringBuffer[bufferIndex] = value;
  bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;

  // Flag setzen, wenn Summe < 4
  if (sum < 4) {
    flagLowSignal = true;
  }
}

void loop() {
  if (flagLowSignal) {
    // Flag zurücksetzen (kritischer Abschnitt)
    noInterrupts();
    flagLowSignal = false;
    interrupts();

    // Behandlung bei Unterschreitung des Schwellenwerts
    Serial.println("Signal unter Schwellwert!");
    // Hier kannst du deine spezielle Routine aufrufen
  }

  // Andere Aufgaben im Loop...
}


jetzt kann dein Hauptprogramm so langsam sein wie du möchtest, das Flag 
wird per Interrupt im "Hintergrund" gesetzt, ganz so wie mit Hardware.
Ich hatte auch anfangs immer die Tendenz Hardware zu nutzen statt 
Software, aber die geschickte Kombination, jetzt nur die Störungen 
entsprechend wenn vorhanden reduzieren mit einem RC Glied und es ist ein 
gute Lösung.

Mit ChatGPT kann man schon einiges erreichen, man muss aber auch genau 
schraiben was man will und kontrollieren und evtl. mit Ideen ergänzen. 
Weil die KI lernt aus dem Internet und "lernt" auch die Fehler oder 
schlechten Programmierstil wenn er denn weit genug verbreitet ist. Aber 
zum Glück scheint er die offiziellen Applikationen stärker zu gewichten 
als Foren

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Lutz schrieb:
> Aber ja  die glauben ja tatsächlich das sie so gut sind, bis das
> gegenteil unausweichlich vorliegt

Und die über hunderte hier im Forum, die von meinem Code begeistert 
sind, habe ich dann wohl alle hypnotisiert.

Du kannst Dich gerne auch sachlich zu meinen Beispielen äußern, aber das 
wird Dir nicht gelingen.

von Peter D. (peda)


Lesenswert?

Nuri O. schrieb:
> Dann hast du mich noch nicht programmieren sehen! Ich bin froh wenn mein
> code die 100ms sieht :D

Solche Sachen läßt man einen Interrupt erledigen, dann hat das Main alle 
Zeit der Welt, darauf zu reagieren. Der Pin-Change Interrupt ist gut 
geeignet, da hat man die meiste Pinauswahl.
Man kann im Interrupt auch bis ~10µs lang prüfen, ob es nur ein Glitch 
ist, das tut noch nicht weh.

von Lutz (lutz66)


Lesenswert?

Peter D. schrieb:
> Lutz schrieb:
>> Aber ja  die glauben ja tatsächlich das sie so gut sind, bis das
>> gegenteil unausweichlich vorliegt
>
> Und die über hunderte hier im Forum, die von meinem Code begeistert
> sind, habe ich dann wohl alle hypnotisiert.
>
> Du kannst Dich gerne auch sachlich zu meinen Beispielen äußern, aber das
> wird Dir nicht gelingen.

Das kan man so machen und für viele hobbyprojekte ok

Aber trotzdem 2 nachteile
1 wenn das hauptprogramm beschäftigt ist dann bekommt man kurze 
tsstendrücke nicht mit, ich habe für einen steuerung mal ausprobiert, 
tastendrücke mit einer dauer unter 200ms sind möglich, davon war am 
anfang fast 50ms prellen
Das programm könnte also einen solchen tastendruck nicht mitbekommen 
wenn der loop 100ms benötigt, weil in deiner schleife ja auch delay sind

2. Die debounce funktion zält den counter runter und hat dazwischen 
immer ein delay, das bedeutet das sie solange den hauptprozess blockiert

Ich hatte ja alternativen geschrieben über ringbuffer und interrupt, das 
ist im professionellen bereich weitesgehend standard, man bekommt es 
immer mit und blockiert nicht den hauptprozess

Das erst mal zur debounce funktione
In dem folgenden beispiel, das kann ich nicht 100% am handy bewerten, 
müsste man zumindest mal ausdrucken, schöner wären einmal durchtesten 
und emulieten um alle zustände eindeutig nachzuvollziehen.
Aber ich sehe keine merkmale auf anhieb , das zustände gespeichert 
werden, so dass das hauptprogramm diese auch verzögert noch abfragen 
kann wenn der taster wieder losgelassen ist.
Auch hier, für dies code gibt es auch die berechtigung wenn man abfragen 
will ist jetzt ein taster gedrückt.
Wenn man aber die aufgabe hat, wenn ein taster gedrückt wird dann 
soll...
Dann ist es ohne speicherung die falsche lösung
Cantalle2000 hatte dazu ein beispielcode gepostet,und ich muss gestehen, 
der ist noch ein schritt weiter gedacht, natürlich ist ringbuffer der 
Länge 2^n besser, weil man dann schnellere rechenoperationen eines 8 
bitters nutzen kann mittels maske statt if else

Nichts für ungut, der code ist ok und in vielen Projekten benötigt es 
nicht mehr.
Aber warum immer so überheblich als die alten hasen hier im forum das 
mass der dinge darstellen.

: Bearbeitet durch User
von Otto K. (opto_pussy)


Lesenswert?

Nuri O. schrieb:
> Mahlzeit,
> ich bekomme aus einer Hühnerklappensteuerung einen 24V Impuls von ca. 1
> ms, welchen ich mit einem Arduino über einen Optokoppler Auswerten
> möchte.

So wie Roland123 schon sagte, wäre ein RS-Flip-Flop mit nachgeschaltetem 
Optokoppler hier angebracht, denn ein 24 Volt Impuls hat am Arduino 
nichts zu suchen!

Man könnte das RS-Flip-Flop aus zwei einzelnen Transistoren bauen und 
ebenfalls an 24 Volt betreiben und das Ausgangssignal über einen 
Doppel-Optokoppler mit dem Arduino verbinden. Zur optischen Kontrolle 
sollte man in Reihe zur Optokoppler-LED noch eine LED einschleifen, 
sobald der Arduino den Impuls registriert hat, kann er eine Sekunde 
später über den zweiten Optokoppler einen Feedback-Impuls zurück an das 
RS-Flip-Flop senden und es so bequem zurücksetzen.

von R. L. (roland123)


Lesenswert?

Otto K. schrieb:
> wäre ein RS-Flip-Flop mit nachgeschaltetem
> Optokoppler hier angebracht, denn ein 24 Volt Impuls hat am Arduino
> nichts zu suchen!

der Optokoppler wäre vor dem Flipflop besser aufgehoben. Also die LED 
vom Optokoppler am 24V Impuls und der Rest an der Versorgung vom 
Arduino.

von Michael B. (laberkopp)


Lesenswert?

Peter D. schrieb:
> Solche Sachen läßt man einen Interrupt erledigen, dann hat das Main alle
> Zeit der Welt, darauf zu reagieren. Der Pin-Change Interrupt ist gut
> geeignet,

Eben.

Lutz schrieb:
> Das kan man so machen und für viele hobbyprojekte ok
> Aber trotzdem 2 nachteile
> 1 wenn das hauptprogramm beschäftigt ist dann bekommt man kurze
> tsstendrücke nicht mit, ich habe für einen steuerung mal ausprobiert,

Boh ey, da erklärt sich so ein Satz

Lutz schrieb:
> Das schöne ist ja wenn man so arrogante besserwisser persönlich im
> beruflichen umfeld trifft, die sind dann nach 3 wochen so klein, man
> sieht sie nicht mehr

und warum man Lutz noch nie gesehen hat. Klein wie ein Sandkorn unterm 
Schuh.

Von Programmieren nicht die Bohne einer Ahnung, aber hier auf den dicken 
Macker tun.

Pedas Vorschlag sind für dich böhmische Dörfer.

von Otto K. (opto_pussy)


Lesenswert?

R. L. schrieb:
> der Optokoppler wäre vor dem Flipflop besser aufgehoben. Also die LED
> vom Optokoppler am 24V Impuls und der Rest an der Versorgung vom
> Arduino.

Das ist zwar richtig, aber dabei habe ich nur ein bisschen Angst, dass 
eine Signallänge von nur einer Millisekunde nicht ausreicht, um durch 
den trägen Optokoppler zu kommen.

Ein direkt angesteuertes RS-Flip-Flop ist schneller.

von Günter L. (Firma: Privat) (guenter_l)


Lesenswert?

von Nuri O. schrieb:
>Hat jemand eine wie man so etwas am saubersten realisiert und nicht
>allzu kompliziert löst?

In Hardware geht das zum Beispiel hiermit.

https://www.build-electronic-circuits.com/7400-series-integrated-circuits/74hc121-74ls121/

von Nemopuk (nemopuk)


Lesenswert?

Otto K. schrieb:
> ich nur ein bisschen Angst, dass eine Signallänge von nur einer
> Millisekunde nicht ausreicht, um durch den trägen Optokoppler zu kommen.

Bei 1 ns würde ich zustimmen, aber nicht bei gemütlichen 1 ms.

Musiker nutzen mit ihren Midi Geräten 30x so hohe Frequenzen völlig ohne 
Probleme mit ganz normalen Optokopplern.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Michael B. schrieb:
> Auch ein Arduino kann PinChange Interrupts auswerten, da darf der Impuls
> so kurz sein wie er will.

Laberkopp - genau darum geht es, jeder beliebig kurze Puls, der über die 
Leitung reinpurzelt, löst erstmal den Interrupt aus. Um da ein bisschen 
Störsicherheit reinzubringen, ist es sicher nicht verkehrt, kurz vor 
erwartetem Ende des Impulses noch einmal zu prüfen, ob das Signal immer 
noch ansteht und ansonsten den Triggerversuch zu verwerfen.

Otto K. schrieb:
> Das ist zwar richtig, aber dabei habe ich nur ein bisschen Angst, dass
> eine Signallänge von nur einer Millisekunde nicht ausreicht, um durch
> den trägen Optokoppler zu kommen.

Dann hast du vielleich den falschen Optokoppler. Es gibt auch welche, 
die 25MHz Signale sauber übertragen.
Letztendlich ist sogar jede Glasfaserstrecke, die 1GHz überträgt, ein 
besserer Optokoppler.

von Rainer W. (rawi)


Lesenswert?

Lutz schrieb:
> Aber ja  die glauben ja tatsächlich das sie so gut sind, bis das
> gegenteil unausweichlich vorliegt

Dann behaupte ich zur Stabilisierung der KI einmal das Gegenteil und 
lege es vor.

von Michael B. (laberkopp)


Lesenswert?

Rainer W. schrieb:
> ist es sicher nicht verkehrt, kurz vor erwartetem Ende des Impulses noch
> einmal zu prüfen, ob das Signal immer noch ansteht und ansonsten den
> Triggerversuch zu verwerfen.

Kann man problemlos machen, z.B. in der Interuptroutine die vom 
PinChange aufgerufen wurde per Portabfrage gucken ob der Impuls noch 
immer aktiv ist. Aber so kurze Impulse schaffen es nicht über den 
Optokoppler, wie du wüsstest, wenn du es jemals absichtlich versucht 
hättest.

Rainer W. schrieb:
> Dann hast du vielleich den falschen Optokoppler. Es gibt auch welche,
> die 25MHz

Er hat vermutlich einfach NORMALE Optokoppler, aber das passt nicht in 
dein rant-Weltbild.

Es gibt immer Einen, der der blödeste ist. Den Preis hat du heute 
gewonnen.

von Peter D. (peda)


Lesenswert?

Lutz schrieb:
> 1 wenn das hauptprogramm beschäftigt ist dann bekommt man kurze
> tsstendrücke nicht mit

Vielleicht solltest Du mal verlinken, welche Lib Du denn eigentlich 
meinst.

Wenn von "Peter Danneggers Entprellroutine" geredet wird, dann ist 
typisch diese hier gemeint:
Beitrag "Universelle Tastenabfrage"

Ich habe noch eine Macroversion ohne Timerinterrupt gepostet, aber auch 
klar deren Limits genannt.

von Lutz (lutz66)


Lesenswert?

Peter D. schrieb:
> Vielleicht solltest Du mal verlinken, welche Lib Du denn eigentlich
> meinst

Hier auf der seite unter artikelübersicht entprellung

Aber zum kommunikationsstiel, wenn  man schreibt
"
Du kannst Dich gerne auch sachlich zu meinen Beispielen äußern, aber das
wird Dir nicht gelingen"
Hättest du ja auch einen link posten können und die Annahme das niemand 
in deinem code verbessereungsporential sieht, ehrlich das ist schon sehr 
arrogant

Ich kenne meine position als ingenieur, zeig da schon sehr vielen wo es 
lang geht, ich würde aber nie behaupten das es für meine lösungen nicht 
noch bessere gibt

Anders wie manche Idi***n hier im forum die sich für sonst was halten, 
aber sowas von offensichtlich in der kindergartenliga unterwegs sind

Und das soll keine kritik an hobbyelektroniker sein, das ist doch auch 
als hobby schön und dann muss auch nicht alles perfekt sein, das ist ok

Aber manche hier, naja, da fehlen mir die Worte

Und sollten die das beruflich machen, ja die kenne ich, ganz große 
klappe aber nach 3 Wochen unsichtbar

: Bearbeitet durch User
von Lutz (lutz66)


Lesenswert?

Peter D. schrieb:
> Lutz schrieb:
>> 1 wenn das hauptprogramm beschäftigt ist dann bekommt man kurze
>> tsstendrücke nicht mit
>
> Vielleicht solltest Du mal verlinken, welche Lib Du denn eigentlich
> meinst.
>
> Wenn von "Peter Danneggers Entprellroutine" geredet wird, dann ist
> typisch diese hier gemeint:
> Beitrag "Universelle Tastenabfrage"
>
> Ich habe noch eine Macroversion ohne Timerinterrupt gepostet, aber auch
> klar deren Limits genannt.
Aber noch mal zum punkt der Abfrage eines digitaleingangd
Es gibt da schon die zwei unterschiedlichen zustände die man wenn man in 
de r schleife an den punkt kommt abfragen kann
- ist der Eingang aktiv
- war der Ekngang seit der letzten Abfrage aktiv

Entsprechend ist der Code unterschiedlich, und wenn man für die falsche 
Aufgabenstellung nicht die richtige methode benutzt ist das falsch

Aber dss sagt ja nichts über die routine selber aus

Die habe für die jeweilige Aufgabe ihre Berechtigung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.