Aquarienheizungsreglung für 5 beheizbare Becken und 6 temperaturkontrollierte Becken

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

    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!

    • Aquarienheizungsreglung für 5 beheizbare Becken und 6 temperaturkontrollierte Becken

      Hallo zusammen,

      mit meinem Programm komme ich aus einer Art Teufelskreis nicht mehr hinaus.

      Zweck des Programms: Ich möchte 11 Temperaturen in 11 Aquarien messen und in 5 Aquarien die Temperatur aktiv über Heizer regeln. Zudem möchte ich eine jederzeit zuschaltbare Zusatzbeleuchtung, die nach Betätigung eines Tasters ausgelöst und ca. 4 Stunden in Betrieb bleiben soll, realisieren. Zuletzt soll noch eine 12V Dosierpumpe über Timer 2 mit PWM angesteuert werden können. Diese ist programmtechnisch noch nicht berücksichtigt worden. All das soll mit einem Drehgeber mit Taster gesteuert werden.

      Programmdarstellung:Einem Drehgeber hatte ich die Variable “Wert“ zugewiesen und über Wert Subroutinen verknüpft. Durch Betätigen des Drehgebertasters gelangt man ins Sub “Menue“. Dort sind die einzelnen Subs unter Wertaufgeführt. Durch Drehen des Gebers werden dann die gewünschten Subs angesprungen. Auch das funktioniert noch. Aber dann treten meine Probleme auf:
      Wähle ich z.B. den Wert 99an, so läuft die unter 99 angesiedelte Sub „“Automatische Anzeige“ problemfrei und beginnt nach Erreichen der letzten Aquarientemperatur auch wieder bei 600 L Becken oben. Aber: Ich komme dann nicht mehr aus dieser Schleife raus!
      Gleiches geschieht auch bei den manuellen Anzeigen, Wert 98 bis 88. Die gewählte Sub kann nicht mehr verlassen werden. Mir ist schon klar, dass die Spaßverderber die Do - Loop – until……, die Goto-Anweisungen etc. sind, die den Wechsel zu anderen Subs unterbinden. Aber mit Gosub und Return lande ich wieder im Sub Menü. Da will ich aber auch nicht hin!
      Einen Ausweg habe ich in Exit Dogesehen. Bei mir funktionierte diese Anweisung aber nicht, möglicherweise hatte ich Exit Do auch nicht an den richtigen Programmstellen platziert. Aber wo wäre Exit Do zu platzieren? Ich sehe diese Stelle nicht.

      Hat jemand einen Tipp, wie es funktionieren könnte? Für jede Hilfe bin ich sehr, sehr dankbar!

      Als Anlage füge ich mal den Quelltext, den Schaltplan und die Beschaltung des ATmega32 bei.


      Grüße Wilfried
      Files
    • mega wrote:

      Die gewählte Sub kann nicht mehr verlassen werden. Mir ist schon klar, dass die Spaßverderber die Do - Loop – until……, die Goto-Anweisungen etc. sind, die den Wechsel zu anderen Subs unterbinden. Aber mit Gosub und Return lande ich wieder im Sub Menü. Da will ich aber auch nicht hin!
      Da hilft die Verwendung von Statemachine(n).

      Dein Projekt ist recht umfangreich und hat auch eine gewisse Komplexität.
      Da hilft meiner Meinung nach nur eine oder mehrere Statemachinen einzusetzen, die quasi parallel und / oder miteinander verknüpft sind.
      Auf diese weise kannst du dein komplexes Projekt in kleinere weniger komplexe Teile aufteilen und so alles übersichtlich in den Griff bekommen.

      Wenn dich das Thema interessiert, ich habe im Lexikon die Statemachine beschrieben. Und dort findest du auch ein "Menü mit Bascom" Teil, was auch auf einer Statemachine beruht.

      Aber bevor du jetzt alles umstrickst, sollest du in Bascom den Code-Explorer aktivieren und mal die ganzen Fehler beseitigen.
      Vielleicht löst sich dann dein Programm-Problem schon. Zudem kann ich auch dein Projekt nicht compilieren, weil da Fehler auftreten.
      Display Spoiler

      Error : 40 Line : 75 Variable can not be used with RESET [DDRA] , in File : I:\Werkstatt\BascomForum\mega\Aquarien-Steuerung\Firmware\Aqua.- Reglung mit Drehgeber V 1.2.1.18.bas
      Error : 41 Line : 89 Variable can not be used with SET [DDRA] , in File : I:\Werkstatt\BascomForum\mega\Aquarien-Steuerung\Firmware\Aqua.- Reglung mit Drehgeber V 1.2.1.18.bas


      Im 2. Schritt empfehle ich dir, dein Programm in mehrere kleinere Include-Dateien aufzuteilen und das ganze dann als Projekt zu verwalten.
      Das hilft auch schon, den Überblich besser zu bekommen.

      Aufteilen kannst du z.B. in Aquarien-Regelung, RTC, Menü-Steuerung, Licht und Anzeigen (Display / LED).

      Ich habe noch andere Dinge gesehen was auch nicht so toll ist.
      Z.B. das:

      BASCOM Source Code: nicht so optimal

      1. 'LED heizen/ nicht heizen
      2. Config Porta.4 = Output
      3. Porta.4 = 0

      Besser den Pins aussagekräftige Namen verpassen:

      BASCOM Source Code: Besser und im Code besser nachvollziehbar

      1. 'LED heizen/ nicht heizen
      2. LED_Heizen Alias PortA.4
      3. Config LED_Heizen = Output
      4. LED_Heizen = 0

      Das soll jetzt nur konstruktive Kritik sein, damit du künftig im eigenen Code nicht den Überblick verlierst.

      Um dein Problem zu lösen solltest du erst mal die Fehler vom Code-Explorer abarbeiten. Dann sieht man weiter.
    • Den Fehler hatte ich gestern schon entdeckt.
      Bei @mega ist das vermutlich nicht aufgefallen, weil er genau den (oder was kompatibles) im Setting schon voreingestellt hat.

      Aber da sind Trotzdem eine ganze Latte an Fehlern, die der Codeexplorer anzeigt.

      Ich könnte die jetzt alle hier auflisten und die Korrektur dazu.
      Aber das soll Aufgabe vom @mega sein.

      Weiterhin ist mir aufgefallen, dass er Konstanten für die Kommandos der Dallas-Temperatur-Sensoren definiert hat.
      Vorbildlich!

      Leider hat er das nicht im Code verwendet.
      Da nützt die Definition dann auch nichts.

      Weiterhin sind viele Codeabschnitte fast Identisch.
      Das könnte man in Sub-Routinen packen und mit Parametern aufrufen.
      Würde das Konsequent gemacht, könnte man bestimmt den Code auf 25% der augenblicklichen Größe zusammen dampfen.
      Nützlicher Effekt, der Code wird übersichtlicher.

      Im Augenblick sind schon 70% vom Flash verbraucht. Und da fehlt noch einiges am Code, damit das Projekt ein Erfolg werden kann.
      Das würde beim augenblicklichen Programmierstyle wohl nicht mehr reinpassen in den Mega32.

      An der Stelle noch eine Frage an @mega:
      Verflixt, jetzt kann ich wieder kein Zitat einfügen!!!

      "Aber mit Gosub und Return lande ich wieder im Sub Menü. Da will ich aber auch nicht hin!"

      Wo willst du denn hinspringen?

      Übrigens, warum du nicht wieder zurück kommst liegt daran, dass du im Menü mit Goto in eine weitere Routine springst.
      Und dort steht am Ende ein Goto zum Anfang der Routine. So kann der natürlich nicht raus kommen.
    • mega wrote:

      Aber mit Gosub und Return lande ich wieder im Sub Menü. Da will ich aber auch nicht hin!
      Musst Du aber :D Von da aus gehts ja auch wieder zurück. Zur Zeit wird nur eine Temperatur gelesen wenn sie ausgewählt ist. Suboptimal für eine Steuerung ;) Vielleicht das Abfragen in die Main und die Anzeige dann per Drehencoder?
      Die Wartezeit haut nicht so richtig hin. Vorschlag:

      Source Code

      1. Wartezeit = 0
      2. do
      3. Loop Until Wartezeit = 2
      Andererseits kann die Anzeige auch von der Main aufgerufen werden. Das würde sie nicht so lange blockieren.
    • Es ist immer wieder erstaunlich wenn Forenexperten gerne einen Programmcode haben (sehen) wollen, dann jedoch nicht wirklich hilfreicheres vorschlagen.
      Es lautet meist pauschal, da könnte man einiges besser machen. Ob ein Fragesteller dazu in der Lage wäre, bleibt außen vor.
      Diese kosmetische Betrachtung, ob man in einer einzigen Sub alle Sensoren bedient, oder soviele Sub wie vorhandene Sensoren generiert und aufruft, ist ziemlich egal.
      Selbst wenn das Programm analysiert wird. Wie gesagt, nur kosmetisch, sonst nichts.

      Mega ordne das Programm bitte in sinnvolle Abschnitte. Kümmere dich zuerst mal um das wesentliche, die Sensoren. Teile diesen die nötigen Sensorwerte zu.
      Sensor-ID (wird benötigt für Sensor_match), Sensornummer und Sensortemperatur als Parameter, Variable.
      Es macht keinen Sinn, diese Sensoren im Sekunden-intervall messen zu lassen. Es genügt in dem Falle sie in Minutenintervallen zu bedienen. Es würden auch alle
      5 oder 10 Minutenintervalle genügen. Folglich bietet sich bei minütlichem Intervall ein Mittelwert für 5 oder 10 Minuten an.

      Die DS1307 Uhr könnte in jeder 58tigten Sekunde die Messung anstoßen. (Skip_rom + Start_conversion)
      In der 59igen Sekunde die Temperaturen der Sensoren messen, speichern. (Match_rom + Read_scratchpad)
      Nach der Messung liegen die Temperaturen vor. Folglich kann danach die jeweilige Sensortemperatur mit dem Zugehörigen Grenzwert (min + max) verglichen werden.
      Und dann je nach Bedürfnis der entsprechende Aktor geschaltet werden.
      Dann ein Loop zurück zum Anfang der Mess-serie. Das wäre der eine geschlossene Kreislaufmit seinen unterschiedlichen Anspruchs-Punkten.

      Die Angelegenheit mit dem Menue per Drehimpulsgeber bedarf näherer Erklärung. Wäre vorerst wohl nebensächlich.
      Vermutlich soll darüber die Uhr verändert werden und wahrscheinlich noch die Grenzwerte. Sonst fällt mit in dem Zusammenhang nichts ein.
      Die Bedienung der Aquarien sollte vorerst Vorrang vor der Menue-geschichte haben.

      Wenn die ID der Sensoren bekannt sind, dem jeweiligen Sensor Werte vorweisen. Z.B: Sensor1_ID(1) = &H28 : Sensor1_ID(2) = &Hxx : usw.
      Beispiel: (für 59igste Sekunde)
      1wreset
      1wwrite Match_rom '&H55 'wähle ROM an
      1wwrite Sensor4(1) , 8 'sensor zuweisen
      1wwrite Read_scratchpad '&HBE
      Ss4(1) = 1wread(9)
      If Ss4(9) = Crc8(ss4(1) , 8) Then 'checksumme testen
      If Err = 0 Then 'kein Fehler
      T = Makeint(ss4(1) , Ss4(2))
      ss4_temp = T * 0.0625 'ss4_temp kann später mit den zugehörigen Grenzwerten verglichen und je nachdem den zugehörigen Aktor bedienen.
      end if
      end if

      Wurden den Sensoren entsprechende Variablen zugewiesen, funktioniert es. Es könnte zur besseren Lesbarkeit solcher Codes entsprechende Alias zugewiesen und verwendet werden.
      Lässt sich auch per Kommentare an den Plätzen regulieren, verständlich machen. Wie gesagt Kosmetik.

      Schaue dir noch in der Hilfe das Thema Label an. Bringe Label an die Stellen wo es Sinn macht. Labels können angesprungen werden. Folglich kann die Programmgestaltung verbessert werden, und eventuell Labels in der richtigen Programm-Reihenfolge bedient werden.
      Ist das Programm entsprechend gestaltet und ausgedruckt, lässt sich leichter verfolgen von wo nach wo welche Programmteile bedient werden. Evtl mit farbigen Strichen einzeichnen, zwecks Kontrolle.
    • Hallo zusammen,

      sehr, sehr viele Informationen sind von Euch eingegangen, für die ich mich recht herzlich bedanken möcht!!! Ich möchte aber der Reihe nach antworten:

      Mitch64

      Dein Vorschlag, das Programm nach Statemachine umzustrukturieren, hört sich sehr interessant an. Ich kannte diese Möglichkeit noch nicht, meine BASCOM-Version 2.0.7.9 gibt in der Hilfe dazu auch nichts her. Ich habe mir Deinen Lexikon- Beitrag zu diesem Thema mehrfach durchgelesen. Dieses Thma steht morgen für mich erneut wieder an. Für einen Hobbyprogrammierer ist dieses Thema erst einmal schwer verdaulich, aber höchst interessant. Um da durchzusteigen benötige ich wohl noch einige Zeit. Du hast die hohe Belegung des Flasbspeichers von 70% richtigerweise angesprochen. Aus diesem Grund hatte ich auch noch nicht das DS 1307 Modul eingebunden, da ich noch nicht den hierzu benötigten Speicherplatz abschätzen kann, Hobbyprogrammierer halt. Ich werde mich nun ersteinmal mit dieser Thematik auseinander und würde mich sehr freuen, wenn ich bei auftretenden Fragen, Dich nochmals explizit ansprechen dürfte.

      Mitch64 wrote:

      Wo willst du denn hinspringen?
      Zu einer anderen Programmstelle. Aus der Variaben "Wert 99", die in Schleife läuft, in"Zusatzbeleuchtung" oder in einer manuell angezeigten Beckentemperatur, beispielsweise "Wert90".

      Mitch64 wrote:

      Weiterhin ist mir aufgefallen, dass er Konstanten für die Kommandos der Dallas-Temperatur-Sensoren definiert hat.
      Vorbildlich!

      Leider hat er das nicht im Code verwendet.
      Da nützt die Definition dann auch nichts.
      Damit möchte ich mich erst beschäftigen, wenn ich alle 11 Sensoren an einem Kabel angeschlossen habe. Es ist einfach ei Platzproblem, derzeit. Monentan ist nur ein einziger Sensor am 1wire Anschluss plaziert.

      Mitch64 wrote:

      Weiterhin sind viele Codeabschnitte fast Identisch.
      Das könnte man in Sub-Routinen packen und mit Parametern aufrufen.
      Ja, aber es sind Codeabschnitte mit unterschiedlichen Aufgaben vorhanden, aber ich sehe derzeit keine Möglichkeit der Zusammenfassung. Die LCD -Anzeigen sind unterschiedich, die Abrufe der Sensoren werden künftig unterschiedlich sein, die Abfragen der Min- Max -Werte werden künftig auch unterschiedlich sein. Was meinst Du konkret, was zusammenfassbar wäre.
      Ich sehe es derzeit noch nicht

      Mitch64 wrote:

      Den Fehler hatte ich gestern schon entdeckt.
      Bei @mega ist das vermutlich nicht aufgefallen, weil er genau den (oder was kompatibles) im Setting schon voreingestellt hat.
      Welcher Fehler??

      Mitch64 wrote:

      An der Stelle noch eine Frage an @mega:
      Verflixt, jetzt kann ich wieder kein Zitat einfügen!!!
      ??

      Mitch64 wrote:

      Das soll jetzt nur konstruktive Kritik sein, damit du künftig im eigenen Code nicht den Überblick verlierst.
      Ja, da hast Du Recht, werde ich ändern

      Mitch64 wrote:

      Übrigens, warum du nicht wieder zurück kommst liegt daran, dass du im Menü mit Goto in eine weitere Routine springst.
      Und dort steht am Ende ein Goto zum Anfang der Routine. So kann der natürlich nicht raus kommen.
      Wenn ich Gosub - Return verwende, gelange ich wieder ins menü und dann läuft die autom. Anzeige, Wert 99, nicht mehr als Schleife und die manuelle Anzeige blockt.

      Mitch64 wrote:

      Fatal error: An error occured. Sorry.


      Information:
      ID: f2c78a446b336b950f856d2959b42c706f507708
      Bitte teilen Sie dem Betreiber die oben stehende ID mit.
      Die Fehlermeldung kann mit dieser ID über „ACP » Protokoll » Fehler“ eingesehen werden.
      Das sind für mich leider bömische Dörfer. Wie soll ich damit umgehen?

      Pluto25 wrote:

      Da fehlt ein '=' ($regfile = "m32Adef.dat")
      Hallo Pluto25, ich freue mich darüber, dass Du mir auch hilfst! Du hast recht, da felhte ein Gleichheitszeichen! Adlerauge ;) Schon korrigiert .Besten Dank!!!

      Pluto25 wrote:

      Musst Du aber Von da aus gehts ja auch wieder zurück.
      Habe ich nicht erlebt. Bei mir ging es nicht weiter. Aber: Ich habe in letzter Zeit so viele Möglichkeiten durchgespielt - ich teste es nochmals mit GOSUB.

      Pluto25 wrote:

      Suboptimal für eine Steuerung Vielleicht das Abfragen in die Main und die Anzeige dann per Drehencoder?
      Die Wartezeit haut nicht so richtig hin. Vorschlag:
      Teste ich mal. Guter Tipp!




      Est nun fast 2.00 Uhr , müde und ich gehe jetzt mal schlafen. Morgen melde ich mich wieder
    • Hallo zusammen,

      sehr, sehr viele Informationen sind von Euch eingegangen, für die ich mich recht herzlich bedanken möcht!!! Ich möchte aber der Reihe nach antworten:

      Mitch64

      Dein Vorschlag, das Programm nach Statemachine umzustrukturieren, hört sich sehr interessant an. Ich kannte diese Möglichkeit noch nicht, meine BASCOM-Version 2.0.7.9 gibt in der Hilfe dazu auch nichts her. Ich habe mir Deinen Lexikon- Beitrag zu diesem Thema mehrfach durchgelesen. Dieses Thma steht morgen für mich erneut wieder an. Für einen Hobbyprogrammierer ist dieses Thema erst einmal schwer verdaulich, aber höchst interessant. Um da durchzusteigen benötige ich wohl noch einige Zeit. Du hast die hohe Belegung des Flasbspeichers von 70% richtigerweise angesprochen. Aus diesem Grund hatte ich auch noch nicht das DS 1307 Modul eingebunden, da ich noch nicht den hierzu benötigten Speicherplatz abschätzen kann, Hobbyprogrammierer halt. Ich werde mich nun ersteinmal mit dieser Thematik auseinander und würde mich sehr freuen, wenn ich bei auftretenden Fragen, Dich nochmals explizit ansprechen dürfte.

      Mitch64 wrote:

      Wo willst du denn hinspringen?
      Zu einer anderen Programmstelle. Aus der Variaben "Wert 99", die in Schleife läuft, in"Zusatzbeleuchtung" oder in einer manuell angezeigten Beckentemperatur, beispielsweise "Wert90".

      Mitch64 wrote:

      Weiterhin ist mir aufgefallen, dass er Konstanten für die Kommandos der Dallas-Temperatur-Sensoren definiert hat.
      Vorbildlich!

      Leider hat er das nicht im Code verwendet.
      Da nützt die Definition dann auch nichts.
      Damit möchte ich mich erst beschäftigen, wenn ich alle 11 Sensoren an einem Kabel angeschlossen habe. Es ist einfach ei Platzproblem, derzeit. Monentan ist nur ein einziger Sensor am 1wire Anschluss plaziert.

      Mitch64 wrote:

      Weiterhin sind viele Codeabschnitte fast Identisch.
      Das könnte man in Sub-Routinen packen und mit Parametern aufrufen.
      Ja, aber es sind Codeabschnitte mit unterschiedlichen Aufgaben vorhanden, aber ich sehe derzeit keine Möglichkeit der Zusammenfassung. Die LCD -Anzeigen sind unterschiedich, die Abrufe der Sensoren werden künftig unterschiedlich sein, die Abfragen der Min- Max -Werte werden künftig auch unterschiedlich sein. Was meinst Du konkret, was zusammenfassbar wäre.
      Ich sehe es derzeit noch nicht

      Mitch64 wrote:

      Den Fehler hatte ich gestern schon entdeckt.
      Bei @mega ist das vermutlich nicht aufgefallen, weil er genau den (oder was kompatibles) im Setting schon voreingestellt hat.
      Welcher Fehler??

      Mitch64 wrote:

      An der Stelle noch eine Frage an @mega:
      Verflixt, jetzt kann ich wieder kein Zitat einfügen!!!
      ??

      Mitch64 wrote:

      Das soll jetzt nur konstruktive Kritik sein, damit du künftig im eigenen Code nicht den Überblick verlierst.
      Ja, da hast Du Recht, werde ich ändern

      Mitch64 wrote:

      Übrigens, warum du nicht wieder zurück kommst liegt daran, dass du im Menü mit Goto in eine weitere Routine springst.
      Und dort steht am Ende ein Goto zum Anfang der Routine. So kann der natürlich nicht raus kommen.
      Wenn ich Gosub - Return verwende, gelange ich wieder ins menü und dann läuft die autom. Anzeige, Wert 99, nicht mehr als Schleife und die manuelle Anzeige blockt.

      Mitch64 wrote:

      Fatal error: An error occured. Sorry.


      Information:
      ID: f2c78a446b336b950f856d2959b42c706f507708
      Bitte teilen Sie dem Betreiber die oben stehende ID mit.
      Die Fehlermeldung kann mit dieser ID über „ACP » Protokoll » Fehler“ eingesehen werden.
      Das sind für mich leider bömische Dörfer. Wie soll ich damit umgehen?

      Pluto25 wrote:

      Da fehlt ein '=' ($regfile = "m32Adef.dat")
      Hallo Pluto25, ich freue mich darüber, dass Du mir auch hilfst! Du hast recht, da felhte ein Gleichheitszeichen! Adlerauge ;) Schon korrigiert .Besten Dank!!!

      Pluto25 wrote:

      Musst Du aber Von da aus gehts ja auch wieder zurück.
      Habe ich nicht erlebt. Bei mir ging es nicht weiter. Aber: Ich habe in letzter Zeit so viele Möglichkeiten durchgespielt - ich teste es nochmals mit GOSUB.

      Pluto25 wrote:

      Suboptimal für eine Steuerung Vielleicht das Abfragen in die Main und die Anzeige dann per Drehencoder?
      Die Wartezeit haut nicht so richtig hin. Vorschlag:
      Teste ich mal. Guter Tipp!




      Est nun fast 2.00 Uhr , müde und ich gehe jetzt mal schlafen. Morgen melde ich mich wieder
    • mega wrote:

      Ich werde mich nun ersteinmal mit dieser Thematik auseinander und würde mich sehr freuen, wenn ich bei auftretenden Fragen, Dich nochmals explizit ansprechen dürfte.
      Gerne.

      mega wrote:

      Damit möchte ich mich erst beschäftigen, wenn ich alle 11 Sensoren an einem Kabel angeschlossen habe. Es ist einfach ei Platzproblem, derzeit. Monentan ist nur ein einziger Sensor am 1wire Anschluss plaziert.
      Die Konstanten anstelle der Hex-Werte zu verwenden als Kommandos für die DS18B20 ist ja kein Akt.
      Einfach z.B. anstelle von 1WWrite &hcc -> 1WWrite SKIP_ROM schreiben, Natürlich für die anderen Befehle auch. Das ist schon alles.
      Und das Programm wird gleich lesbarer.

      mega wrote:

      Ja, aber es sind Codeabschnitte mit unterschiedlichen Aufgaben vorhanden, aber ich sehe derzeit keine Möglichkeit der Zusammenfassung. Die LCD -Anzeigen sind unterschiedich, die Abrufe der Sensoren werden künftig unterschiedlich sein, die Abfragen der Min- Max -Werte werden künftig auch unterschiedlich sein. Was meinst Du konkret, was zusammenfassbar wäre.
      Die Anzeigen sind unterschiedlich, wenn ich mit z.B. im Abschnitt "Menü:" die einzelnen Punke zw. 88 und 98 anschaue.
      Aber es unterscheidet sich nur der Test und der Temperatur-Kanal.

      Man kännte eine Sub schreiben, der man genau nur das mit gibt. Den Text und die Temperatur. so meinte ich das.
      Aber wenn es dann in Statemachine ungebaut wird, ist das vielleicht auch hinfällig.

      mega wrote:

      Wenn ich Gosub - Return verwende, gelange ich wieder ins menü und dann läuft die autom. Anzeige, Wert 99, nicht mehr als Schleife und die manuelle Anzeige blockt.
      Das Problem erledigt sich, wenn man dein Programm in "Zuständen" denkt. Zustände für die Statemachine, daher auch der Name.
      Denn in dem jeweiligen Zustand, hier deine Anzeige 99, wird bestimmt, durch welches Ereignis in welchen neuen Zustand gesprungen wird. Die neuen Zustände können andere Anzeigen wie 72, das Bearbeiten oder sonst was sein. Die Ereignisse, die den Wechsel zu einem anderen Zustand herbeiführen, können z.B. Tasten oder Timeouts u.v.m. sein.

      Und:
      Das Problem mit dem Zitat einfügen und der Fatal Error, waren Hinweise für die Admins. Das hat nichts mit deinem Code oder Programm zu tun.
    • Hallo bitlogger,
      leider konnte ich die Beantwortung Deines gestrigen Beitrags wegen meiner Müdigkeit nicht mehr vornehmen, was ich heute gerne nachhole. Auch bei Dir möchte ich mich für Deine Hilfe herzlichst bedanken!

      bitlogger wrote:

      Es macht keinen Sinn, diese Sensoren im Sekunden-intervall messen zu lassen. Es genügt in dem Falle sie in Minutenintervallen zu bedienen. Es würden auch alle
      5 oder 10 Minutenintervalle genügen. Folglich bietet sich bei minütlichem Intervall ein Mittelwert für 5 oder 10 Minuten an.
      In dem Programmteil "Automatische Anzeige hatte ich das auch so ausgeführt: Eine Messung aller Sensoren und danach werden sie der Reihe nach angezeigt. In der Sub "Manuelle Anzeige" bin ich bewusst davon abgewichen, da ich die Temperaturen der einzelnen Becken gerade bei Wasserwechsel zur Temperaturkontrolle nutzen möchte. Fische können selber keine eigene Körperwärme erzeugen. Ich habe 10 x 10 lLiter und 12 x 25 L Becken. Wenn man dann über eine Einhebel Mischbatterie ca. 50° warmes Wasser mit kaltem Leitungswasser mischt, kann es sehr schnell unangenehm für die Fische werden., Bisher hatte ich das zugegebene Wasser mit einem Aquarienthermometer gemessen. Diese Dinger sind sehr ungenau. Da hätte ich auch genau so gut meinen Finger ins Aquarium halten können.

      bitlogger wrote:

      Die Angelegenheit mit dem Menue per Drehimpulsgeber bedarf näherer Erklärung. Wäre vorerst wohl nebensächlich.
      Vermutlich soll darüber die Uhr verändert werden und wahrscheinlich noch die Grenzwerte. Sonst fällt mit in dem Zusammenhang nichts ein.
      Du hast vollkommen recht! Mit dem Drehencoder möchte ich die Ein- bzw. Ausschalttemperaturen verändern und, wenn noch Platz im Flashspeicher vorhanden ist, eine Uhr über das DS1307 realisieren und die Uhrzeit ggf. korrigieren. Aber das ist noch absolutes Neuland für mich. Mit TWI habe ich noch nie gespielt.

      bitlogger wrote:

      Es ist immer wieder erstaunlich wenn Forenexperten gerne einen Programmcode haben (sehen) wollen, dann jedoch nicht wirklich hilfreicheres vorschlagen.
      Es lautet meist pauschal, da könnte man einiges besser machen. Ob ein Fragesteller dazu in der Lage wäre, bleibt außen vor.
      Diese kosmetische Betrachtung, ob man in einer einzigen Sub alle Sensoren bedient, oder soviele Sub wie vorhandene Sensoren generiert und aufruft, ist ziemlich egal.
      Selbst wenn das Programm analysiert wird. Wie gesagt, nur kosmetisch, sonst nichts.

      Mega ordne das Programm bitte in sinnvolle Abschnitte. Kümmere dich zuerst mal um das wesentliche, die Sensoren. Teile diesen die nötigen Sensorwerte zu.
      Sensor-ID (wird benötigt für Sensor_match), Sensornummer und Sensortemperatur als Parameter, Variable.
      Es macht keinen Sinn, diese Sensoren im Sekunden-intervall messen zu lassen. Es genügt in dem Falle sie in Minutenintervallen zu bedienen. Es würden auch alle
      5 oder 10 Minutenintervalle genügen. Folglich bietet sich bei minütlichem Intervall ein Mittelwert für 5 oder 10 Minuten an.

      Die DS1307 Uhr könnte in jeder 58tigten Sekunde die Messung anstoßen. (Skip_rom + Start_conversion)
      In der 59igen Sekunde die Temperaturen der Sensoren messen, speichern. (Match_rom + Read_scratchpad)
      Nach der Messung liegen die Temperaturen vor. Folglich kann danach die jeweilige Sensortemperatur mit dem Zugehörigen Grenzwert (min + max) verglichen werden.
      Und dann je nach Bedürfnis der entsprechende Aktor geschaltet werden.
      Dann ein Loop zurück zum Anfang der Mess-serie. Das wäre der eine geschlossene Kreislaufmit seinen unterschiedlichen Anspruchs-Punkten.

      Die Angelegenheit mit dem Menue per Drehimpulsgeber bedarf näherer Erklärung. Wäre vorerst wohl nebensächlich.
      Vermutlich soll darüber die Uhr verändert werden und wahrscheinlich noch die Grenzwerte. Sonst fällt mit in dem Zusammenhang nichts ein.
      Die Bedienung der Aquarien sollte vorerst Vorrang vor der Menue-geschichte haben.

      Wenn die ID der Sensoren bekannt sind, dem jeweiligen Sensor Werte vorweisen. Z.B: Sensor1_ID(1) = &H28 : Sensor1_ID(2) = &Hxx : usw.
      Beispiel: (für 59igste Sekunde)
      1wreset
      1wwrite Match_rom '&H55 'wähle ROM an
      1wwrite Sensor4(1) , 8 'sensor zuweisen
      1wwrite Read_scratchpad '&HBE
      Ss4(1) = 1wread(9)
      If Ss4(9) = Crc8(ss4(1) , 8) Then 'checksumme testen
      If Err = 0 Then 'kein Fehler
      T = Makeint(ss4(1) , Ss4(2))
      ss4_temp = T * 0.0625 'ss4_temp kann später mit den zugehörigen Grenzwerten verglichen und je nachdem den zugehörigen Aktor bedienen.
      end if
      end if

      Wurden den Sensoren entsprechende Variablen zugewiesen, funktioniert es. Es könnte zur besseren Lesbarkeit solcher Codes entsprechende Alias zugewiesen und verwendet werden.
      Lässt sich auch per Kommentare an den Plätzen regulieren, verständlich machen. Wie gesagt Kosmetik.

      Schaue dir noch in der Hilfe das Thema Label an. Bringe Label an die Stellen wo es Sinn macht. Labels können angesprungen werden. Folglich kann die Programmgestaltung verbessert werden, und eventuell Labels in der richtigen Programm-Reihenfolge bedient werden.
      Ist das Programm entsprechend gestaltet und ausgedruckt, lässt sich leichter verfolgen von wo nach wo welche Programmteile bedient werden. Evtl mit farbigen Strichen einzeichnen, zwecks Kontrolle.


      bitlogger wrote:

      Schaue dir noch in der Hilfe das Thema Label an.
      Schaue ich mir an!
    • Hallo bitlogger,
      leider konnte ich die Beantwortung Deines gestrigen Beitrags wegen meiner Müdigkeit nicht mehr vornehmen, was ich heute gerne nachhole. Auch bei Dir möchte ich mich für Deine Hilfe herzlichst bedanken!

      bitlogger wrote:

      Es macht keinen Sinn, diese Sensoren im Sekunden-intervall messen zu lassen. Es genügt in dem Falle sie in Minutenintervallen zu bedienen. Es würden auch alle
      5 oder 10 Minutenintervalle genügen. Folglich bietet sich bei minütlichem Intervall ein Mittelwert für 5 oder 10 Minuten an.
      In dem Programmteil "Automatische Anzeige hatte ich das auch so ausgeführt: Eine Messung aller Sensoren und danach werden sie der Reihe nach angezeigt. In der Sub "Manuelle Anzeige" bin ich bewusst davon abgewichen, da ich die Temperaturen der einzelnen Becken gerade bei Wasserwechsel zur Temperaturkontrolle nutzen möchte. Fische können selber keine eigene Körperwärme erzeugen. Ich habe 10 x 10 lLiter und 12 x 25 L Becken. Wenn man dann über eine Einhebel Mischbatterie ca. 50° warmes Wasser mit kaltem Leitungswasser mischt, kann es sehr schnell unangenehm für die Fische werden., Bisher hatte ich das zugegebene Wasser mit einem Aquarienthermometer gemessen. Diese Dinger sind sehr ungenau. Da hätte ich auch genau so gut meinen Finger ins Aquarium halten können.

      bitlogger wrote:

      Die Angelegenheit mit dem Menue per Drehimpulsgeber bedarf näherer Erklärung. Wäre vorerst wohl nebensächlich.
      Vermutlich soll darüber die Uhr verändert werden und wahrscheinlich noch die Grenzwerte. Sonst fällt mit in dem Zusammenhang nichts ein.
      Du hast vollkommen recht! Mit dem Drehencoder möchte ich die Ein- bzw. Ausschalttemperaturen verändern und, wenn noch Platz im Flashspeicher vorhanden ist, eine Uhr über das DS1307 realisieren und die Uhrzeit ggf. korrigieren. Aber das ist noch absolutes Neuland für mich. Mit TWI habe ich noch nie gespielt.

      bitlogger wrote:

      Es ist immer wieder erstaunlich wenn Forenexperten gerne einen Programmcode haben (sehen) wollen, dann jedoch nicht wirklich hilfreicheres vorschlagen.
      Es lautet meist pauschal, da könnte man einiges besser machen. Ob ein Fragesteller dazu in der Lage wäre, bleibt außen vor.
      Diese kosmetische Betrachtung, ob man in einer einzigen Sub alle Sensoren bedient, oder soviele Sub wie vorhandene Sensoren generiert und aufruft, ist ziemlich egal.
      Selbst wenn das Programm analysiert wird. Wie gesagt, nur kosmetisch, sonst nichts.

      Mega ordne das Programm bitte in sinnvolle Abschnitte. Kümmere dich zuerst mal um das wesentliche, die Sensoren. Teile diesen die nötigen Sensorwerte zu.
      Sensor-ID (wird benötigt für Sensor_match), Sensornummer und Sensortemperatur als Parameter, Variable.
      Es macht keinen Sinn, diese Sensoren im Sekunden-intervall messen zu lassen. Es genügt in dem Falle sie in Minutenintervallen zu bedienen. Es würden auch alle
      5 oder 10 Minutenintervalle genügen. Folglich bietet sich bei minütlichem Intervall ein Mittelwert für 5 oder 10 Minuten an.

      Die DS1307 Uhr könnte in jeder 58tigten Sekunde die Messung anstoßen. (Skip_rom + Start_conversion)
      In der 59igen Sekunde die Temperaturen der Sensoren messen, speichern. (Match_rom + Read_scratchpad)
      Nach der Messung liegen die Temperaturen vor. Folglich kann danach die jeweilige Sensortemperatur mit dem Zugehörigen Grenzwert (min + max) verglichen werden.
      Und dann je nach Bedürfnis der entsprechende Aktor geschaltet werden.
      Dann ein Loop zurück zum Anfang der Mess-serie. Das wäre der eine geschlossene Kreislaufmit seinen unterschiedlichen Anspruchs-Punkten.

      Die Angelegenheit mit dem Menue per Drehimpulsgeber bedarf näherer Erklärung. Wäre vorerst wohl nebensächlich.
      Vermutlich soll darüber die Uhr verändert werden und wahrscheinlich noch die Grenzwerte. Sonst fällt mit in dem Zusammenhang nichts ein.
      Die Bedienung der Aquarien sollte vorerst Vorrang vor der Menue-geschichte haben.

      Wenn die ID der Sensoren bekannt sind, dem jeweiligen Sensor Werte vorweisen. Z.B: Sensor1_ID(1) = &H28 : Sensor1_ID(2) = &Hxx : usw.
      Beispiel: (für 59igste Sekunde)
      1wreset
      1wwrite Match_rom '&H55 'wähle ROM an
      1wwrite Sensor4(1) , 8 'sensor zuweisen
      1wwrite Read_scratchpad '&HBE
      Ss4(1) = 1wread(9)
      If Ss4(9) = Crc8(ss4(1) , 8) Then 'checksumme testen
      If Err = 0 Then 'kein Fehler
      T = Makeint(ss4(1) , Ss4(2))
      ss4_temp = T * 0.0625 'ss4_temp kann später mit den zugehörigen Grenzwerten verglichen und je nachdem den zugehörigen Aktor bedienen.
      end if
      end if

      Wurden den Sensoren entsprechende Variablen zugewiesen, funktioniert es. Es könnte zur besseren Lesbarkeit solcher Codes entsprechende Alias zugewiesen und verwendet werden.
      Lässt sich auch per Kommentare an den Plätzen regulieren, verständlich machen. Wie gesagt Kosmetik.

      Schaue dir noch in der Hilfe das Thema Label an. Bringe Label an die Stellen wo es Sinn macht. Labels können angesprungen werden. Folglich kann die Programmgestaltung verbessert werden, und eventuell Labels in der richtigen Programm-Reihenfolge bedient werden.
      Ist das Programm entsprechend gestaltet und ausgedruckt, lässt sich leichter verfolgen von wo nach wo welche Programmteile bedient werden. Evtl mit farbigen Strichen einzeichnen, zwecks Kontrolle.


      bitlogger wrote:

      Schaue dir noch in der Hilfe das Thema Label an.
      Schaue ich mir an!
    • Irgendetwas scheine ich beim Absenden falsch zu machen: Ich sende meine Antworten mit dem Sendebutton ab und erhalte eine Fehlermeldung, ich möge es zu einem späteren Zeitpunkt noch einmal versuchen. Daran habe ich mich gehalten und ein zweites Mal versucht und mein Beitrag wurde gespeichert. Nun steht er aber zweimal drin. Auch das Zitieren von Textpassagen bereitet mir Probleme. Markiere ich die zu zitierende Textstelle und klicke dann auf zitieren, ist der bishher geschriebene Text futsch. Was mache ich falsch? Kann man den geschriebenen Text nicht zwischenspeichern?
    • mega wrote:

      Antworten mit dem Sendebutton ab und erhalte eine Fehlermeldung
      Das ist ein hardneckiger Fehler in der Forensoftware. In fast allen Fällen wurde der Beitrag trotz Fehlermeldung übernommen. Ein neues Browserfenster würde zeigen ob er übernommen wurde.

      mega wrote:

      ist der bisher geschriebene Text futsch
      Das hatte ich noch nicht allerdings wird das Zitat an der Stelle des Cursors gesetzt. Das kann für Chaos sorgen. Die Forensoftware selber speichert den Text (irgendwann irgendwie :D ) Manchmal hilfreich wenn nicht auf Absenden geklickt wurde.

      Das mit den Labels ist auch kosmetisch. Du hattest zwei drin (Encoder_a/b) die ich zum simulieren entfernt habe. Mir sind reale Pins lieber.

      Das mit dem Finger beibehalten, die DS18 haben eine erschreckende Verzögerung (im Sekundenbereich).

      Für die DS1307 gibts hier im Forum mehrere Anwendungen. Meine war so schlecht das ich auf Dcf77 umgestiegen bin/keinen verwendeten Code dafür habe.

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

    • Hier ein Auszug von machwat's Lösung. Durch die Verwendung der Bascom Clock Routinen wird die Ds im Hintergrund bedient, so das man im Programm selber nicht darauf zugreifen braucht.

      Source Code

      1. Const Ds1307w = &HD0 'Address Des Ds1307 $d0 = Schreiben
      2. Const Ds1307r = &HD1 '$d1 = Lesen
      3. Config Clock = User
      4. Config Date = Dmy , Separator = .
      5. Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1 für Uhrzeit
      6. On Timer1 Sek_takt 'Verzweige bei Timer1 überlauf zu Sek_Isr (nach jeweils 1 Sek.)
      7. Timer1 = 3035 'Timer1 soll schon von 3035 wegzählen
      8. Enable Timer1 'Timer zählt hoch von Startwert auf 65.535 = 62.500 Counts, daraus folgt Timerfrequenz von 1 Sekunde
      9. Enable Interrupts
      10. Getdatetime: 'Wird von Bascom intern aufgerufen bei Zeitanfagen
      11. Disable Interrupts
      12. Dim Wd As Byte
      13. I2cstart ' Start
      14. I2cwbyte Ds1307w ' DS1307 schreiben
      15. I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
      16. I2cstart ' Start
      17. I2cwbyte Ds1307r ' DS1307 lesen (ab vorher eingestellter Adresse 0)
      18. I2crbyte _sec , Ack ' Sekunden
      19. I2crbyte _min , Ack ' Minuten
      20. I2crbyte _hour , Ack ' Stunden
      21. I2crbyte Wd , Ack ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
      22. I2crbyte _day , Ack ' Tag
      23. I2crbyte _month , Ack ' Monat
      24. I2crbyte _year , Nack ' Jahr
      25. I2cstop
      26. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      27. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      28. Myweekday = Makedec(wd)
      29. Enable Interrupts
      30. Return
      31. Setdate: 'Wird von Bascom intern aufgerufen beim Datum setzen
      32. Disable Interrupts
      33. Dim Weekday As Byte
      34. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      35. Weekday = Makebcd(myweekday)
      36. I2cstart ' Start
      37. I2cwbyte Ds1307w ' DS1307 schreiben
      38. I2cwbyte 3 ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
      39. I2cwbyte Weekday
      40. I2cwbyte _day ' Tag schreiben
      41. I2cwbyte _month ' Monat schreiben
      42. I2cwbyte _year ' Jahr schreiben
      43. I2cstop
      44. Enable Interrupts
      45. Return
      46. Settime: 'Wird von Bascom intern aufgerufen beim Zeit setzen
      47. Disable Interrupts
      48. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      49. I2cstart ' Start
      50. I2cwbyte Ds1307w ' DS1307 schreiben
      51. I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
      52. I2cwbyte _sec ' Sekunden schreiben
      53. I2cwbyte _min ' Minuten schreiben
      54. I2cwbyte _hour ' Stunden schreiben
      55. I2cstop
      56. Enable Interrupts
      57. Return
      Display All

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

    • Hallo zusammen,

      ich möchte zuerst einmal testen, ob dieses Programm überhaupt zum Laufen gebracht werden kann, bevor ich Kosmetik in dem Quelltext vornehmen werde. Wenn nicht ,werde ich mich mal in die "Mitch64 - statemachine" vertiefen, denn mich interessieren beide Varianten ungemein.

      @ R2D2 Bastler

      Besten Dank für Deinen Tipp, den ich sehr gerne übernehmen werde.



      @Pluto25

      Besten Dank für den Quelltext zum DS1307. Ich hatte mir den Quelltext aus dem Buch von Stefan Hoffmann entliehen, hatte in aber teilweise wieder entfernt, da ich nicht abschätzen kann, wie viel Speicherplatz mir für das Funktionieren des Programms noch übrig bleiben würde. Besten Dank dafür!!

      Nun habe ich mal meinen Quelltextentwurf dahingehend mehrfach geändert, dass ich die "Goto" Geschichte in "Gosub - Return"
      geändert habe, und.....nichts wurde dadurch besser. Wenn das Programm, beispielsweise nach dem Hochfahren, in der Main aufschlägt und "Wert 99" anzeigt und ich den Taster des Encoder betätige, läuft das Programm an, läuft auch bis zum Ende der automatischen Anzeige durch, springt dann aber wieder in die Main und bleibt dort stecken, anstatt in die Sub "Menue" zum Ausgang des Gosub-Befehls im "Menue" unter Wert 99, Gosub zu springen. Ich verstehe es einfach nicht, warum ein "Gosub" im Sub "Menue" das Progamm ins "Main" führt, anstatt zum Ursrung des "Gosub-Befehls". Fragen über Fragen.

      Nochmals besten Dank für Eure tolle Hilfe!!!!!!!
      Files
    • Das neu präsentierte Programm hat wieder 17 Fehler und ist wieder sehr unstrukturiert und teilweise nicht gut bedacht. Aus diesem Wuselcode eine Statemachine basteln zu wollen dürfte eine Maratonaufgabe werden. Die Uhr und der Drehencoder wurde vom angesprochen Buch übernommen. Okay, nur erkläre mal, wie oft würden Becken Min und Max temperaturen geändert, wie oft täglich oder sonst würde das Display per Encoder bedient?
      Lasse doch zuerst mal jeden Schnickschnack weg, sorge zuerst mal dafür dass die Temperaturen gemessen und die Heizungen bedient werden.
      Wenn das funktioniert kannst du Schnickschnack bedienen. Ebenso, sorge zuerst mal für die Hauptsache, wenn das funktioniert und das per Statemachine erledigt werden sollte, hättest du eine Vergleichsbasis.

      Übrigens meine DS1307 Uhr läuft seit Jahren ohne nennenswerte Abweichung. Drehencoder habe ich, jedoch nicht verbaut. Temperaturwerte werden zyklisch auf dem Display für jeweils 3 Sekunden angezeigt. Wie angesprochen, klammere vorerst alles unwichtige aus, sorge erst mal für die Hauptaufgabe, Temperaturmessung und Steuerung.
      Übrigens, der Methode die Sensoren per sensorfirst und Nextsuche zu vertrauen, ohne Garantie das dies zuverlässig funktioniert? Eindeutiger und vor allem sicherer ist die direkte Zuweisung der Sensor-ID.
    • Woher weißt Du, dass Du "in der Main" hängen bleibst?
      Ich hab versucht, mich in Deinen Code einzuarbeiten, er ist aber für mich zu unübersichtlich (gut, dass muss jetzt nichts heißen) und hat zu viele unlogische Konstrukte (oder ich seh den Sinn dahinter nur nicht).


      Zum Beispiel in Deinem "Case 99" (Zeile 813):

      BASCOM Source Code

      1. Case 99
      2. If Pinb.2 = 0 Then
      3. Incr A
      4. End If
      5. If Wert = 99 And A = 1 Then
      6. Locate 1 , 1
      7. Lcd "Auto-Anzeige"
      8. Wait 1
      9. Gosub Auto_anzeige
      10. End If
      11. A = 0
      12. Cls
      Display All

      - Variable A wird erhöht, wenn PINB.2 low ist (PINB.2 wird hier wohl low sein, denn das ist die Bedingung, um überhaut beim Label "Menue:" zu landen)
      - Dann prüfst Du auf "If Wert = 99 ..." (das wird hier IMMER der Fall sein, da Du Dich innerhalb einer Select-Case-Abfrage befindest und "Case 99" ein "Wert = 99" voraussetzt)
      - Dann prüfst Du auf "... A = 1" (das wird immer der Fall sein, wenn PINB.2 low ist)


      Diese If-Abfragen ergeben für mich keinen Sinn und könnten (hier im Beispiel für Case 99) weggelassen bzw gekürtzt werden, z.B.

      BASCOM Source Code

      1. Case 99
      2. Locate 1 , 1
      3. Lcd "Auto-Anzeige"
      4. Wait 1
      5. Gosub Auto_anzeige
      6. Cls


      Das nächste Problem tritt auf, wenn Du die erste "Do...Loop Until" Schleife im Label "Auto_anzeige" erreichst (Zeile 1111).

      BASCOM Source Code

      1. Do
      2. Wartezeit = 0
      3. If Wartezeit = 0 Then
      4. Incr Wartezeit
      5. If Wartezeit >= 2 Then
      6. Wartezeit = 2
      7. End If
      8. End If
      9. Loop Until Wartezeit = 2
      Display All
      - Hier setzt Du immer "Wartezeit = 0"
      - Dann frägst Du ab, ob Wartezeit = 0 ist (das wird sie hier IMMER sein)
      - Nun erhöhst du Wartezeit (Wert jetzt 1)
      - Die folgende IF-Abfrage (If Wartezeit >= 2" wird NIE wahr werden)
      - Loop Until Wartezeit = 2 (wird NIE wahr werden und du kommst aus dieser Schleife nicht mehr raus)


      Nette Grüße
      Rob
    • mega wrote:

      Wenn das Programm, beispielsweise nach dem Hochfahren, in der Main aufschlägt und "Wert 99" anzeigt und ich den Taster des Encoder betätige, läuft das Programm an, läuft auch bis zum Ende der automatischen Anzeige durch, springt dann aber wieder in die Main und bleibt dort stecken, anstatt in die Sub "Menue" zum Ausgang des Gosub-Befehls im "Menue" unter Wert 99, Gosub zu springen. I
      Das ist doch soweit korrekt. Bis auf den Punkt, dass er dann hängt in der Main. Wenn er denn dort hängt.
      Aber Der Code macht zunächst genau das was programmiert ist.

      Nach Programmstart und Drücken des Decoder-Tasters wird
      von Main Debounce per Gosub (Zeile 698) zum Label Menu (Zeile 806) gesprungen
      Dort wird abgearbeitet und die Ausführung trifft auf Zeile 823 mit dem Gosub Auto_Anzeige.
      Dann geht es in Zeile 1024 weiter. Alle Kanäle werden ausgelesen und angezeigt, bis zum letzten.
      Dann steht dort in Zeile 2167 ein Return.

      Es geht also zurück ins Menü Zeile 824 mit End If.
      Danach folgt der nächste Case der Select (Case 98), der aber nicht zutrifft. somit werden alle Case-Fälle übersprungen
      und die Codeausführung wird in Zeile 1039 (End Select) noch in der Menü-Routine fortgesetzt.

      Der Rücksprung ins Menü findet also statt.

      Nach der End Select folgt jedoch ein Return (Zeile 1041), und dann gehts wieder zurück ins Hauptprogramm,
      wo in Zeile 702 der Code weiter ausgeführt wird.

      Also soweit alles korrekt!

      Wenn du es nicht glaubst, dann nutze dein Display zum Debuggen.
      Lass dir im Display die Stellen Anzeigen mit einer kleinen Pause, damit du das nachvollziehen kannst.

      Im übrigen würde ich nicht empfehlen diesen Code zeitaufwendig irgendwie zum Laufen bringen zu wollen und dann Kosmetik zu betreiben.
      Dann hast du vielleicht einen Code, der soweit funktioniert. Aber keine Struktur, die du mit den fehlenden Funktionen erweitern könntest.
      Das wird nur im Frust enden.

      Meiner Meinung nach macht es mehr Sinn, an dieser Stelle den Code neu zu schreiben, aber mit entsprechender Struktur und Konzept.
      Um Zeit zu sparen kann man ja dann brauchbare Teile vom alten Code in den neuen übernehmen.

      Aber zuerst solltest du dir über die Struktur Gedanken machen. Und vor allem, wie das Programm funktionieren soll.
      Denn das brauchst du später für die Statemachine. Ohne einen Plan wird das vermutlich nichts.

      Überlege dir, wie die Bedienung mit dem Drehencoder und den Encoder-Taster bedient werden kann. Schreibe eine Liste aller Funktionen, die du einstellen, anzeigen oder bearbeiten willst. Zumindest mal vom Prinzip her. Irgendwie musst du ja die Uhrzeit, die Temperaturen usw einstellen.

      Überlege dir, wie du die Sensoren mit einer Routine Triggern kannst und mit einer anderen geziehlt auslesen.

      Der Einwand von Bitlogger ist auch begründet.
      Du kannst nicht davon ausgehen, wenn du 11 Sensoren anschließt und dann mit FindFirst und FindNext die Sensoren ermittelst, dass die gefundene Reihenfolge den Becken entsppricht. Vielmehr musst du eine Zuordnung haben, damit du weist, welcher Sensor an welchem Becken befestigt ist.
      Oder willst du von Becken 4 Temperatur lesen und dann entsprechend das Becken 2 heizen?

      Natürlich brauchst du nicht alles bis in kleinste Detail planen, aber du brauchst eine Struktur, auf der dein Code basiert. Den erweiterst du dann Zug um Zug.

      Das Display und die LED'skönnen dein bester Freund sein, wenn du sie zu Debugging Zwecken verwendest.
      Daher sollten Taster (entprellt) und das Display schon von Anfang an im Code sein.
      Dann Routinen zum Triggern und späterem Auslesen. (Nicht 10 Routinen um 10 Sensoren zu lesen, sondern eine für Alle!)

      Becken-Temperaturen Min, Max und aktuelle Temperatur kann alles in einem einzigen Array abgelegt werden.

      Es gibt viel zu tun.
      Also keine Zeit am alten Code verschwenden!


      R2D2 Bastler wrote:

      - Die folgende IF-Abfrage (If Wartezeit >= 2" wird NIE wahr werden)
      Die Wartezeit wird in der ISR alle 2 Sekunden inkrementiert, sofern der Code in der Hauptschleife das SEK-Bit (Zeile 734) nicht permanent löscht.