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.
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.
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.
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
staticvolatileuint32_tcount2;
2
3
ISR(INT0_vect)
4
{
5
PORTB|=1;
6
count2++;
7
PORTB&=~1;
8
}
9
10
intmain(void)
11
{
12
EICRA=1<<ISC01|1<<ISC00;
13
EIMSK=1<<INT0;
14
15
while(1)
16
{
17
uint32_tval1,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.
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?