Interruptproblem

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Interruptproblem

      Hallo,
      ich erweitere gerade ein altes Projekt "Funk-Temperatur-Datenlogger" um einen Regensensor.
      Wenn die Wasserwaage kippt dann schaltet ein Reedkontakt und diese Schaltvorgänge werden gezählt.

      Das Problem ist, dass Schaltvorgänge erkannt werden die es gar nicht gibt. Hierbei meine ich nicht eventuelles prellen.
      Die Kippwaage steht im Büro, die Waage ist demontiert, der Magnet ist weit weg vom Reedschalter, trotz allem werden immer wieder
      Impulse gezählt.

      Meine erste Vermutung war, dass eventuell der interne Pullup defekt ist. Deshalb habe ich extern einen Pullup von 10k gegen V+ geschaltet.
      Das brachte keine Verbesserung.

      Die Schaltung ist so:

      V+ -------Widerstand 10K -----------------------I
      I
      I
      Gnd ------Widerstand 1K----I--Reedkontakt - I----- Eingang PD3
      I I
      I-------II----------- I
      Tantal

      Der Widerstand 1 K und der Tantal Kondensator sind Bestandteil der alten vorhandenen Kippwaage


      Testweise auf einen anderen Interrupt wechseln kann ich nicht, da InT0 für den Funk zuständig ist.

      Während der Regensensor Interrupt eintrifft ist der Controller in der For -Schleife "Schlafzeit" (siehe nachfolgender Code-Ausschnitt)
      Um den Batterieverbrauch zu optimieren wird der Controller 15 Minuten schlafen gelegt.
      Da ich keine so lange Zeit per Timer realisieren konnte wird mit Timer 2 ein 1/4 Sekunden Interrupt generiert.
      D.h. der Controller geht 3520 mal für jeweils 1/4 Sekunde schlafen.
      Vielleicht geht das besser aber ich habe hierfür keine andere Lösung gefunden.


      Ich bin grad etwas ratlos, was ich noch machen kann um den Fehler zu finden .
      Aber vielleicht hat ja noch jemand eine Idee.
      Danke im Voraus





      Const Timer_preload = 11 'Timervorgabe für 1/4 Sekunden Takt (Timer2 8 Bit)
      Config Timer2 = Timer , Prescale = 1024
      On Timer2 ISR_Sectic

      Timer2 = Timer_preload
      Enable Timer2

      Enable Interrupts

      For Schlafzeit = 1 To Schlafintervall
      Config Powermode = Powersave '= 3520 1/4 Sekunden
      Next





      $regfile = "m328pdef.dat"
      $framesize = 32
      $swstack = 100
      $hwstack = 64
      $crystal = 1000000 'Quarzfrequenz
      'Achtung Fuse Bits sind so gesetzt.
      'Intern RC 8 MHZ, Teiler durch 8 ist eingeschaltet: Also 1 MHZ



      'E/A Belegung Register B
      ' |--------PD7 (1Wire Kommunikation)
      ' ||-------PD6 (PCInt22) Test LED2 (später wieder Eingang mit Pullup !)
      ' |||------PD5 (PCInt21) Test LED1 (später wieder Eingang mit Pullup !)
      ' ||||-----PD4 (PCInt20 schaltet T2
      ' |||||----PD3 (PCINT19) INT1 (Regensensor)
      ' ||||||---PD2 (Int0 IRQ Funkmodul)
      ' |||||||--PD1 (TxD)
      ' ||||||||-PD0 (RxD)
      DdrD = &B01110011 '0 = Eingang 1 = Ausgang
      PortD = &B00001000 '1 = Pullup bei Eingang




      '----------------------------------Regensensor Interrupt---------------------------------------
      Config Int1 = Falling '
      Enable Interrupts 'Einschalten der Interrupts
      Enable Int1 'Einschalten Interrupt Int1
      On Int1 ISR_Regensensor


      Isr_Regensensor:
      Kippanzahl = Kippanzahl + 1
      Toggle LED_Regensensor
      Print "Kp=";Kippanzahl
      Return



      '---------------------------------------------------------------------------------------------
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • o.K. das ist mal ein Ansatz.
      Nachdem ich den Tantal ausgelötet habe, prellt der Kontakt, ich bekomme mehrere Interrupts pro Kippvorgang.
      Prinzipiell hat er also funktioniert.

      Habe jetzt einen neuen eingelötet und warte mal ab, ob es in der Wohnung immer noch regnet ;)
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • Hi,
      die toggle LED ist natürlich nur für Testzwecke drin. Und sie hat mir gestern Abend noch geholfen
      den Fehler zumindest etwas besser zu verstehen.
      Zuerst einmal: Als ich den Tantal durch einen anderen Tantal Kondensator ersetzt hatte schien es so, dass sich das Problem gelöst hat. Der Fehler trat scheinbar nicht mehr auf. Gestern Abend machte ich dann das Licht aus und sah wie die toggle LED anging. Ich konnte dann mit Licht Aus/Ein sehr zuverlässig den Interrupt auslösen.
      Ich habe dann auf die schnelle den externen Pullup Widerstand auf 1K verringert. Den in der Schaltung vorhandenen Widerstand (1k) , der in Reihe zum Reedkontakt liegt habe ich kurzgeschlossen. Seit dieser Änderung funktioniert es sicher. (Auch mit Licht AN/AUS)
      Heute Abend schaue ich dann mal mit dem Scope die Pegel an. Irgendwas ist da faul und ich denke der Fehler muss in der Hardware liegen.
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • Jein.
      Direkt über dem Schreibtisch hängt eine Leuchtstofflampe mit Röhre und Starter.
      Mitten im Raum ist eine moderne LED Flächenlampe.

      Mit beiden Lampen konnte ich den Interrupt auslösen.

      Mit der nachfolgend gezeigten Schaltung sieht es aktuell gut aus.
      R1 und C1 sind vorhandenen Bauteile.
      Ursprünglich habe ich mit dem internen Pullup des Controllers gearbeitet.
      Ich erhielt damit viele falsche Kippmeldungen.

      Dann habe ich mit R2=10k einen externen Pullup angeschlossen. Dies brachte keine Verbesserung.
      Danach habe ich C1 ausgetauscht. Hiermit hatte ich nur noch Fehler wenn ich das Licht ein oder ausgeschaltet habe.

      R2 habe ich dann stufenweise erniedrigt bis ich auch bei hartnäckigem Licht Ein/Aus keinen falschen Interrupt mehr sah.
      R2 ist jetzt 1K. Den Widerstand R1 habe ich aktuell (so aus dem Gefühl raus) überbrückt.

      Ich habe bisher noch nie einen externen Pullup benötigt, habe immer mit dem internen Pullup gearbeitet.
      Keine Ahnung warum ich den hier brauche und dazu auch noch so ein kleiner Wert.

      Die ganze Schaltung ist aktuell auf dem Steckbrett aufgebaut, also sicher nicht EMV optimal.
      Und, die Leitung von der Kippwaage ist ca. 5 Meter lang, sie liegt aufgewickelt auf dem Schreibtisch.
      Ist also sicher eine schöne Antenne.

      Kippsensor.JPG
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • R1 gehört da nicht rein. Da hast du einen prima Spannungsteiler welche den Logicpegel in den "verbotenen" Bereich zieht, bei 1k +1k. Da bekommst du nie einen ordentlichen Low-Pegel. Das kann nicht funktionieren, und wenn du eine lange Leitung anschließt ist ein Optokoppler dazwischenzuschalten sonst wird das Ganze nie störsicher. Stromschnittstelle , wie Mitch64 schon sagte.
    • Pluto25 wrote:

      Braucht er auch nicht (falling) .
      Nein, interruptüberwachte Pin's sind digitale Eingänge. Am pin hängt ein Flankenversteilerer mit Schmitt-Trigger-Hysteresis, gefolgt von 2 D-FlipFlops (synchronicer). Es ist also ein reiner digitaler Eingang und ein (z.B.) Abfall von am Pin von 3,3V auf 3V (ist also falling) löst keinen Interrupt aus da der Flankenversteilerer darauf nicht reagiert. Hier ist also ein ordentlicher digitaler Pegel erforderlich. Erst nach den D-FlipFlops wird das Interrupt-auslösende Verhalten detektiert.
    • Klar. eben kein sauberes Low sondern irgendwo mitten drin was ein Problem wird wenn ein 3,3V Gerät zu einem mit 5V spricht. Da ist der Low Lever besser geeignet. Leider hilft das Climber nicht da der Low Level immer wieder int ausgibt solange der Pin Low ist. Und er keinen Low Level erreichte mit dem R1. :D
      @Climber Ist die Waage nicht relativ langsm? So das der Pin in der Main loop (nach dem Aufwachen) abgefragt werden könnte? Oder kippt sie sofort wieder zurück? Dann könnte die Low Lever Isr darauf warten das der Pin wieder High ist.
    • oscar wrote:

      Das liegt am Schitt-Trigger und wenn man den Eingang per Spannungsteiler irgendwo in der Hysteresis parkt genügen schon kleine Schwankungen zur seltsamen Auslösung der Interrupts. Keine saubere Sache.
      Wenn sich der Pegel innerhalb der Hysterese bewegt, ändert sich der gelesene Pegel (High bzw. Low) nicht.
      Ein High wird lt. Datenblatt erst erkannt, wenn 0.6 x VCC überschritten wird und Low, wenn 0,3 x VCC unterschritten wird.
      Bei 5V VCC ist das eine Hysterese von 1,5V bis 3V.

      Bildschirmfoto vom 2020-08-28 12-51-39.png

      oscar wrote:

      Am pin hängt ein Flankenversteilerer mit Schmitt-Trigger-Hysteresis,
      Stimmt so au nit!
      Das ist ein Schmitt-Trigger (und die haben eben lt. Definition eine Hysterese), der ein Rechteck liefert.
      Ein Flankenversteilerer wäre ein Comparator.
      Bildschirmfoto vom 2020-08-28 13-01-25.png
    • Hi,
      erst mal vielen Dank für Eure Antworten.
      Also so wie es aussieht funktioniert es mit der unten gezeigten Schaltung.
      Ich habe viele Versuche mit "Störern" (Handy, Leuchtstoffröhren, LED Lampen, Bohrmaschine) gemacht
      es gab so keine Fehler mehr.

      Der Widerstand in Reihe zum Reedschalter habe ich überbrückt.
      Zusätzlich zum internen Prozessor Pullup habe ich einen externen Pullup (1K) gegen 3,3 V geschaltet.
      Da alles später über Batterie versorgt wird ist natürlich auch der Stromverbrauch zu berücksichtigen.
      Hier bin ich mir nicht sicher wie sich der externe Pullup auswirkt. Werde ich noch messen, aber aktuell will
      ich die nächsten Regentage nutzen um richtige Regenwerte zu sammeln und mit einem geeichten Messrohr zu vergleichen.


      Aktuell habe ich die Idee in der finalen Version die Kippwaage über einen Optokoppler auszuwerten.
      Das erscheint mir dann irgendwie stabiler. Den Optokoppler sockle ich und kann ihn dann bei Defekt leicht auswerten.


      Kippsensor2.JPG
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • Mitch64 wrote:

      und Low, wenn 0,3 x VCC unterschritten wird.
      Oscar bezog sich auf den falling int. Da ist die Hysterese mit ca 0,2 V wirklich klein. Wie ein Versuch gerade zeigte: Bei anderen Pins ist sie aber auch nicht größer. Es sind vermutlich überall die gleichen Schmitt Trigger verbaut.
      Ich muß mich widersprechen: a_323_0bf6d0cd Der Low Level arbeitet bei der selben Schaltschwelle. Keine Ahnung warum mein Programm damit arbeitet und nicht mit dem falling ?(
      Atmega8A 4,97V unter 2,09 Low über 2,29 High dazwischen das was vorher war. Und ein int beim Unterschreiten der 2,09 eine weiterer erst nachdem die 2,29 überschritten wurden. ( D.3 als int und B.0 als normaler Pin