Hallo liebe Gemeinde. Ich benutze die angehängte Schaltung um eine Gabel-Lichtschranke per Interrupt auszulösen. Leider "prellt" die Angelegenheit. D.h. es kommen zu viele Interrupts und auch welche an der falsche Flanke. Was ich nicht verstehe ist, dass die Flanken immer so wie im Screenshot aussehen, also eigentlich ganz sauber. Was übersehe ich da. Danke schon mal für Antworten
Cube_S schrieb: > Hallo liebe Gemeinde. > > Ich benutze die angehängte Schaltung um eine Gabel-Lichtschranke per > Interrupt auszulösen. Leider "prellt" die Angelegenheit. D.h. es kommen > zu viele Interrupts und auch welche an der falsche Flanke. > > Was ich nicht verstehe ist, dass die Flanken immer so wie im Screenshot > aussehen, also eigentlich ganz sauber. Was übersehe ich da. Deine Zeitbasis ist viel zu groß, da übersieht dein Billigoszi mal schnell eine paar schnelle Flankenwechsel. Zoom da mal rein, so auf 1us/DIV und weniger.
Das habe ich natürlich versucht aber ich sehe da nichts. Wenn ich zu weit reinzoome sehe ich natürlich nicht mehr die ganze Kurve.
Cube_S schrieb: > Das habe ich natürlich versucht aber ich sehe da nichts. Wenn ich zu > weit reinzoome sehe ich natürlich nicht mehr die ganze Kurve. Das ist Falk, den brauchst du nicht zu beachten, der will nur spielen. Wie sieht deine Interruptroutine aus?
Nun ja, daher wertet man Taster nicht per Interrupt aus, bei Lichtschranken die z.B. von Energiesparlampen oder LED-Lampen Licht beeinflusst werden sieht es ähnlich aus. Ein kleiner Kondensator am uC Eingang, ein kleinerer Widerstandswert wären Krücken, also keine wirkliche Lösung. Wenn man auch die LED von uC ein und ausschalten lässt, kann man a) nur Wechselspannungen durchlassen und b) Synchrongleichrichtung treiben und c) lock in Verstärker bauen und damit eine gegen Fremdlicht störsichere Lichtschranke bauen. Das haben ja schon alte Rollkugelmäuse geschafft.
Sieht die Spannungsversorgung des Atmega sauber aus? Hat er die empfohlen Kondensatoren? Sind die Massen gut verbunden?
Hm. Ich würde mal die Anstiegszeit überprüfen und das mit den Angaben im Datenblatt vergleichen. Möglich, dass der Pegel den verbotenen Bereich nicht schnell genug durchfährt. 20ms kommen mir lang vor, aber ich kann mich irren. Ausserdem wäre noch interessant, wie lang die Leitungen sind. Am besten minimalen Code und Schaltung posten um Rückfragen zu ersparen.
Cube_S schrieb: > Wenn ich zu weit reinzoome sehe ich natürlich nicht mehr die ganze Kurve. Die interessiert deinen µC auch nicht. Der guckt nur bei der (realen) Schaltschwelle. Was bei flachen Flanken allerdings intern passiert, siehst du mit dem Oszi sowieso nicht. Einen Schmitt-Trigger hat dein Interrupteingang wohl nicht?
Warum darf ich nicht wissen, welcher µC verwendet wird? Warum ist der Code der ISR und das drumrum geheim? Da diese Information nicht freiwillig geliefert wird, gehe ich nach sorgfältiger Prüfung davon aus, dass der TO (Cube_S (Gast)) nicht an konstruktiven Lösungsfindung interessiert ist.
Cube_S schrieb: > Ich benutze die angehängte Schaltung um eine Gabel-Lichtschranke per > Interrupt auszulösen. Ähhm. Das nennst du eine Schaltung? Und dann löst du nicht die Lichtschranke per Interrupt aus, sondern du läßt die Lichtschranke (genauer gesagt: den Fototransistor deines Gabelkopplers) einen Interrupt auslösen. Subjekt und Objekt. Ursache und Wirkung. Sollte man nicht vertauschen. > Leider "prellt" die Angelegenheit. D.h. es kommen > zu viele Interrupts und auch welche an der falsche Flanke. Zum Glück hast du "prellt" in Anführungszeichen gesetzt. Denn tatsächlich prellt da nichts. Das tun nur mechanische Kontakte. Aber natürlich kommt aus so einem Fototransistor kein Rechtecksignal raus. Noch dazu bei einer offenen Anordnung, wo Störlicht aus allen möglichen Quellen (z.B. gepulste Leuchtstoffröhren) drauf fallen kann. > Was ich nicht verstehe ist, dass die Flanken immer so wie im Screenshot > aussehen, also eigentlich ganz sauber. Das bezweifle ich. Insbesondere das "immer" in diesem Satz. Alein schon durch das Anklemmen deines Oszis veränderst du das System. > Was übersehe ich da. Ich nehme an, du wolltest fragen: "Was mache ich falsch?" Nun, man hängt so einen Fototransistor nicht direkt an den Interrupteingang eines µC. Zuerst mal würde man das Signal etwas aufbereiten wollen. Sagen wir mal als Anfang mit einem RC-Filter gegen AC Störungen. Und dann einem Schmitt-Trigger mit ausgeprägter Hysterese. So einfach geht das aber nur, wenn das ganze optisch einigermaßen abgeschirmt ist, so daß man Fremdlicht ausschließen kann. Aber auch dann würde man es sich dreimal überlegen, ob man das Signal direkt einen Interrupt auslösen lassen wollen würde. Das braucht man eigentlich nur, wenn man sehr kurze Reaktionszeiten will. Um mal eine Zahl zu nennen: schneller als 1ms. Alles, was langsamer sein darf, fragt man besser in einem Timer-Interrupt ab.
Arduino Fanboy D. schrieb: > Warum darf ich nicht wissen, welcher µC verwendet wird? Überschrift gelesen? Brille geputzt? AVRs haben an allen Eingängen Schmitt-Trigger, die vermeiden viele Probleme, wenn gleich nicht alle.
Cube_S schrieb: > Das habe ich natürlich versucht aber ich sehe da nichts. Wenn ich zu > weit reinzoome sehe ich natürlich nicht mehr die ganze Kurve. Mensch Meier, man kann die Kurve a) so weit aufzoomen, bis sie den ganzen Bildschirm füllt (und dem Rest der Welt einen Screenshot zeigen) b) weiter reinzoomen und das Signal stückweise betrachten.
Axel S. schrieb: > Das bezweifle ich. Insbesondere das "immer" in diesem Satz. Alein schon > durch das Anklemmen deines Oszis veränderst du das System. Das ist klar, die Kurve stammt aber aus diesem System. Und das verhalten (die gezählten Interrupts) ändert sich auch nicht durch abklemmen. Axel S. schrieb: > sondern du > läßt die Lichtschranke Grammatikalisch nicht gelungen, gebe ich zu, aber alle haben es verstanden und das auch noch richtig. Falk B. schrieb: > a) so weit aufzoomen, bis sie den ganzen Bildschirm füllt (und dem Rest > der Welt einen Screenshot zeigen) Ist angehängt. Das hat mir übrigens 4 Interrupts beschert. Der Aufbau ist noch auf einem Breadboard. Mir stellt sich halt die Frage: Warum löst ein so harmlos aussehendes Signal 4 Interrupts aus.
Falk B. schrieb: > Überschrift gelesen? Brille geputzt? Die AVR unterscheiden sich erheblich, was die Schaltschwelle angeht, und auch in der Hysterese. Kann sein, dass dir das am Arsch vorbei geht. Aber mit meiner Brille hat sicher das nichts zu tun.
Axel S. schrieb: > Das bezweifle ich. Insbesondere das "immer" in diesem Satz. Alein schon > durch das Anklemmen deines Oszis veränderst du das System. Das ist klar, die Kurve stammt aber aus diesem System. Und das verhalten (die gezählten Interrupts) ändert sich auch nicht durch abklemmen. Axel S. schrieb: > sondern du > läßt die Lichtschranke Grammatikalisch nicht gelungen, gebe ich zu, aber alle haben es verstanden und das auch noch richtig. Falk B. schrieb: > a) so weit aufzoomen, bis sie den ganzen Bildschirm füllt (und dem Rest > der Welt einen Screenshot zeigen) Ist angehängt. Das hat mir übrigens 4 Interrupts beschert.
Cube_S schrieb: > Axel S. schrieb: >> Das bezweifle ich. Insbesondere das "immer" in diesem Satz. Alein schon >> durch das Anklemmen deines Oszis veränderst du das System. > > Das ist klar, die Kurve stammt aber aus diesem System. Und das verhalten > (die gezählten Interrupts) ändert sich auch nicht durch abklemmen. In deinem Screenshot steht Flt: 50kHz. Kann es sein, daß dein Oszi-Eingang einen 50kHz Filter aktiviert hat? Dann kann man keine schnellen Störsignale sehen ;-) > Falk B. schrieb: >> a) so weit aufzoomen, bis sie den ganzen Bildschirm füllt (und dem Rest >> der Welt einen Screenshot zeigen) > > Ist angehängt. Das hat mir übrigens 4 Interrupts beschert. Siehe oben. > Der Aufbau ist noch auf einem Breadboard. Mir stellt sich halt die > Frage: Warum löst ein so harmlos aussehendes Signal 4 Interrupts aus. Weil du nicht das siehst, was wirklich da ist. Zeig mal ein Bild von deinem Aufbau.
Cube_S schrieb: > SCR02.PNG Dann blende doch mal ein, an welcher Stelle genau der µC jeweils in die ISR springt. Wenn die vier Interrupts wirklich von dieser einen Flanke ausgelöst werden, solltest du deine Zeitskala mal ein bisschen Aufreißen. Der µC "denkt" da eher in Mikrosekunden. Wie sieht deine ISR überhaupt aus?
Wolfgang schrieb: >> SCR02.PNG > Dann blende doch mal ein, an welcher Stelle genau der µC jeweils in die > ISR springt. Gute Idee. Dazu sollte man dem OP aber sagen, daß er in der ISR ein Test-Pin auf HIGH setzen soll und am Ende der ISR wieder auf LOW. Dann sieht man, wann er die 4 Interrupts erkennt.
Das ist der Aufbau. Ich bin der Sache jetzt ein Stück näher. Das LCD-Modul wurde in einer Endlosschleife beschrieben. D.h. ständig Betrieb auf den Steuer- und Datenleitungen. Die Steuerleitungen liegen genau neben dem Interrupt-Pin. Ich habe das LCD-Display nun nur noch alle 100ms mit Daten gefüttert und siehe da, die Probleme sind weg.
Cube_S schrieb: > Das ist der Aufbau. Ufff! Wenn da mal nicht ein paar nette Wackelkontakte drinstecken. > Ich bin der Sache jetzt ein Stück näher. Das > LCD-Modul wurde in einer Endlosschleife beschrieben. D.h. ständig > Betrieb auf den Steuer- und Datenleitungen. Die Steuerleitungen liegen > genau neben dem Interrupt-Pin. Ich habe das LCD-Display nun nur noch > alle 100ms mit Daten gefüttert und siehe da, die Probleme sind weg. Schon mal ein Anfang. Das sollte aber nicht das Problem sein. Mach mal probehalber einen kleinen Kondensator an das INT-Pin gegen Masse, so 1-10nF. Dann sollte es auch mit Dauerbetrieb auf deinem LCD funktionieren.
Hab das grad mal nachgebaut. Das Steckbrett liegt ca. in der Mitte etwas von den Leitungen verdeckt. Bei mir läufts sauber
Man kann noch was testen. Der Phototransistor mit 10k Pull-Up Widerstand ist sehr unsymmetrisch. Wenn er durchschaltet, liegt relativ niederohmig LOW am INT-PIN an. Wenn er sperrt hat man nur relativ hochohmige 10k Pull-Up Widerstand. Wenn also eine Verkopplung der LCD-Ansteuerung mit dem INT-Pin vorliegt, dann sollte deine Schaltung Interrupts erkennen, wenn deine Lichtschranke dauerhaft unterbrochen ist.
Falk B. schrieb: > Wenn also eine Verkopplung der LCD-Ansteuerung mit > dem INT-Pin vorliegt, dann sollte deine Schaltung Interrupts erkennen, > wenn deine Lichtschranke dauerhaft unterbrochen ist. Das ist nicht der Fall. Da kommen keine Interrupts.
Cube_S schrieb: > Ich bin der Sache jetzt ein Stück näher. Ja, du hast eine Einstreuung und weißt jetzt woher sie kommt. Aber du siehst es auf dem Signal nicht. Also, wie schon gesagt: 50kHz-Filter ist hier fehl am Platz. Mach mal ein Bild von einer gestörten Flanke ohne das Filter. Ebenso schlecht ist der langsame Signalanstieg, der lädt gerade dazu ein, dass Störungen genügend Zeit haben, mehrfach zu wirken. Die störenden Signale haben Anstiegszeiten im Bereich um die 10ns - das koppelt leicht über - und deine Flanke liegt bei 5ms. Genügend Zeit als, um mehrfach zu schalten, bis der Übergangsbereich verlassen wird. Helfen kann ein niederohmiger Arbeitswiderstand am Phototransistor (s.o.) oder ein einfacher Schmitt-Trigger (HC14) nahe am Phototransistor und natürlich ein ordentlicher Aufbau. Kleine Story aus der Praxis am Rande: Sproadische Fehler in einem DDR-Interface. Die Signale gemessen mit dem Laborskope 1GHz BB, natürlich mit dem (langsamen) Standard-Tastkopf. Sah alles schön aus - bis auf eine kaum wahrnehmbare, leichte Verformung mitten in der Flanke. Der Verlauf war aber noch immer stetig. Glücklicherweise darauf geschlossen, dass uns Skope+Tastkopf wohl anlügen. Vom Skope-Vertriebsmenschen ein Leihgerät besorgt mit 5GHz BB und schnellen Tastköpfen. Und siehe da, schon zeigte das Signal sein wahres Gesicht, einen Zacken in der Flanke. So kam ich damals zu dem lange gewünschten, aber immer als viel zu teuer empfundenen schnellen Skope mit 10GHz BB.
Cube_S schrieb: > Falk B. schrieb: >> Wenn also eine Verkopplung der LCD-Ansteuerung mit >> dem INT-Pin vorliegt, dann sollte deine Schaltung Interrupts erkennen, >> wenn deine Lichtschranke dauerhaft unterbrochen ist. > > Das ist nicht der Fall. Da kommen keine Interrupts. Dann ist es keine Kopplung über das Pin. Vermutlich hat du eher ein Problem in deiner Software, Stichwort voilatile und atomarer Zugriff. Siehe Interrupt
Falk B. schrieb: > Cube_S schrieb: >> Falk B. schrieb: >>> Wenn also eine Verkopplung der LCD-Ansteuerung mit >>> dem INT-Pin vorliegt, dann sollte deine Schaltung Interrupts erkennen, >>> wenn deine Lichtschranke dauerhaft unterbrochen ist. >> >> Das ist nicht der Fall. Da kommen keine Interrupts. > > Dann ist es keine Kopplung über das Pin. Das würde ich so nicht bestätigen. Der Kopplungspegel muss nicht so groß sein, dass er den 10k vom Optotransistor überschreibt. Es reicht, wenn er während der langsamen 5ms-Flanke zum richtigen Zeitpunkt mehrere steile Flanken vom Nebensprechen sieht. Wenn der Pegel mitten im aktiven Bereich liegt, braucht's nur wenig Störpegel, um einen Eingang zu triggern.
Falk B. schrieb: > Problem in deiner Software, Stichwort voilatile und atomarer Zugriff Möglich ist alles aber ich glaub's nicht: die relevanten Stellen sehen so aus (will niemanden mit vollständigem Code belästigen):
1 | static volatile uint32_t count2; |
2 | |
3 | ISR(INT0_vect) |
4 | {
|
5 | PORTB |= 1; |
6 | count2++; |
7 | PORTB &= ~1; |
8 | }
|
9 | |
10 | int main(void) |
11 | {
|
12 | EICRA = 1<<ISC01 | 1<<ISC00; |
13 | EIMSK = 1<<INT0; |
14 | |
15 | while(1) |
16 | {
|
17 | uint32_t val1, val2; |
18 | ATOMIC_BLOCK(ATOMIC_RESTORESTATE) |
19 | {
|
20 | val1 = count1; |
21 | val2 = count2; |
22 | }
|
23 | |
24 | //.. ausgabe an LCD Modul
|
25 | }
|
26 | }
|
PORTB0 in der Interrupt-Routine ist der Trigger für's Osci, der Screenshot dazu ist angehängt. val1 und count1 ist eine andere Lichtschranke, die hier nicht aktiv ist.
Cube_S schrieb: > PORTB0 in der Interrupt-Routine ist der Trigger für's Osci, der > Screenshot dazu ist angehängt. Na das ist doch schon mal was! Die Interrupts kommen verdammt schnell nacheinander! Fast so, als ob dort ein Dauerfeuer am Pin anliegt. Kann da was falsch konfiguriert sein? Eigentlich nicht. "Observe that, if enabled, the interrupts will trigger even if the INT0..2 pins are configured as outputs." Wenn deine andere Software durch einen Fehler auf den Port schreibt, und. z.B. den Pull-Up ein- und aus schaltet, könnte sowas passieren. Oder das Pin wird kurzzeitig als Ausgang konfiguriert und per Software gewackelt. Jaja, ist weit hergeholt. Oder fälschlicherweise auf LOW level statt Flanke konfiguriert? HildeK schrieb: > 5ms-Flanke zum richtigen Zeitpunkt mehrere steile Flanken vom > Nebensprechen sieht. Wenn der Pegel mitten im aktiven Bereich liegt, > braucht's nur wenig Störpegel, um einen Eingang zu triggern. Mag sein, aber der AVR hat an alle IOs Schmitt-Trigger, da sollte sowas nicht so leicht passieren. I/O Pin Input Hysteresis vs. VCC Beim ATmega32 (hab ich einfach mal so genommen) sind das 0,5V bei 5V VCC. Das ist schon ne Menge. Man könnte ein absolut minimales Programm schreiben, das nur die ISR konfiguriert und sonst nix macht. Dann sieht man, ob das Testpin auch mehrfach zuckt. Wenn ja, ist was anderes faul. Wenn nein, liegt der Fehler in der kompletten Software.
Falk B. schrieb: > HildeK schrieb: >> 5ms-Flanke zum richtigen Zeitpunkt mehrere steile Flanken vom >> Nebensprechen sieht. Wenn der Pegel mitten im aktiven Bereich liegt, >> braucht's nur wenig Störpegel, um einen Eingang zu triggern. > > Mag sein, aber der AVR hat an alle IOs Schmitt-Trigger, da sollte sowas > nicht so leicht passieren. 0,5V Hysterese sind schon mal ein ordentlicher Schutz gegen "mehrfach-Triggerung" der ISR bei langsamen Flanken. Aber der Aufbau ist auch ein ziemliches Gewirr von Drähten mit schwer abschätzbaren parasitären Eigenschaften. Evtl. sieht die Rampe vom Optokoppler in der Messung noch schön glatt aus. Aber direkt am µC-Pin gemessen (mit Referenz auf die µC Masse) kann sie schon nicht mehr so glatt wirken. @TO: ich gestehe, dass ich nicht jeden einzelnen Beitrag gelesen habe. Hast du es schon mal mit einem deutlich kleineren Arbeitswiderstand am Fototransistor probiert (1k statt 10k). Wenn die Flanke deutlich steiler wird, verbringst du deutlich weniger Zeit im Umschaltbereich des INT0. Der Widerstand ist schnell ausgetauscht. Wiederhole vielleicht nochmal damit deine Messung von 20:03 und schau, ob das die Mehrfachtriggerungen verbessert. Achte bei der Messung bitte auch darauf, dass der Tastkopf sicher in der x10-Einstellung ist. Sonst verschleift auch die Tastkopfkapazität unnötig stark die Flanke des Optokopplers.
Falk B. schrieb: > Mag sein, aber der AVR hat an alle IOs Schmitt-Trigger, da sollte sowas > nicht so leicht passieren. Es hieß ja, dass es keinen Trigger gibt, wenn der OK abgedeckt ist; das Signal also über 10k statisch an 'H' liegt und du deshalb die HW-Seite ausgeschlossen hast. Ich wollte nur ein Szenario aufzeigen, bei dem jedenfalls der Abstand für eine Reaktion auf Störungen kleiner ist: der Weg von 2.5V zu 2.75V oder zu 2.25V ist eben deutlich geringer als von 5V auf 2.25V (wenn die Schwellen bei 2.25V und 2.75V liegen). Achim S. schrieb: > Evtl. sieht die Rampe vom Optokoppler in der > Messung noch schön glatt aus. Aber direkt am µC-Pin gemessen (mit > Referenz auf die µC Masse) kann sie schon nicht mehr so glatt wirken. Daran dachte ich auch schon. Wo und mit welchem Tastkopf hat der TO gemessen?
Cube_S schrieb: > die relevanten Stellen sehen > so aus Also die Stellen, wo der Fehler wahrscheinlich nicht liegt. Cube_S schrieb: > will niemanden mit vollständigem Code belästigen Man kann Code einfach anhängen, dann stört das den Beitrag nicht. Code einfügen ist eh blöd, man kann dann nicht auf Zeilennummern Bezug nehmen. Ich vermute mal, Deine LCD-Routine schreibt auf den Eingang der Lichtschranke.
Peter D. schrieb: > Ich vermute mal, Deine LCD-Routine schreibt auf den Eingang der > Lichtschranke. Aber dann müsste man auf dem Eingang auch was sehen, und der sieht auf dem Bild sauber aus...
Hallo, Ich leide, wenn ich das Dauerthema "Entprellen" immer wieder lesen muss. Vorschlag: Der Taster soll keinen Interrupt auslösen, sondern wird periodisch abgefragt. z.B. Timerinterrupt alle 1 ms. 1. In der ISR soll bei gedrückter Taste eine Variable hochgezählt werden, bei losgelassenem Taster wird die Variable Dekrementiert werden. z.B. if(PINB.3 ) zaehler ++; else zaehler --; 2. Wert von der Variablen begrenzen. z.B Obergrenze/Untergrenze einführen const int OBERG 0 = 10, UNTERG = 0; if(z > OBEERG) z= OBERG; if( z < UNTERG) z = UNTERG; 3. schwelle einführen. if(z < 2) Schwelle = 0; if ( z > 7) Schwelle = 1; //Jetzt ist die Variable Schwelle entprellt.
Wo kommt jetzt der Taster her? War der bei Maria Cron mit dabei?
HildeK schrieb: > Sah alles schön aus - bis auf eine kaum wahrnehmbare, leichte Verformung > mitten in der Flanke. Der Verlauf war aber noch immer stetig. Wie soll eine Flanke unstetig sein? Meinst du vielleicht streng monoton?
Wolfgang schrieb: > Wie soll eine Flanke unstetig sein? Wenn ein eingekoppelter Störpuls drauf ist, vulgo "Delle".
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.