$timeout macht mich fertig

    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!

    • $timeout macht mich fertig

      Ich möchte $timeout verwenden, weil bei meinem Programm in ungünstigen Fällen auf einen input gewartet wird, wo keiner kommt. Diese Endlosschleife will ich mit $timeout abbrechen. In der Hilfe steht dazu beim Beispielprogramm:
      Dim Sname As String * 10
      Dim B As Byte
      Do
      $timeout = 1000000
      Input "Name : " , Sname
      Print "Hello " ; Sname
      $timeout = 5000000
      Input "Name : " , Sname
      Print "Hello " ; Sname
      Loop
      'you can re-configure $timeout

      In meinem Programm (das von Babette natürlich X/ ) geht das auch so, hier ein Ausschnitt


      BASCOM-Quellcode

      1. ...
      2. $timeout = 4000000 '8 Sekunden
      3. Power_enable = 0
      4. Wait 1
      5. Lautstaerke = Lautstaerke_eram
      6. If Lautstaerke > 30 Then
      7. Lautstaerke = 25
      8. Lautstaerke_eram = Lautstaerke
      9. End If
      10. Gosub Player_init
      11. Files_in_mp3 = Mp3_getcountusb() 'Gesamtanzahl von files
      12. Files_in_mp3 = Files_in_mp3 + Mp3_getcountcard()
      13. For N = 0 To 19
      14. Ordner = N + 20
      15. Anzahl_files(n) = Mp3_getfilesinfolder(ordner)
      16. If Anzahl_files(n) > 20 Then Anzahl_files(n) = 20
      17. Auswahlbereich(n) = Anzahl_files(n)
      18. files_in_mp3 = files_in_mp3 - Anzahl_files(n) 'Anzahl der Witze
      19. Next N
      20. File_in_play = File_in_play_eram
      21. If File_in_play > files_in_mp3 Then
      22. File_in_play_eram = files_in_mp3
      23. File_in_play = files_in_mp3
      24. End If
      25. For N = 0 To 19
      26. For M = 0 To 19
      27. Filenummer(n , M) = M + 1
      28. Next M
      29. Next N
      30. Call Mp3_playfromfolder(39 , 1)
      31. Gosub Warte_auf_file_ende
      32. $timeout = 1000000 '2 Sekunden
      33. Enable Pcint0
      34. Enable Pcint1
      35. Gosub Aufwachen
      36. ...
      37. Player_init:
      38. Abgeschaltet = 0
      39. Power_on_zeit = 0
      40. Mp3_clear_serialbuffer
      41. Power_enable = 1 'Strom einschalten
      42. Inputbin #255 , Mp3_asend(mp3_array0) , 10 'nimmt die Meldung des players nach poweron auf
      43. 'es gibt verschiedene player-Module 10bytes werden immer gesendet, bei manchen wird noch ein zusätzliches &HFF vorneweg ausgegeben
      44. ' Waitms 100
      45. N = 1
      46. If Mp3_asend(mp3_array7) <> 2 And Mp3_asend(mp3_array6) <> 2 Then 'player ist nicht initialisiert
      47. Do
      48. Power_enable = 0 'Strom ausschalten
      49. Wait N
      50. Mp3_clear_serialbuffer
      51. Power_enable = 1 'Strom einschalten
      52. Inputbin #255 , Mp3_asend(mp3_array0) , 10 'nimmt die Meldung des players nach poweron auf
      53. Incr N
      54. Loop Until Mp3_asend(mp3_array7) = 2 Or Mp3_asend(mp3_array6) = 2
      55. End If
      56. Waitms 10
      57. Call Mp3_setvolume(lautstaerke) 'Lautstärke setzen
      58. Waitms 50
      59. Return
      60. ...
      Alles anzeigen

      Zeile 3 und Zeile 33. Keine Fehlermeldung, das Programm läuft soweit.
      Jetzt kommt's, wenn ich Zeile 3 auskommentiere, weil ich meine, da will ich noch kein timeout, dann gibt es weiterhin keine Fehlermeldung, nur das Programm läuft nicht, weil der Befehl aus Zeile 43 offensichtlich nicht ausgeführt wird. Nehme ich Zeile 33 auch heraus, läuft wieder alles. Lasse ich Zeile 3 drin und nehme Zeile 33 raus, läuft auch alles, also, was das power_enable betrifft. Ich hab' jetzt Zweifel am Rest vom Programm, da es sowieso sehr eigenwillig ist. Um das stackProblem möglichst auszuschalten, hab' ich für mein zweidimensionales array einen Platzhalter eingebaut, damit das 'free sram' ordentlich angezeigt wird. Die stackwerte liegen jetzt bei
      $hwstack = 100
      $swstack = 100
      $framesize = 200
      und es ist noch 9% vom ram frei.
      Irgendwo mache ich wohl einen grundsätzlichen Fehler, wer kann mir einen Tipp geben?
      Dateien
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Oh Mann! :cursing: Steht im code irgendwo ein $timeout, wird beim compilieren die timeout-Variable angelegt und zwar mit Wert=0. Kommt das Programm an dieser Zeile vorbei, wird diese Variable erst dann mit dem angegebenen Wert gesetzt. Timeout ist aber ab Programmstart aktiv. Das heißt in meinem Beispiel, das inputbin in der sub player_init wird sofort abgebrochen, da timeout ja noch =0 ist und das Programm bleibt da hängen.
      Mann, sind das Stolperfallen a_28_2c02f089
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Trexis5 schrieb:

      Ich verwende nur den Interrupt vom RXD und mache das einlesen selber.
      Das geht in meinem Fall leider nicht, bzw verbessert nix, glaube ich. Der Programmablauf soll ja auf das Ende der Übermittlung warten. Da sehe ich keinen Unterschied, ob der auf das setzen eines flags in der isr wartet, oder auf das input.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Es muss vor einem input auf einen Wert gesetzt werden, der sinnvoll ist. Sobald timeout im Programm drin steht, ist es aktiv, die timeout-Zeit wird aber erst mit dem Befehl $timeout=xx von =0 auf xx gesetzt. Ein Wert von 0 überspringt ein input.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ja, aber ich dachte, da brauch ich ihn noch nicht und hab' ihn deshalb auskommentiert. In Folge ist das Programm in der player_int hängen geblieben, weil timeout da noch =0 war und so das dortige inputbin übersprungen wurde.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Trexis5 schrieb:

      Ich verwende nur den Interrupt vom RXD und mache das einlesen selber.
      Das geht immer.
      jop, das ist für mich auch die einfachste und vor allem sicherste Methode.

      tschoeatsch schrieb:

      Da sehe ich keinen Unterschied, ob der auf das setzen eines flags in der isr wartet, oder auf das input.
      Ich denke, ein Programm sollte von der Struktur her besser nicht warten, sondern eben durchlaufen können. Da kann man im Interrupt die Daten holen und im Hauptprogramm das Flag auswerten oder eben die Fehlerroutine abarbeiten
    • Gewartet wird immer, wenn das Ergebnis vom input, egal, wie das eingelesen wird, für das weitere Vorgehen ausschlaggebend ist. Wenn man meint, die Warteschleife ist im Hauptprogramm besser aufgehoben, hm, ich sehe keinen Vorteil.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Wenn das Programm in der main durchnudelt und im Vorbeikommen das flag checkt, dann ist das für mich die Warteschleife.
      das würde ich dann nicht als Warteschleife bezeichnen, sondern als Bereitschaftstatus bezeichnen. Ist von der Funktionalität her halt anders.
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Hi


      Das Timeout bezieht sich beim Lesen auf das Einlesen pro Zeichen.


      In der Routine Player_Init versuchst du 10 Byte in ein Array einzulesen.
      Bedeutet 10x Timeout.


      Wenn du aber in Zeile 3 den Timeout auskommentierst, in Zeile 33 jedoch nicht, wird die Variable __timeout vom Compiler angelegt und mit 0 initialisiert.


      Bedeutet, wenn Timeout=0 ist, dann ist Timeout abgeschaltet.


      Wenn du dann mit Inputbin versuchst Werte einzulesen, bleibt der solange dort stehen, bis die exakte Anzahl einzulesende Bytes eingelesen wurden.
      Deshalb, so vermute ich, bleibt dein Programm in Player_Init hängen.


      Das kannst du überprüfen, indem du in Player_Init vor den Befehl
      "Inputbin #255 , Mp3_asend(mp3_array0) , 10"
      z.B. eine LED setzte und danach ausmachst.


      Ich persöhnlich verwende den Timeout nur ungern, da er verschiedene Nachteile hat.
      Er kann länger dauern als angenommen, wenn während des Timeouts Interrupts abgearbeitet werden.
      Das Tinmeout ist auch unterschiedlich lang, je nachdem ob man ein Byte, Integer oder Single einliest.
      Bei Arrays noch wilder.


      Denn das Timeout gilt pro Zeichen!


      Timeout verwende ich nur in Ausnahmefällen.


      Ich ziehe da immer einen Empfangsbuffer vor, den ich mit Befehl isCharWaiting() abfrage, ob was empfangen wurde.
      Ist nichts da, kann das Programm weiter arbeiten.


      Wenn du trotzdem einen Timeout brauchst, kannst du auch einen Timer nehmen und einfach Tichs runterzählen lassen.
      Wenn Ticks = 0 dann ist Timeout abgelaufen. Ein Timer hat man sowieso meistens im Programm irgendwo am laufen.


      Wenn nicht, hat man die Wahl sich einen der 3 Timer rauszusuchen und das Timeout selbst festzulegen.


      Vorteil, du brauchst den Timeout nur 1x für alle Zeichen verwenden. Und nicht pro Zeichen.
      Das Timing ist unabhängig von anderen Interrupts und damit recht konstant.


      Noch eine kleine Bemerkung am Rande.
      Ich finde es bemerkenswert, wie du den Ablauf der Steuerung ohne eine Statemachine hinbekommen hast.
      Dennoch ist der Code in dem einen Editor-Fenster recht lang geworden.
      Hier würde sich doch anbieden diverse Programmteile in Include-Dateien auszulagern.
      Das macht den Code gleich übersichtlicher.


      Gruß Micha
    • Ich hab' das timeout anders verstanden. In der Hilfe finde ich

      When the time out is reached, a zero/null will be returned to the calling routine. Waitkey() will return 0 when used with a byte. When you use INPUT with a string, the timeout will be set for every character. So when 5 characters are expected, and they arrive just before the timeout value is reached, it may take a long time until the code is executed.
      When the timeout occurs on the first character, it will return much faster.

      Daraus schließe ich, bei einem einzulesenden string wird das timeout nach jedem gelesenen char neu gestartet. Wird timeout wegen Zeitüberschreitung ausgelöst, dann wird auch nicht auf die folgenden Zeichen gewartet (letzter Satz).

      Mit timeout=0 ist es nicht abgeschaltet, es ist vielmehr sofort eine Zeitüberschreitung bei einem input, sodass dieser praktisch übersprungen wird. So hab' ich das im Simulator gesehen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Wird timeout wegen Zeitüberschreitung ausgelöst, dann wird auch nicht auf die folgenden Zeichen gewartet (letzter Satz).
      Das ziehe ich zurück, dem ist nicht so.

      tschoeatsch schrieb:

      Mit timeout=0 ist es nicht abgeschaltet, es ist vielmehr sofort eine Zeitüberschreitung bei einem input, sodass dieser praktisch übersprungen wird. So hab' ich das im Simulator gesehen.
      Das bestätige ich.
      Das Testprogramm für den Simulator

      BASCOM-Quellcode

      1. $regfile = "m168pdef.dat"
      2. $crystal = 8000000
      3. $hwstack = 34
      4. $swstack = 32
      5. $framesize = 64
      6. $timeout = 100000 '~200mS bei 8000000Hz
      7. Dim A As Byte
      8. Dim B(2) As Byte
      9. Do
      10. !nop
      11. $timeout = 100000 '~200mS bei 8000000Hz
      12. Inputbin A
      13. !nop
      14. $timeout = 0
      15. Inputbin B(1) , 2
      16. !nop
      17. Loop
      Alles anzeigen
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Ich hab' das timeout anders verstanden. In der Hilfe finde ich
      Bitte erlaube mal die Frage Was für ein Controller nutzt Du. Vermute nicht den optimalen für deinProjekt. Mit Software kann man sehr viele „Schalter“ betätigen aber warum oft so ein unzuverlässigen Umweg wenn es passente Modellvarianten gibt. Speziell für Power-down- Zustand.


      Mit freundlichen Grüßen


    • Wichtig und immer vernachlässigt wird die Nomenklatur der Modellvarianten .

      Na ja bei den billigen Chinamodulen muss man alles mit der Software richten. Ist und war noch nie mein Ding.Bin hier im Forum immer belächelt wurden, wenn ich mich auf Hardwarepraxis bezogen habe, denn die Hilfen sind ja meist fürdie 1Revision erstellt.

      Z.B.DieDritte Revision Architektur mit B hat USART wake-up im „Power-down“-Zustand.

      P.S. kleiner Hinweis:

      Dumm gelaufen . Vor ein paar Wochen wurde in mein Gehiern der Ram zerschossen und ein Teil des Flach gelöscht. Im Volksmund nennt man es Schlaganfall, wenn ich mich so erinnere.

      Zum Glück gib es in der „Rübe“ noch genug Speicherzellen. Die müssen nur neu programmiert werden oder eben nur Neuangelernt werden wie es die Ärtzte sagen.

      Somit Entschuldigt meine „Schmierereien“ hier im Forum.


      Mit freundlichen Grüßen