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.

    • Wie viele Tinys hast du denn im Einsatz?

      Das kann man doch alles mir einem Controller machen.

      Und wieso vom ATMega einen externen Tiny triggern, der dann einen Pegel an den ATMega zurück gibt?

      Da kann man doch den Tiny weg lassen und an den Eingang ATMega einfach einen Schalter anschließen.

      Irgendwie ist das Konstrukt für mich nicht nachvollziehbar.
    • Hallo Mitch64.

      Ich habe 2 Tinys im einsatz. Wenn meine Testabläufe ohne Fehler Arbeiten soll alles dann über einen Atmega Laufen.

      In mein Original Programm ist alles ganz genau Bezeichnet. Ich habe zuerst die Wasserweichensteuerung aufgebaut. Die ich auch mit einer Taste Weiterschalten kann.
      Die Temperatursteuerung Arbeitet Prezise mit den Tiny24. Dadurch das ich nicht weis ob alles ohne Probleme Arbeitet will ich die Temperatursteuerung nicht mit Einbinden .
    • Stefan wie wrote:

      Ich habe 2 Tinys im einsatz. Wenn meine Testabläufe ohne Fehler Arbeiten soll alles dann über einen Atmega Laufen.
      Wieso integrierst du die Funktionen der Tinys nicht gleich in den ATMega?
      Wenn der Test Erfolgreich ist, bist du dann fertig mit diesen Programmteilen.

      Wenn du das erst dann integrierst, könnte unerwartetes auftreten und du beginnst den Fehler zu suchen.

      Willst du uns dein Original-Programm nicht zeigen?
    • Source Code

      1. 'Erste Geschirrspüler Steuerung
      2. $regfile = "m328pdef.dat"
      3. $crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. Config Portd.2 = Output ' 0 = An , 1 = Aus
      8. Config Portd.3 = Output
      9. Config Portd.4 = Output
      10. Config Portd.5 = Output
      11. Config Portd.6 = Output
      12. Config Portb.0 = Output
      13. Heizung Alias Portb.0 ' Heizung als Taster
      14. 'Ausgänge
      15. Umwp Alias Portd.2 'Umwälzpumpe
      16. Laugp Alias Portd.3 'Laugenpumpe
      17. Zulaufv Alias Portd.4 'Zulaufventil
      18. Enthanlage Alias Portd.5 'Enthärtungsanlage
      19. Reiniger Alias Portd.6 'Reiniger
      20. Config Portb.3 = Output
      21. Led_ein Alias Portb.3
      22. Config Portb.4 = Output
      23. Led1 Alias Portb.4
      24. 'Eingänge
      25. Config Pinb.1 = Input
      26. Druckschalter Alias Pinb.1
      27. Portb.1 = 1
      28. Config Portc.1 = Output ' Wasser Weiche
      29. Wasserw Alias Portc.1
      30. 'Portb.2 = 1
      31. Config Pinc.5 = Input
      32. Taster Alias Pinc.5
      33. Portc.5 = 1
      34. Laugp = 1 'Laugenpumpe 10 Sekunden Einschalten
      35. Wait 20
      36. Laugp = 0
      37. Dim I As Byte
      38. Dim Schritt As Byte
      39. Do
      40. Debounce , Taster , 0 , Einschalten , Sub
      41. 'If Led_ein = 1 Then Gosub Starten
      42. If Led_ein = 1 Then
      43. If Druckschalter = 1 Then
      44. Zulaufv = 1
      45. Else
      46. Zulaufv = 0
      47. End If
      48. End If
      49. Loop
      50. End
      51. Einschalten:
      52. Toggle Led_ein
      53. 'Gosub Starten
      54. Return
      55. 'Einfuellen:
      56. 'Toggle Zulaufv
      57. 'Return
      58. Starten:
      59. If Schritt = 7 Then Gosub Einschalten
      60. Incr Schritt
      61. If Schritt = 8 Then Schritt = 0
      62. Select Case Schritt
      63. Case 1 :
      64. 'Zulaufv = 1 'Zulauf
      65. 'Waitms 20
      66. 'Bitwait Druckschalter , Reset
      67. 'If Druckschalter = 1 Then
      68. 'Waitms 30
      69. 'Zulaufv = 0
      70. 'End If
      71. Case 2 :
      72. 'If Druckschalter = 1 Then '1 Mal Vorwaschen
      73. Umwp = 1
      74. Wait 120 '1 Mal Vorwaschen
      75. Umwp = 0
      76. Wait 4
      77. Wasserw = 0
      78. Waitms 20
      79. Wasserw = 1
      80. Wait 4
      81. Umwp = 1 '2 Mal Vorwaschen
      82. Wait 120
      83. Umwp = 0
      84. Wait 4
      85. Wasserw = 0
      86. Waitms 20
      87. Wasserw = 1
      88. Wait 4
      89. Umwp = 1 '3 Mal Vorwaschen
      90. Wait 120
      91. Umwp = 0
      92. Wait 4
      93. Wasserw = 0
      94. Waitms 20
      95. Wasserw = 1
      96. Wait 4
      97. Umwp = 1 '4 Mal Vorwaschen
      98. Wait 120
      99. Umwp = 0
      100. Wait 4
      101. Wasserw = 0
      102. Waitms 20
      103. Wasserw = 1
      104. Wait 4
      105. Umwp = 0
      106. 'End If
      107. Case 3 :
      108. Laugp = 1 'Abpumpen Laugenpumpe 10 Sekunden Einschalten
      109. Wait 20
      110. Laugp = 0
      111. Case 4:
      112. '
      113. Zulaufv = 1 'Zulauf für den Hauptwaschgang
      114. 'Bitwait Druckschalter , Reset
      115. If Druckschalter = 1 Then
      116. Waitms 30
      117. Zulaufv = 0
      118. End If
      119. Reiniger = 1 'Reiniger dazugeben
      120. Wait 1
      121. Reiniger = 0
      122. Heizung = 1 'Heizung an
      123. Case 5:
      124. For I = 0 To 5 '5 Mal Hauptwaschgang
      125. Umwp = 1
      126. Wait 120 '1 Mal
      127. Umwp = 0
      128. Wait 4
      129. Wasserw = 0
      130. Waitms 20
      131. Wasserw = 1
      132. Wait 4
      133. Umwp = 1 '2 Mal
      134. Wait 120
      135. Umwp = 0
      136. Wait 4
      137. Wasserw = 0
      138. Waitms 20
      139. Wasserw = 1
      140. Wait 4
      141. Umwp = 1 '3 Mal
      142. Wait 120
      143. Umwp = 0
      144. Wait 4
      145. Wasserw = 0
      146. Waitms 20
      147. Wasserw = 1
      148. Wait 4
      149. Umwp = 1 '4 Mal
      150. Wait 120
      151. Umwp = 0
      152. Wait 4
      153. Wasserw = 0
      154. Waitms 20
      155. Wasserw = 1
      156. Wait 4
      157. Umwp = 0
      158. Next I
      159. Case 6:
      160. Heizung = 0
      161. Laugp = 1 'Abpumpen Laugenpumpe 10 Sekunden Einschalten
      162. Wait 20
      163. Laugp = 0
      164. Case 7 :
      165. For I = 0 To 3
      166. Zulaufv = 1 'Zulauf für den Hauptwaschgang
      167. 'Bitwait Druckschalter , Reset
      168. If Druckschalter = 1 Then
      169. Waitms 30
      170. Zulaufv = 0
      171. End If
      172. Umwp = 1
      173. Wait 120 '1 Mal
      174. Umwp = 0
      175. Wait 4
      176. Wasserw = 0
      177. Waitms 20
      178. Wasserw = 1
      179. Wait 4
      180. Umwp = 1 '2 Mal
      181. Wait 120
      182. Umwp = 0
      183. Wait 4
      184. Wasserw = 0
      185. Waitms 20
      186. Wasserw = 1
      187. Wait 4
      188. Umwp = 1 '3 Mal
      189. Wait 120
      190. Umwp = 0
      191. Wait 4
      192. Wasserw = 0
      193. Waitms 20
      194. Wasserw = 1
      195. Wait 4
      196. Umwp = 1 '4 Mal
      197. Wait 120
      198. Umwp = 0
      199. Wait 4
      200. Wasserw = 0
      201. Waitms 20
      202. Wasserw = 1
      203. Wait 4
      204. Umwp = 0
      205. Laugp = 1 'Abpumpen Laugenpumpe 10 Sekunden Einschalten
      206. Wait 20
      207. Laugp = 0
      208. Next I
      209. End Select
      210. Return
      Display All
    • Das Programm ist ja schon mal aufschlussreich.

      Ein Syntax-Fehler ist drin: Debounce , Taster , 0 , Einschalten , Sub

      Das Komma (Rot) gehört da nicht hin.

      Im Prinzip sehe ich da schon eine Statemachine.
      Was da allerdings fehlt sind Ereignisse/Bedingungen, die den Zustand wechseln.
      Ereignisse sind Informationen von Sensoren, Tasten.

      Auch wird die Routine "Starten" nicht aufgerufen und es wurde kein Startzustand am Anfang festgelegt.

      Da jetzt eine neue Basis (dein Programm) da ist, meine Frage:

      Wo klemmt es jetzt oder was geht nicht. Wie können wir helfen?

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

    • Starten ist kein Problem

      Einfüllen wird ausgeführt und danach Vorwaschen.

      Dann soll wieder Wasser Eingefüllt werden für den Hauptwaschgang.
      Bevor eingefüllt wird geht die Waschpumpe an ohne das das Einfüllen Fertig ist.
      Ich habe es versucht mit Bitwait. Geht nicht zuverlässig.

      Also wichtig ist das abgewartet wird bis das Wasser Fertig eingefüllt ist und dann zum nächsten Programmabschnitt geht.

      Danke
    • Was du da hast ist quasi eine Ablaufsteuerung.
      Also ein fixer Ablauf von Schritt zu Schritt.

      Wie du bemerkt hast, ist Wassereinfüllen irgendwie anders.
      Denn es muss eigentlich 2x aufgerufen werden.

      Entweder das Wassereinfüllen im Ablauf 2x einfügen einfügen, was die unschöne Lösung ist.

      Besser ist, den Wassereinlauf in eine Sub zu packen, damit du den Wassereinlauf von mehren Programmstelllen aus aufrufen kannst.

      Etwa so:

      BASCOM Source Code

      1. Sub WasserEinlauf()
      2. Zulaufv = 1 ' Ventil öffnen
      3. Do
      4. If Druckschalter=1 then Exit Do ' Warten, bis Wasserstand stimmt
      5. Loop
      6. Zulaufv = 0 ' Ventil schließen
      7. End Sub
      Dieses Unterprogramm rufst du zu Beginn der beiden Waschprogramme auf.
    • Beim zweiten Zulauf (bei Zeile 170) unbedingt auf den Druckschalter warten. Kommt kein Wasser brennt die Heizung ab dannach dann die Pumpendichtung. Das jetzige if erkennt nur ob er voll ist , wenn nicht wird es einfach übergangen. Ein Do vorher und Loop until Druckschalter = 1 nach den end if sollte das beheben
    • Montag, 20:35
      Was du da hast ist quasi eine Ablaufsteuerung.
      Also ein fixer Ablauf von Schritt zu Schritt.

      Wie du bemerkt hast, ist Wassereinfüllen irgendwie anders.
      Denn es muss eigentlich 2x aufgerufen werden.

      Entweder das Wassereinfüllen im Ablauf 2x einfügen einfügen, was die unschöne Lösung ist.

      Besser ist, den Wassereinlauf in eine Sub zu packen, damit du den Wassereinlauf von mehren Programmstelllen aus aufrufen kannst.

      Etwa so:


      BASCOM-Quellcode

      1. Sub WasserEinlauf()
      2. Zulaufv = 1 ' Ventil öffnen
      3. Do
      4. If Druckschalter=1 then Exit Do ' Warten, bis Wasserstand stimmt
      5. Loop
      6. Zulaufv = 0 ' Ventil schließen
      7. End Sub
      Dieses Unterprogramm rufst du zu Beginn der beiden Waschprogramme auf.





      Hallo

      ich habe das versucht aber da wird das Ventil nicht Angesprungen.

      Das sub wird einfach Übergangen.


      In der Haupt do loop Schleife geht es !
    • @Stefan wie Könntest du bitte die Zitat-Funktion benutzen um einen anderen Benutzer zu zitieren.
      Das macht es übersichtlicher (siehe Post 30).

      Zitieren kannst du auf zwei Arten:
      1. du markierst den Text eins anderen Benutzers und klickst dann auf Zitat einfügen (es erscheint ein kleines Menü)
      2. Wenn du mit der Maus über eine andere Antwort fährst erscheint unten rechts in der Anwort ein kleines Menü und
      da kannst du die komplette Antwort als Zitat einfügen indem du auf klickst.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @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.
    • @Mitch64

      ich weis ja das Du sehr engagiert bist aber ich glaube diesmal bist du über das Ziel hinausgeschossen. Hier im Forum soll Hilfe zur Selbsthilfe gegeben werden. Nur bei solchen Aussagen kann das Problem nicht so wichtig bzw. interressant sein.

      Stefan wie wrote:

      Hallo ich muß den Code jedesmal von Lappi da auf den Computer laden. Das ist Mühsam.
      Immer habe ich keine Lust !
      Schon vor über 20 Posts hatte ich daruf hingewiesen, das "sprechende "Variablen und ein PAP sinnvoll sind um das Programm zu verstehen. Nach dem Programmcode wurde auch schon mehrmals gefragt (auch von Dir) aber nur obige Reaktion. Schaltplan zeichnen ist auch so "schwierig"!

      Ich habe die Vermutung der TO will dass irgend jemand seine Hausaufgaben bzw. sein Homeschooling-Projekt erledigt und sich selbst einen schlanken Fuß macht.

      Und ich würde statt der Subs normale Unterprogramme verwenden. Spielt jetzt hier zwar keine entscheidende Rolle aber für jemanden der keine Ahnung hat sollte erstmal die einfache und normale Variante verwendet werden, Subs sind ja eigentlich für andere Aufgaben gedacht und erfordern normalerweise auch noch zusätzliche Angaben und daß sie an bestimmten Stellen bereits erklärt sein müssen bevor sie nutzbar sind.
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • hasta wrote:

      Ich habe die Vermutung der TO will dass irgend jemand seine Hausaufgaben bzw. sein Homeschooling-Projekt erledigt und sich selbst einen schlanken Fuß macht.
      Das ist aber auch nur eine Vermutung!

      Das Programm kann in der Realität so eigentlich nicht verwendet werden.
      Es sollte lediglich einige sinnvolle Programmierprinzipien aufzeigen.

      So gesehen bin ich nicht über das Ziel hinausgeschossen.

      Wenn er es brauchen kann gut, wenn er da schon aussteigt, dann auch gut.