Nach dem Einfüllen zum nächsten Programm Wechseln

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

    • Mitch64 wrote:

      Hallo Danke für die Mühe.
      Ich Spiele mich damit schon lange herum.
      Ich habe schon sehr viel Programmiert. Aufgabe braucht mir keiner machen.
      Für mich war nur ein Tipp wichtig.
      Ich habe wirklich schon sehr viele Aufwändige Sachen Programmiert.
      Nur da stehe ich an. Der Rest geht ja.
      Ich kann nur viele Möglichkeiten Ausprobieren.
      Ich habe den Originalen Ausschaltknopf wenn es Probleme gibt.












      @Stefan wie
      Da du dich mit dem Programm so schwer tust, habe ich mir gedacht, dein Programm mal zu nehmen und es etwas aufzuräumen und in eine Struktur zu bringen. Dann habe ich den Pins ordentliche Namen gegeben, so dass jeder, der den Programmcode anschaut versteht, was da passiert. Genauso bin ich vorgegangen mit den Unterprogrammen (SUB's / Functionen), die auch einen Aussagefähigen Namen erhalten haben.

      Vielleicht kannst du das Programm nachvollziehen und etwas dabei lernen. Natürlich darfst du auch Änderungen machen. Es ist kein Copyright drauf.

      BASCOM Source Code: Beispiel Geschirrspüler-Programm

      1. ' Erste Geschirrspüler Steuerung
      2. $regfile = "m328pdef.dat"
      3. $crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 40
      6. $framesize = 40
      7. Const TRUE = 1
      8. Const FALSE = 0
      9. ' --------------------------------------
      10. ' Eingänge festlegen
      11. ' --------------------------------------
      12. PIN_DRUCKSCHALTER Alias Pinb.1 : Portb.1 = 1 ' Druckschalter mit int. PullUp
      13. PIN_TASTER_START Alias Pinc.5 : Portc.5 = 1 ' Taster Start mit int. PullUp
      14. ' --------------------------------------
      15. ' Ausgänge festlegen
      16. ' --------------------------------------
      17. PIN_UMWAELZPUMPE Alias Portd.2 ' Umwälzpumpe
      18. PIN_LAUGENPUMPE Alias Portd.3 ' Laugenpumpe
      19. PIN_ZULAUFVENTIL Alias Portd.4 ' Wasser Zulaufventil
      20. PIN_ENTHAERTER Alias PortD.5 ' Enthärtungsanlage
      21. PIN_KLAPPE_REINIGER Alias Portd.6 ' Reiniger
      22. PIN_WASSERWEICHE Alias Portc.1 ' Wasserweiche
      23. PIN_HEIZUNG Alias Portb.0 ' Heizung
      24. PIN_LED_BETRIEB Alias Portb.3 ' Betriebsanzeige
      25. PIN_LED1 Alias Portb.4 ' LED 1 ?
      26. ' --------------------------------------
      27. ' Ausgänge konfigurieren
      28. ' --------------------------------------
      29. Config PIN_UMWAELZPUMPE = Output
      30. Config PIN_LAUGENPUMPE = Output
      31. Config PIN_ZULAUFVENTIL = Output
      32. Config PIN_ENTHAERTER = Output
      33. Config PIN_KLAPPE_REINIGER = Output
      34. Config PIN_WASSERWEICHE = Output
      35. Config PIN_HEIZUNG = Output
      36. Config PIN_LED_BETRIEB = Output
      37. Config PIN_LED1 = Output
      38. ' --------------------------------------
      39. ' Deklaration der verwendeten Routinen
      40. ' --------------------------------------
      41. Declare Function getKeyStart() as Byte ' Tasterabfrage
      42. Declare Sub Waschprogramm() ' Das Waschprogramm
      43. Declare Sub Waschzyklus() ' Ein Waschzyklus durchführen
      44. Declare Sub WasserEinlauf() ' Wasser-Einlauf, bis Druckschalter auslöst
      45. Declare Sub Abpumpen() ' Laugenpumpe
      46. Declare Sub ReinigerZugeben() ' Reiniger Hinzufügen
      47. Waitms 500
      48. Call Abpumpen() ' Laugenpumpe 20 Sekunden Einschalten
      49. ' ----------------------------------------------
      50. ' Hauptschleife
      51. ' ----------------------------------------------
      52. Do
      53. If getKeyStart() = 1 then ' Taster gedrückt?
      54. Call Waschprogramm() ' Waschprogramm ausführen
      55. End If
      56. Loop
      57. ' ----------------------------------------------
      58. ' Das komplette Waschprogramm
      59. ' ----------------------------------------------
      60. Sub Waschprogramm()
      61. Local i as Byte
      62. Set PIN_LED_BETRIEB ' Betriebsanzeige an
      63. ' Beginn Vorwaschprogramm
      64. Call WasserEinlauf() ' Zulaufventil
      65. For i = 1 to 4 ' Vorwäsche 4x Waschzyklus
      66. Call Waschzyklus()
      67. Next i
      68. Call Abpumpen() ' Abpumpen Laugenpumpe Einschalten
      69. ' Beginn Hauptwaschprogramm
      70. Call WasserEinlauf() ' Zulauf für den Hauptwaschgang
      71. Call ReinigerZugeben() ' Reiniger dazugeben
      72. PIN_HEIZUNG = 1 ' Heizung einschalten
      73. For I = 0 To 20 ' 5 x 4 Waschzyklen = Hauptwaschgang
      74. Call Waschzyklus()
      75. Next I
      76. PIN_HEIZUNG = 0 ' Heizung abschalten
      77. Call Abpumpen ' Abpumpen Laugenpumpe Einschalten
      78. ' Beginn Nachspülen
      79. For I = 0 To 3 ' 4 Wiederholungen
      80. Call WasserEinlauf() ' Zulauf für den Hauptwaschgang
      81. Call Waschzyklus() ' 1 Mal
      82. Call Waschzyklus() ' 2 Mal
      83. Call Waschzyklus() ' 3 Mal
      84. Call Waschzyklus() ' 4 Mal
      85. Call Abpumpen ' Abpumpen Laugenpumpe 10 Sekunden Einschalten
      86. Next I
      87. Reset PIN_LED_BETRIEB ' Betriebsanzeige aus
      88. End Sub
      89. ' ----------------------------------------------
      90. ' Hilfsroutinen / Unterprogramme
      91. ' ----------------------------------------------
      92. ' --------------------------------------
      93. ' Wasserzulauf, bis Druckschalter genug Wasser meldet
      94. ' --------------------------------------
      95. Sub WasserEinlauf()
      96. PIN_ZULAUFVENTIL = 1 ' Zulauf Wasserventil auf
      97. Do
      98. If PIN_DRUCKSCHALTER = 1 then exit Do ' Wasserpegel OK
      99. Loop
      100. PIN_ZULAUFVENTIL = 0 ' Zulauf Wasserventil aus
      101. End Sub
      102. ' --------------------------------------
      103. ' Zugabe des Reiniger
      104. ' --------------------------------------
      105. Sub ReinigerZugeben()
      106. PIN_KLAPPE_REINIGER = 1 ' Klappe Reiniger auf
      107. Wait 1
      108. PIN_KLAPPE_REINIGER = 0 ' Klappe zu
      109. End Sub
      110. ' --------------------------------------
      111. ' Laugenpumpe, Abwasser abpumpen (20s)
      112. ' --------------------------------------
      113. Sub Abpumpen()
      114. PIN_LAUGENPUMPE = 1 ' Laugenpumpe Einschalten
      115. Wait 20
      116. PIN_LAUGENPUMPE = 0 ' Laugenpumpe ausschalten
      117. End Sub
      118. ' --------------------------------------
      119. ' Ein Waschzyklus
      120. ' --------------------------------------
      121. Sub Waschzyklus()
      122. PIN_UMWAELZPUMPE = 1 ' Umwälzpumpe an
      123. Wait 120
      124. PIN_UMWAELZPUMPE = 0 ' Umwälzpumpe aus
      125. Wait 4
      126. PIN_WASSERWEICHE = 0 ' neg. Puls für Wasserweiche ausgeben
      127. Waitms 20
      128. PIN_WASSERWEICHE = 1
      129. Wait 4
      130. End Sub
      131. ' --------------------------------------
      132. ' Taster-Abfrage entprellt
      133. ' Gibt TRUE zurück, wenn Taster betätigt wird
      134. ' --------------------------------------
      135. Function getKeyStart() as Byte
      136. Debounce PIN_TASTER_START , 0 , _getKeyStart ' Taster ist Low-Aktiv
      137. getKeyStart = FALSE
      138. Exit Function
      139. _getKeyStart:
      140. getKeyStart = TRUE
      141. End Function
      Display All
      Ich nehme an, das Programm entspricht in etwa deiner Vorstellung.
      Ich muss aber dazu sagen, dass man es so nicht machen sollte.

      Probleme treten dann auf, wenn z.B. der Drucksensor nicht meldet oder kein Wasser kommt. Auch kann man das Programm so nicht abbrechen oder pausieren, um beispielsweise Geschirr nachzulegen. Wenn also Fehler auftreten, sollte der Benutzer auch die Möglichkeit haben, den Fehler zu beseitigen. Ebenfalls nicht berücksichtigt sind unterschiedliche Waschprogramme und Temperaturen (Temperaturregelung). Dafür sollte man das Programm dann als Zustandsautomat (Statemachine) schreiben.

      Wenn also mal was schief läuft beim obigen Programm, dann bleibt nur den Stecker zu ziehen.

      Thema Tastenentprellung:
      Ich habe in dem Programm ein besondere Form der Tastenentprellung verwendet. Sie ist eine Kombination aus Debounce und eigener Routine. Damit kann man den Tasten-Routinen schöne Namen (KeyUp, KeyDown, KeyOK etc.) geben.
      Die Methode ist sehr kompakt und verriegelt auch, d,h, sie löst nur 1x aus, auch wenn man auf der Taste bleibt. Die Entprellzeit ist, wie bekannt, mit Config Debounce einstellbar.
    • Das mit dem Zitieren scheint ja jetzt zu klappen. Versuch als Nächstes mal, nicht im Zitat zu antworten, dann kann man auch Dich vernünftig zitieren. So geht es leider nur als copy & paste:

      Hallo Danke für die Mühe.
      Ich Spiele mich damit schon lange herum.

      Ich habe schon sehr viel Programmiert. Aufgabe braucht mir keiner machen.
      Für mich war nur ein Tipp wichtig.
      Ich habe wirklich schon sehr viele Aufwändige Sachen Programmiert.
      Nur da stehe ich an. Der Rest geht ja.
      Ich kann nur viele Möglichkeiten Ausprobieren.
      Ich habe den Originalen Ausschaltknopf wenn es Probleme gibt.


      Ehrlich gesagt: das glaub ich nicht.
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Hallo
      Ich habe bei einen Test Festgestellt , das es in der Hauptschleife die Schalter oder Tasterabfrage besser geht.

      Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 4000000
      3. $hwstack=40
      4. $swstack = 16
      5. $framesize=32
      6. Config Portb.0 = Output
      7. Led1 Alias Portb.0
      8. Config Portb.1 = Output
      9. Led2 Alias Portb.1
      10. Config Pinc.1 = Input
      11. Taste Alias Pinc.1
      12. Pinc.1 = 1
      13. 'Led1 = 1
      14. 'Led2 = 1
      15. Declare Sub Schalten()
      16. Do
      17. 'If Taste = 1 Then 'Geht besser als mit declare sub. Da wird die Led1
      18. 'ganz Abgeschaltet
      19. 'Led1 = 1
      20. 'Else
      21. 'Led1 = 0
      22. 'End If
      23. Call Schalten()
      24. Loop
      25. End
      26. Sub Schalten()
      27. Led1 = 1 ' Zulauf Wasserventil 'Bei der selben Abfrage leuchtet bei mir ganz schwach noch die Led1 auf
      28. Do
      29. If Taste = 1 Then Exit Do ' Wasserpegel OK
      30. Loop
      31. Led1 = 0
      32. End Sub
      Display All
    • ftelektro wrote:

      aber innerhalb der Schleife
      Wozu? "anner" als an wird sie nicht.

      Kann man seine Beiträge nicht löschen?

      Es geht dabei ja um aus und nicht an, daher liegt ftelektro so halb richtig.
      Innerhalb der Loop auch ein else würde sie ganz aus lassen.
      Jedoch schaltet die Sub sie entgegengesetzt der Main.
      Sie soll während des Füllens leuchten (Taste=0) und ausgehen wenn sie voll ist (Taste=1)? Oder anzeigen das sie füllt?

      The post was edited 2 times, last by Pluto25 ().

    • Pluto25 wrote:

      Die Italiener haben das schon umgesetzt:

      Sorry ich bin schon etwas älter und kann es nicht erkennen …
      "Atmel" kann ich noch erahnen …
      Ist das ein mega ?
      Wen ja wäre so eine Steuerung ja nicht so uninteressant….
      Könnte von einem Gewerbespüler sein oder ?

      EDIT:

      gastroteileshop.de/eurotec-hau…m-laenge-185mm/a-1051301/

      ???

      The post was edited 1 time, last by HansHans ().

    • HansHans wrote:

      ja nicht so uninteressant…
      Nun der Preis und Aufwand sie in eine andere Maschine anzupassen ist vermutlich höher als selbst eine zu konstruieren. Es ist ein Mega aber natürlich lesegeschützt und bis erst mal die Beschaltung rückgezeichnet ist und dann noch ein eigenes Programm an ihr angepasst ist wäre eine Eigenkonstruktion in der Betaphase .
      Sie sitzt in einem keinen Gläserspüler. Da das Amtel Symbol ins Auge stach dachte ich es wär nett zu sehen wie Profis das Umsetzen. Welcher Mega genau draufsitzt habe ich nicht in Erinnerung. Da reicht der kleinste mit genügend Pins.