Hysterese in Programm schreiben

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Hysterese in Programm schreiben

      Hallo Leute,

      bis jetzt funktioniert das Progi aber was mir natürlich nicht gefällt, das ist der Schaltpunkt der Relaisausgänge! Besser wäre es, wenn es eine Hysterese gäbe die so ca. +2, -2 Grad bzw. Prozent beträgt, damit die Relais nicht das Flattern anfangen sobald sich ein Digit (Istwert) ändert. Nur leider hab ich sowas noch nicht gemacht und bräuchte eure Hilfe dazu. :?:

      Gruß
      Klaus
      Dateien
    • Dann addiere doch einfach zu deinen Werten 2 oder mehr hinzu bevor du diese mit den Sollwerten vergleichst oder du gestaltest deine Abfrage etwas anders.

      BASCOM-Quellcode

      1. If Wert_feucht_ist > Wert_feucht_ee Then ' Feuchte-Fühler mit Soll-Voreinstellung vergleichen
      2. Gosub Feuchte_aus ' Rel 2 "AUS"
      3. End If
      4. If Wert_feucht_ist < Wert_feucht_ee Then ' Feuchte-Fühler mit Soll-Voreinstellung vergleichen
      5. Gosub Feuchte_ein ' Rel 2 "EIN"
      6. End If
      7. If Wert_temp_ist > Wert_temp_ee Then ' Temperatur-Fühler mit Soll-Voreinstellung vergleichen
      8. Gosub Temp_aus ' Rel 1 "AUS"
      9. End If
      10. If Wert_temp_ist < Wert_temp_ee Then ' Temperatur-Fühler mit Soll-Voreinstellung vergleichen
      11. Gosub Temp_ein ' Rel 1 "EIN"
      12. End If
      Alles anzeigen

      z.B. nur wenn sich in einem Bereich zum Soll-Wert etwas ändert schalte das/die Relais ein.
      Dafür kannst du auch gut ein Select-Case nehemen.

      BASCOM-Quellcode

      1. Select Case Wert_temp_ist
      2. Case 15 to 25 : Rel1 = Ein
      3. Case Else : Rel1 = Aus
      4. End Select
      dient aber nur als Beispiel.

      Übrigens warum so umständlich

      BASCOM-Quellcode

      1. Dim Ein As Byte '
      2. Dim Aus As Byte '
      3. Ein = 1
      4. Aus = 0
      Es gibt auch Set und Reset zum setzen und löschen eines Bits/Pins

      Quellcode

      1. Set Rel1
      2. Reset Rel1
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von djmsc ()

    • Hallo djsmc,

      bin noch nicht dazu gekommen es auszuprobieren, ich hab aber auch noch Fragen. Wo füge ich dieses Beispiel ein, was bewirkt dieses 15 to 25 ( sollen die beiden Werte die Hysterese darstellen?), wo ist der Bezug aus den Sollwert im EEProm? Nur zu meinem Verständnis!

      Select Case Wert_temp_ist
      Case 15 to 25 : Rel1 = Ein
      Case Else : Rel1 = Aus
      End Select

      Ich hab noch nie etwas mit Select Case was gemacht.

      Das ist noch ein Überbleibsel und muss noch berichtigt werden. Tut im Augenblick der Funktion aber keinen Nachteil. :whistling:
      Dim Ein As Byte '
      Dim Aus As Byte '
      Ein = 1
      Aus = 0

      Sorry für diese vielleicht dummen Fragen aber für die Zukunft möchte ich das verstehen und mein Englisch hält sich echt in Grenzen (Bascom Hilfe).

      Gruß
      Klaus

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von veryoldman ()

    • Bei case kann man Wertebereiche angeben. In deinem Fall würde Rel1 eingeschaltet, wenn dein Wert_temp_ist Werte zwischen 15 und 25 hat.

      Noch ein Vorschlag von mir zur Hysterese, füge einfach zu Wert_temp_soll noch einen 2 Wert ein, der um den Hysteresewert höher oder niedriger als der Sollwert ist. Mit dem machst du dann die Abragen: if temp < soll dann Rel ein, if temp > soll+hyst dann Rel aus.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,

      so weit so gut, in meinem Fall wäre das dann bei der Soll-Temperatur 18° (frisch gemachte Wurst). a_442_4cb0df18
      Der Sollwert bzw. der Feuchtegrad liegt bei ca. 88% ! Die Würste hängen so ca. 14Tage bis drei Wochen im Trocken-Schrank!

      Müsste ich also z.B. 16 to 20 eingeben. Ist das richtig, wäre eine Hysterese von +-2°? Kann man denn eventuell diese Werte auch als Variable einsetzen? Sagen wir mal als "Ist_-H to Ist_+H" ? Dann könnte man ganz oben im Progi die Werte für alles eingeben. Wäre auch die Frage zu klären, wo im Progi käme diese Select Case Geschichte dann rein. Ich hab das im Augenblick mal anders probiert aber irgendwie hab ich den Eindruck, dass das nicht funktioniert, die Relais klackern immer noch. ?(

      Gruß
      Klaus
      Dateien
    • Wert_feucht_ist = Wert_feucht_ist - Hyst
      Das darfst du nicht machen.

      Dann wird ja der echte IST.Wert falsch angezeigt.
      Lcd "Feucht-Ist = " ; Wert_feucht_ist ; " " ; Chr(0) ; " " ' Anzeige Feuchte Istwert


      BASCOM-Quellcode

      1. Wert_feucht_ist_hys_plus = Wert_feucht_ee + Hyst
      2. Wert_feucht_ist_hys_minus = Wert_feucht_ee - Hyst
      3. If Wert_feucht_ist_hys_plus > Wert_feucht_ist Then ' Feuchte-Fühler mit Soll-Voreinstellung vergleichen
      4. Gosub Feuchte_aus ' Rel 2 "AUS"
      5. End If
      6. If Wert_feucht_ist_hys_minus < Wert_feucht_ist Then ' Feuchte-Fühler mit Soll-Voreinstellung vergleichen
      7. Gosub Feuchte_ein ' Rel 2 "EIN"
      8. End If

      Wie wäre es mit einem Timer um die Waitms aus deinem Programm zu eliminieren?
      Ich würde dir ein Beispiel geben wenn erwünscht.
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Trexis5 ()

    • Hi veryoldman (darf ich 'Alter' zu dir sagen? :D )
      Ich hab' mal in deinem Programm rumgeschmiert. Mein Ansatz ist, sofort Auszuschalten, wenn der Sollwert erreicht wird. Es wird sicher Überschwinger geben, die Heizung/Feuchtespender ist ja träge. Die Hysterese würde ich beim Wiedereinschalten einbauen. Wird der Sollwert, tiefer gesetzt um den Wert der Hysterese, unterschritten, wird wieder eingeschaltet. Ich hab' auch die Variablen, die den Adwandlerwert aufnehmen auf word gesetzt.

      Auch die Abfrage, ob schon was im eeram steht, hab' ich bisschen geändert, da hätte es doch eine Fehlermeldung geben müssen?
      Dateien
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo Holger, tschoeatsch,

      @Holger,
      da hab ich noch garnicht drüber nachgedacht, aber Du hast recht, das erklärt mir jetzt auch das Flattern der Anzeige auf dem Display! Was die Waits anbelangt, so möchte ich diese doch gerne verwenden, macht es für mich etwas einfacher!

      @tschoeatsch,
      Du kannst mich nennen wie Du willst, von mir aus auch blxdmann! Ihr könnt mir alles sagen! :whistling:
      Ja, die Geräte um die es sich hier handelt, sind vom Aufbau her schon sehr träge. Die Heizung besteht aus einem einfachen Raumwächter, der Luft-Befeuchter ist da schon professioneller und auch nicht ganz billig.
      Da bin ich ja mal gespannt, was Du da mit dem Code angestellt hast und ob ich da noch durchsteige (das ist nämlich die Hauptsache!). Ich lad mir das mal runter und meld mich dann wieder.

      Gruß
      Klaus
    • BASCOM-Quellcode

      1. $regfile = "m8pdef.dat" 'Definitionsdatei für ATmega
      2. Const _crystal = 8000000
      3. $crystal = _crystal 'Quarz: 8 MHz
      4. $hwstack = 64
      5. $swstack = 64
      6. $framesize = 64
      7. Config Timer0 = Timer , Prescale = 8 'Timer konfigurieren
      8. On Timer0 Timer_irq 'Timerinterrupt Subroutine zuweisen
      9. Enable Timer0 'Timer aktivieren
      10. Start Timer0 'Timer starten
      11. Dim Delay_0_2ms As Byte
      12. '---------[ Hautpprogramm]----------
      13. Do 'Beginn Hauptschleife
      14. '!Nop
      15. 'Programmbefehle einfügen
      16. If Taster_temp_soll = 1 Then Delay_0_2ms = 100
      17. If Taster_temp_soll = 0 Then ' Taster um den Sollwert Temperatur einzustellen
      18. 'Waitms 20 ' Wert wird mit Up bzw. Down verändert
      19. If Delay_0_2ms = 0 Then Gosub Temperatur
      20. End If
      21. Loop 'Ende Hauptschleife
      22. '---------------------------------------
      23. '------------[ Timer IRQ]------------
      24. Timer_irq: 'Beginn Subroutine
      25. Timer0 = 56 'Timer auf neuen Startwert einstellen
      26. 'Programmbefehle einfügen
      27. If Delay_0_2ms > 0 Then Decr Delay_0_2ms
      28. Return 'Ende Subroutine
      29. '---------------------------------------
      30. End
      Alles anzeigen
      So z.B.
      Besser wäre aber für die Taster die Interrupts zu nehmen und dann in dem Interrupt die abfrage der ms zu machen.



      BASCOM-Quellcode

      1. '----------------------------[ Interrupt ]----------------------------------------
      2. Int1_isr:
      3. If Delay_0_2ms = 0 Then 'lange gebug gedrückt
      4. Delay_0_2ms = 100 'Wert wieder hochschreiben
      5. 'Program abarbeiten oder bit setzten und in Hauptschleife abarbeiten
      6. End If
      7. Return 'Ende int
      8. '--------------------------------------------------------------------
      Alles anzeigen
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Trexis5 ()

    • @Trexis5 ehrlich gesagt, ich verstehe nicht, was du vorschlägst. a_27_b277ca12 Wenn ich das richtig interpretiere, dann bastelst du einen interrupt, um den Sprung in die Stellroutine zu verzögern. Warum? Oder seh' ich was falsch?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Es geht um die Wait Geschichten zu eliminieren.
      Der Timer ist halt Hardware und hält das Programm nicht an.

      In dem Timer kannst du dann mehrere Variabeln zählen lassen für verschiedene Aufgaben.
      Der hat einen 0,2ms Takt.

      Ich verwende immer zwei Timer.
      Einen schnellen für solche geschichten und einen 1sec. Timer für Uhr und andere längere Zeiten.


      Das beste wäre halt für Taster Interrupts zu nehmen und dann ist die Variabele fürs Prellen normal immer 0.
      Dann drückst du die Taste und arbeitest das Programm im Taster ab und lädst auch die Prellzeit gleich auf 100 auf.
      Prellt der Taster passiert nichts im Interrupt.
      Ich poste mal ein Beispiel...
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___
    • BASCOM-Quellcode

      1. $regfile = "m8pdef.dat" 'Definitionsdatei für ATmega
      2. Const _crystal = 8000000
      3. $crystal = _crystal 'Quarz: 8 MHz
      4. $hwstack = 64
      5. $swstack = 64
      6. $framesize = 64
      7. Config Timer0 = Timer , Prescale = 8 'Timer konfigurieren
      8. On Timer0 Timer_irq 'Timerinterrupt Subroutine zuweisen
      9. Enable Timer0 'Timer aktivieren
      10. Start Timer0 'Timer starten
      11. Dim Delay_0_2ms As Byte
      12. Portd.2 = 1 'PD: (Pull UP) PB2 aktivieren INT0
      13. On Int0 Taste_up 'Interrupt-Routine für Taster
      14. Config Int0 = Falling 'Interrupt 0 bei L-Flanke auslösen
      15. Enable Int0 'Externen Intterrupt 0 ein
      16. Dim Taster_bit_arbeit As Bit
      17. Enable Interrupts 'Global Interrupts erlauben.
      18. '---------[ Hautpprogramm]----------
      19. Do 'Beginn Hauptschleife
      20. 'Programmbefehle einfügen
      21. If Taster_bit_arbeit = 1 Then
      22. Reset Taster_bit_arbeit
      23. 'jetzt EEPROM schreiben usw.
      24. End If
      25. Loop 'Ende Hauptschleife
      26. '---------------------------------------
      27. '--------------[ Taste ]---------------
      28. Taste_up:
      29. If Delay_0_2ms = 0 Then
      30. Delay_0_2ms = 100
      31. Set Taster_bit_arbeit
      32. End If
      33. Return
      34. '---------------------------------------
      35. '------------[ Timer IRQ]------------
      36. Timer_irq: 'Beginn Subroutine
      37. Timer0 = 56 'Timer auf neuen Startwert einstellen
      38. 'Programmbefehle einfügen
      39. If Delay_0_2ms > 0 Then Decr Delay_0_2ms
      40. Return 'Ende Subroutine
      41. '---------------------------------------
      42. End
      Alles anzeigen
      So z.b mache ich es mit Taster die an dem Interrupt hängen.
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___
    • Hallo Holger,
      Interrupts für Tasterauswertung halte ich nicht für eine gute Idee.
      Die Dinger prellen in der Regel und dann musst du mit einigem Aufwand dafür sorgen, dass du nicht in Interrupts erstickst. Würde ich eher Debounce verwenden, damit ist dann gleich auch die 20ms Wartezeit erschlagen. Da müsste die Anwendung schon ziemlich zeitkritisch sein, dass Debounce nicht geeignet wäre.
      Die 20ms Wartezeit in veryoldmans Programm haben ja eigentlich keinen Sinn, wenn danach nicht noch einmal der Eingang abgefragt wird.
      Einen Timer mit 0,2ms Interrupt laufen zu lassen um 20ms Pause zu erzeugen, ist für mich auch nicht die richtige Wahl. Das Programm hält sich durch die Registerretterei dann viel zu lange im Interrupt auf. Selbst 2ms würde ich für den Zweck nicht machen.
    • @Trexis5 danke, für die Erklärung, hab's jetzt auch kapiert. Dein Verfahren erscheint mir bei powerdown-Geschichten gut geeignet zu sein, bei Programmen mit Schleifen, wie hier; erscheint mir debounce übersichtlicher und genauso geeignet zu sein. Und ob in der main gewartet wird, oder nur in einer anderen Schleife rumnudelt wird, ist hier auch egal.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • main gewartet wird, oder nur in einer anderen Schleife rumnudelt wird

      Falsch.
      Es gibt keine Schleife an der gewartet wird. Es wird immer das ganze Programm abgearbeitet und wenn der Programmzeiger wieder an der stelle ankommt und die bedingung erfüllt ist wird auch das bearbeitet und bei wait wird nichts mehr bearbeitet.

      BASCOM-Quellcode

      1. '---------[ Hautpprogramm]----------
      2. Do 'Beginn Hauptschleife
      3. 'Programmbefehle einfügen
      4. If Taster_bit_arbeit = 1 Then
      5. Reset Taster_bit_arbeit
      6. 'jetzt EEPROM schreiben usw.
      7. End If
      8. Toggle Led1
      9. Loop 'Ende Hauptschleife
      10. '---------------------------------------
      Alles anzeigen

      BASCOM-Quellcode

      1. '---------[ Hautpprogramm]----------
      2. Do 'Beginn Hauptschleife
      3. '!Nop
      4. 'Programmbefehle einfügen
      5. If Taster_temp_soll = 0 Then ' Taster um den Sollwert Temperatur einzustellen
      6. Waitms 20 ' Wert wird mit Up bzw. Down verändert
      7. 'If Delay_0_2ms = 0 Then Gosub Temperatur
      8. End If
      9. Toggle Led1
      10. Loop 'Ende Hauptschleife
      11. '---------
      Alles anzeigen

      Welche LED blinks schneller?
      Dann weist du welches Programm langsammer ist weil es wirklich angehalten wird.
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___
    • Es blinken beide gleich, weil kein Taster gedrückt wird. Nee, ich sage, das mit wait blinkt schneller, weil es nicht durch interrupts gebremst wird :D .
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Dann steht ein Benutzer da, der irgendwas rumfummeln will. Und der ist sicherlich nicht so schnell wie der AVR. Deswegen muss man für den Menschen sowieso alles bisschen langsamer machen, damit der mitkommt.
      Ich sag' ja nicht, dass dein Vorschlag schlecht ist, nur in diesem Fall überdimensioniert. Es wird nicht schneller auf den Tastendruck reagiert, du entprellst halt mit einem timer, mit debounce geht das hier genauso gut, weil ja, wie gerade erwähnt, jetzt auf die Schnelligkeit des Menschen eingegangen werden muss. Sonst würde man ja nicht gradweise die Solltemperatur einstellen können.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo ihr Lieben,

      da bin ich wieder!
      Man muss sich nur mal vor Augen führen, wann werden die Soll-Wert Tasten gedrückt! Im Normal-Fall nur ein einziges Mal, denn die ganze Anlage läuft so ca. 8 - 10 Wochen am Stück. Nur, wenn, sagen wir mal es gibt Stromausfall und die Werte im EEProm werden gelöscht (was nicht passieren sollte aber es trotzdem geschieht, das wäre eine Sache über die man nachdenken muss!). Ansonsten braucht man die Tasten nicht benutzen! Die eingestellten Werte gelten generell für alle Wurstsorten. Wenn die Wurstwaren aus den Schränken entnommen werden, dann hängen sie zum Nachreifen in einem normal kühlen Raum, das wars dann! Dann kommt die nächste Ladung bei gleichen Bedingungen in die Trocknung!
      Ich hab mir mal eine 12 Tasten IR Fernbedienung gebaut, da war es angebracht die Interrupts zu benutzen aber bei dieser Geschichte, sag ich mal, bin ich der gleichen Meinung wie tschoeatsch. Die Tasten wird ich wohl entprellen mit debounce, ist nicht ganz so aufwendig.

      @tschoeatsch,
      ich hab mir Deine Version in meinen Versuchsaufbau geschoben und es funktioniert sehr gut. War ich eigentlich auf dem richtigen Weg, leider nur an der falschen Stelle. ;) ;( Bleibt mir eigentlich, jetzt die Fühler an die Eingänge anzupassen (ich möchte eigentlich keine OPs verwenden) und die Kühlung in das Programm zu kriegen. Mal schauen!

      Gruß
      Klaus