Einer ist zu doof! BASCOM 2.0.8.2 oder Ich :-)

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

    • Einer ist zu doof! BASCOM 2.0.8.2 oder Ich :-)

      Also ich habe da ein Programm geschrieben.
      Soweit funktioniert es ja.
      ABER
      1. Warum spring das Programm zu beginn 1x in das Untermenü Taster_auf.
      obwohl ich doch keine Taste gedrückt habe?

      2. Warum wird bei "If Autolinacht = 1 And Licht > 900 And Verz = 0 And Status = 1 then" die
      Variable Status =1 nicht beachtet?

      Wo ist mein Denkfehler?

      Dankbar für jede Hilfe.

      Heinz
      Files
    • Ändere mal deinen Code von

      BASCOM Source Code

      1. Config Portb.3 = Input
      2. Tasterauf Alias Pinb.3
      3. Tasterauf = 1
      4. Config Portb.4 = Input
      5. Tasterab Alias Pinb.4
      6. Tasterab = 1
      7. Config Portd.6 = Input
      8. Fernab Alias Pind.6
      9. Fernab = 1
      10. Config Portd.5 = Input
      11. Fernauf Alias Pind.5
      12. Fernauf = 1
      13. Config Portd.4 = Input
      14. Zeitschalt Alias Pind.4
      15. Zeitschalt = 1
      Display All

      auf

      BASCOM Source Code

      1. Config Portb.3 = Input
      2. Tasterauf Alias Pinb.3
      3. Portb.3 = 1
      4. Config Portb.4 = Input
      5. Tasterab Alias Pinb.4
      6. Portb.4 = 1
      7. Config Portd.6 = Input
      8. Fernab Alias Pind.6
      9. Portd.6 = 1
      10. Config Portd.5 = Input
      11. Fernauf Alias Pind.5
      12. Portd.5 = 1
      13. Config Portd.4 = Input
      14. Zeitschalt Alias Pind.4
      15. Portd.4 = 1
      Display All
      ab. Denn so schaltest du die PullUps ein.
      In deiner Variante setzt du nur den Pinx auf 1.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • darkman100 wrote:

      1. Warum spring das Programm zu beginn 1x in das Untermenü Taster_auf.
      obwohl ich doch keine Taste gedrückt habe?
      Ich glaube nicht, dass Bascom zu doof ist :D

      Schau mal hier:

      BASCOM Source Code

      1. Config Portb.3 = Input
      2. Tasterauf Alias Pinb.3
      3. Tasterauf = 1
      Soll in Zeile 3 der PullUp für den Taster aktiviert werden?

      Du schreibst auf den PIN, du musst aber auf den PORT schreiben.
      PIN ist nur zum lesen.

      Bei den anderen Tastern ist das wohl das gleiche.
    • Hallo,

      Also Ja ich muss die Pullup Wiederstande einschalten ( Tastauf=1 oder Portb.3=1 tut das)
      Dabei ist es wurscht ob ich im Programm

      Tasterauf = 1 oder
      Portb.3 = 1


      verwende. In beiden fällen springt er beim Neustart in die SUB-Routine

      Und das soll er nicht tun...
    • Hier sehe ich auch noch Fehler

      BASCOM Source Code

      1. Taster_auf:
      2. Verz = 28800 ' ACHTUNG!!! 1/2sec. aufgrund der Timer konfiguration!!!!
      3. Autoauf:
      4. Relaiab = 1
      5. Status = 1
      6. If Relaiauf = 0 And Run > 0 Then
      7. Relaiauf = 1
      8. Run = 0
      9. Return
      10. End If
      11. If Relaiauf = 1 Then
      12. Run = Laufzeitauf
      13. Relaiauf = 0
      14. End If
      15. Return
      16. Taster_ab:
      17. Verz = 28800 ' ACHTUNG!!! 1/2sec. aufgrund der Timer konfiguration!!!!
      18. Autoab:
      19. Relaiauf = 1
      20. Status = 2
      21. If Relaiab = 0 And Run > 0 Then
      22. Relaiab = 1
      23. Run = 0
      24. Return
      25. End If
      26. If Relaiab = 1 Then
      27. Run = Laufzeitab
      28. Relaiab = 0
      29. End If
      30. Return
      Display All

      Du hast zwei mal zwei Sub-Routinen ineinander. Warum?
      Wenn du Sub-Routinen aufrufen wills geht das mit

      BASCOM Source Code

      1. Gosub Autoab
      2. 'oder
      3. Gosub Autoauf
      von jeder Position im Programm. Allerdings sollte es auch sinnvoll platziert werden.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo
      djmsc


      Das sind nur zwei Verschiedene Einspringpunkt in eine Unterroutine.
      Einmal mit Verzögerung einmal ohne.

      wo soll ich denn die Sub-Routine richtig plazieren?

      Ausserdem ist das nicht das Problem.
      Mein Problem ist das die Sub-Routine aufgerufen wird beim ersten mal nach Strom anlegen.
      Und das obwohl ich keinen Taster gedrückt habe.
    • djmsc wrote:

      Hier sehe ich auch noch Fehler
      Ungewöhnlich, aber möglich ohne Probleme. Und schneller/sparsamer als im Tasterauf dann "gosub Autoauf" zu haben.

      darkman100 wrote:

      Beim Neustart wird Taster_auf angesprungen.
      Leitungskapazität? Versuch mal waitms 200 vor dem Do

      PS nicht nur B.3 alle Taster B4, D.4-6 auch Port...=1

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

    • djmsc wrote:

      es ist nicht sauber programmiert.
      Das sehe ich genauso.

      Man könnte jetzt über Programmierstyle diskutieren, aber da hat wohl jeder andere Ansichten.

      Davon abgesehen gibt es eine Reihe an unschönen Dingen im Programm.

      z.B. wird der ADC-Wert in eine LONG-Variable eingelesen.
      Ein anderes Beispiel ist, dass die Variable 'Verz' ebenfalls als Long dimensioniert ist. Sie ist nicht Atomar und das könnte beim Interrupt probleme geben und zu falsch gesetzten Verzögerungswerten führen.

      Anstelle der ganzen UND-verknüpften Abfragen könnte man auch einfach eine Statemachine nehmen.

      Unsauberer Code führt zu Verwirrung und hat offensichtlich nicht nur den Programmierer hinters Licht geführt.
    • darkman100 wrote:

      Das sind nur zwei Verschiedene Einspringpunkt in eine Unterroutine.
      Das lässt sich bestimmt auch einfacher lösen. So ist es auf jeden Fall nicht der optimale Weg.

      Mitch64 wrote:

      Anstelle der ganzen UND-verknüpften Abfragen könnte man auch einfach eine Statemachine nehmen.
      Das ist mir auch aufgefallen und habe dabei sofort an ein Select Case gedacht :)

      darkman100 wrote:

      Beim Neustart wird Taster_auf angesprungen.
      Da gibt es nur zwei Varianten:
      Entweder der Taster löst immer aus (Kurzschluss etc.)
      oder dein Programm passt nicht.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo und danke für die Tips.

      Nachdem ich Hardware als Problem ausschließen konnte (Leitungsläng <5cm, Industrietaster ohne Kurzschluß, -weil es Funktioniert ja im Prinzip)
      Und die programmtips auch zu keiner Lösung führten (Ich weiß ich bin ein schlechter Programmierer aber das Programm funktioniert in der 1.0 Version seit Jahren ohne Probleme.
      Konnte ich den Compiler als Problem ausfindig machen.
      Mit einer kurzen Zeile

      If Status =4 then
      Status=1
      Return
      End if

      Und schon funktionieren alle Erweiterungen und Das Programm verhält sich genau so wie es soll.
      Warum das so ist ist mir immernoch ein rätzel aber gut!
      Wie die alten Chinesen schon immer sagten:
      "It's not a bug, it's a feature"

      und damit werd ich wohl leben... :)