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
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
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.
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
Man kann sich auch einen Knopf an die Backe nähen.
:
Bearbeitet durch User
Kein Problem! Ein ganz normaler Arduino kann in der Zeit sogar mehrfach "hingucken". Dazu brauchst Du den Impuls nicht zu "verfälschen" (verlängern).
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/
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
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
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
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
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
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---' |
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!
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:-(
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.
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.
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/
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
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!
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.
>> 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
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.
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.
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
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
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.
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.
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
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.
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.
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.
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 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/
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
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.
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.