Problem mit Taster

    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!

    • Problem mit Taster

      Hallo Bascom Freunde!
      Bei meiner neuen Temperaturregelung für mein Aquarium habe ich folgendes kleines Problem:
      Wenn ich z.B. den Taster zur Temperatureinstellung etwas zu kurz drücke schaltet sich zwar die Hintergrundbeleuchtung des LCD hell aber
      die Sub zur Veränderung der Wassertemperatur wird nicht bzw. mur ganz kurz angesprungen. (Wenn ich ein Video vom Display während
      des drückens der Taste mache sieht man ganz, ganz kurz die Anzeige zum Einstellen der Temperatur!
      Wenn ich die Taste lange genug drücke ist alles OK!
      Wenn die Hintergrundbeleuchtung hell gedimmt ist und die Taste gedrückt wird ist dieses Problem nicht vorhanden.
      Hat jemand eine Erklärung für dieses Verhalten?

      Hier der mein Code:
      Heizen_Kuehlen_0510.bas
    • Das geschilderte Problem kann ich jetzt nicht beheben, aber mir ist aufgefallen, dass du mit goto aus sub raus springst. Das geht nur eine Zeitlang scheinbar gut. Bei jedem sub-Aufruf wird ja die 'Absprungadresse' auf dem stack zwischengespeichert und mit einem return wieder ausgelesen, damit mit dem code nach dem sub-Aufruf weiter gemacht wird. Es ist nicht so, dass da daten geschrieben und gelöscht werden, vielmehr zeigt ein 'pointer' auf einen freien Speicherplatz, der dafür verwendet werden kann. Der Speicherplatz wird immer wieder überschrieben. Wird das return nicht ausgeführt (was den pointer zurück setzt), bleibt die gespeicherte Adresse (2 byte) im stack stehen (der pointer zeigt noch auf den nächsten freien Platz) und der füllt sich langsam aber sicher, bis er zu groß wird und andere Speicherplätze überschreibt. Dann wird's mehr oder weniger lustig.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Naja, so einfach ersetzen ist auch nix. Dann verschachtelst du die subs einfach ineinander, was auch zu einem Überlauf des stacks führt. Eine sub muss immer mit einem return beendet werden. Natürlich kann man verschachteln, das muss man aber auch wieder auflösen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ist dieses 'goto main' überhaupt nötig? Kannst du nicht nach dem Aufruf der sub einfach da weiter machen, wo sie aufgerufen wurde?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mir sind auch noch einige Dinge aufgefallen die man besser lösen könnte.
      Du hast einige Subs definiert die keine Parameter übergeben bekommen daraus kann man normale Unterroutinen machen.
      Und der Part

      BASCOM-Quellcode

      1. Const Passiv = 0 'Konstante zur Erkennung ob Taster gedrueckt
      2. Const Aktiv = 1
      ist auch nicht so sinnvoll.
      Den Zustand von Bit-Variablen kannst du mit Set Variable und Reset Variable ändern.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Jetzt bin ich vollkommen verwirrt!
      Wie sollte die Sub aussehen bzw. wie sollte ich diese RICHTIG verlassen?

      Quellcode

      1. Wassertemp_aendern:
      2. Cls
      3. Waitms 200
      4. Gosub Lcd_led_andimm
      5. Start Watchdog
      6. Tasterflag = Aktiv 'a) dass nicht gleich wieder in das Hauptprogramm gesprungen wird
      7. Do
      8. If Set_taster = 1 Then Tasterflag = Passiv 'b) dass nicht gleich wieder in das Hauptprogramm gesprungen wird
      9. If Minus_taster = 0 Then Soll_temp = Soll_temp - 0.1
      10. Delay
      11. If Soll_temp <= 22.0 Then Soll_temp = 22.0 'kleiste einstellbare Wassertemperatur
      12. If Plus_taster = 0 Then Soll_temp = Soll_temp + 0.1
      13. Delay
      14. If Soll_temp >= 28.0 Then Soll_temp = 28.0 'groeßte einstellbare Wassertemperatur
      15. Locate 1 , 1
      16. Lcd " SOLL-WASSERTEMP. "
      17. Locate 2 , 7
      18. Lcd ; Fusing(soll_temp , "#.#")
      19. Locate 2 , 12
      20. Lcd ; Chr(223) ; "C "
      21. Locate 3 , 1
      22. Lcd " "
      23. Locate 4 , 3
      24. Lcd " "
      25. Locate 4 , 8
      26. Lcd "-"
      27. Locate 4 , 12
      28. Lcd "RET"
      29. Locate 4 , 17
      30. Lcd "+"
      31. Waitms 300
      32. Reset Watchdog
      33. Gosub Autoreturn '15 Sekunden keine Taste gedrueckt - zurueck zur Standardanzeige
      34. Loop Until Tasterflag = Passiv And Set_taster = 0
      35. Delay
      36. E_soll_temp = Soll_temp 'Wert im EEPROM merken
      37. Delay
      38. Cls
      39. Goto Main
      40. Return
      Alles anzeigen




    • Jetzt bitte nicht falsch verstehen, wenn hier kritisiert wird, ich will dein Werk nicht zerreißen.
      Deine sub 'Fehler' besteht wie die sub 'Fehler_ohne_alarm' aus einer Endlosschleife, die du nur durch ein goto verlassen kannst. Nicht gut, siehe oben. Das musst du überarbeiten. Dein großer stack verschleiert eine Zeit lang diese Fehler.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Die sub wassertemp_aendern wird doch durch ein debounce aufgerufen. Wenn der Taster nicht gedrückt worden wäre, wäre auch die sub nicht angesprungen worden. Also kannst du nach der Aktion, die der Tastendruck auslösen soll, einfach da weiter machen, wo du wärest, wenn du den Taster nicht gedrückt hättest. Wenn du das jetzt nicht verstehst, musst du ein Bierchen trinken, dann hätten wir den gleichen level trinkende-smileys-200
      Also, wie ich das gerade sehe, hier einfach das goto main weg lassen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • avralfred schrieb:

      Das wird ja immer komplizierter!
      War bitte ist der Unterschied zwischen einer Subroutine und einer Unterroutine? Das ist doch nur eine andere Bezeichnung - oder?
      Sub heist doch unter!!!
      Das ist ok. Wenn du eine sub mit declare 'anmeldest', kannst du Parameter übergeben und mit lokalen Variablen arbeiten. Das geht mit den einfachen subs nicht. Aber du kannst das so machen, wie du es gemacht hast.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wenn du befürchtest, dass deine Aktion, die der Tastendruck auslösen soll, so schnell geht, dass du in der Zeit die Taste noch nicht losgelassen hast und gleich wieder ausgelöst wird, das ist bei debounce nicht so. Um die sub vom debounce anzuspringen, muss der Taster immer vorher losgelassen werden.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • avralfred schrieb:

      Danke vorest für die Anregungen.
      Werde eure Tipps in den nächsten Tagen umsetzen und mich dann wieder melden!
      Hallo,

      habe versucht den Code nachzuvollziehen.
      Ist aber durch die vielen verschachtelten Sub’s und in denen noch Goto’s enthalten sind fast unmöglich.
      Vermute hier ist Dein Problem der Anfrage. [Wassertemp_aendern:]
      Sehe aber noch mehrere.

      In dieser Schleife werden Entscheidungen getroffen und Flage gesetzt aber wo sind aktuelle Ereignisabfragen ??????
      Do

      If Set_taster = 1 Then Tasterflag = Passiv
      …….
      ……

      Gosub Autoreturn '15 Sekunden keine Taste gedrueckt - zurueck zur Standardanzeige
      Hier würde es nach Autoretutn weiter gehen.

      Loop Until Tasterflag = Passiv And Set_taster = 0
      Delay
      E_soll_temp = Soll_temp'Wert im EEPROM merken
      Delay
      Cls

      Nu würde ich auch knallhart zu Main: springen.
      Goto Main
      Return

      Hier noch ein Loop einfügen könnte schon helfen.

      Autoreturn:
      If Led_taster = 1 And Minus_taster = 1 And Set_taster = 1 And Plus_taster = 1 Then
      Delay
      Flag_x = 1
      Elseif Led_taster = 0 Or Minus_taster = 0 Or Set_taster = 0 Or Plus_taster = 0 Then
      Delay
      X = 0
      End If
      If X > 14 Then 'nach 15 Sekunden zurueck zur Hauptschleife
      Cls
      14 x “fragen” ob sich nichts geändert hat und ab zum Neustart(Main)
      Goto Main
      End If
      Return

      Kann wie gesagt völlig daneben liegen aber sei ehrlich, Code hat schon eine verwirrende Struktur. Ja die Gosubs finde ich schon okay sollten aber nach Wichtigkeit geordnet in der Hauptschleife stehen mehr nicht.
      Klar jeder hat seine eigene „Handschrift“, Vorteil ist wenn gewünscht, auch andere diese lesen könnten.

      Vorab dein Watchdog macht mich nervös.

      Mein Handschrift(nicht wörtlich nehmen):

      Hier auch alle Dim und Formatierungen usw. einstellen.

      Main:
      Hier wichtige Startparameter einstellen.

      Do
      1.Gosub Taster < abfagen
      2.Gosub Messung < Sensoren
      3.Gosub Reglung > Stellglieder
      X.Gosub .....
      Gosub Anzeige > LCD usw.
      Loop

      In jeder Gosub ein Anzeige Flag setzen und in der Gosub Anzeige (die verschiedenen Anzeigen)für Abfrage.
      If Flag = 1 „male was“ wenn 2 was anderes. Das hässlichen CLS lasse ich weck.
      Da nun die Gosubs der Reihe nach abgearbeitet werden, kann man für Problemlösung oder Erweiterungen eine deaktivieren oder eine einbinden.

      Wie hier schon erwähnt, ist eine Verschachtelung möglich und erlaubt.
      Ist aber weder schneller noch übersichtlicher. DO- LOOP-Schleifen mit entsprechender Anweisung wie mit UNTIL oder WHILE zu verlassen, löschen natürlich auch die Rücksprungadressen.
      Goto- Sprung zu Main: ist schon okay sollte aber nur da stehen wo es unter Umständen nötig ist die Hauptschleife neu zu starten.

      Bitte all dies nur als persönlichen Hinweis zu betrachten. Sind nur Erfahrungswerte und keine Belehrung.
      Mit freundlichen Grüßen
    • Danke noch einmal an ALLE a_17_af3b400f
      Habe nun - so hoffe ich - all eure Tipps und Verbesserungsvorschläge umgesetzt.
      Bin auch dahintergekommen dass meine Autoreturn-Sub an dem zu Anfang geschilderten Problem schuld war!
      Habe die Sub vorerst entfernt und das problem ist weg!!!

      Da mir aber schon passiert ist dass ich die min/max Temperaturen abgefragt habe und dann vergessen habe die RET-Taste zu drücken,
      wäre diese Funktion (Autoreturn zu main) schon toll.
      Könnte natürlich alternativ in der MM-Sub die Messung und die Regelung aufrufen. (Würde mir aber nicht so gut gefallen)
      Hat jemand dafür einen Vorschlag wie das zu verwirklichen wäre?

      Heizen_Kuehlen_0710.bas
    • Bitte, bitte nicht mit goto aus einer sub springen!! Auch nicht knallhart! Lass das goto weg bzw suche einen Weg, dass du das nicht brauchst!
      Raum für Notizen

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

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