Zu blöd für den Timer

    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!

    • Zu blöd für den Timer

      N'Abend,

      ich steh gerade völlig auf dem Schlauch - da will ich nach langer Zeit mal schnell was programmieren...

      Ich möchte eigentlich nur alle ca. 2,5 Sekunden eine Sub aufrufen, leider wird sie bei jedem Durchlauf aufgerufen und ich sehe den Fehler nicht:

      Quellcode

      1. $regfile = "m644pdef.dat"
      2. $framesize = 42
      3. $swstack = 32
      4. $hwstack = 32
      5. $crystal = 18432000
      6. Dim Tick500ms As Byte
      7. Dim Time_count As Byte
      8. Dim Sekunde As Byte
      9. Dim Fehler As Byte
      10. Dim Lesefehler As Byte
      11. Dim Poti As Byte
      12. Dim Abstand As Byte
      13. Dim Success As Bit
      14. Config Timer0 = Timer , Prescale = 1024
      15. On Timer0 Time_isr
      16. Enable Timer0
      17. Start Timer0
      18. Enable Interrupts
      19. '*****************************************************************************************************************************************************************************************
      20. Main:
      21. Success = 1
      22. Do
      23. 'Gosub Analog
      24. 'Gosub Smartmeter_read
      25. If Success = 1 Then
      26. 'Gosub Lcd_display
      27. If Tick500ms > 4 Then 'nur alle 2,5 Sekunden ausführen
      28. Gosub Set_inverter_output
      29. Tick500ms = 0
      30. End If
      31. End If
      32. Loop
      33. End
      34. '*****************************************************************************************************************************************************************************************
      35. Set_inverter_output:
      36. INCR Poti
      37. Locate 1, 1
      38. Lcd Poti
      39. Return
      40. '*****************************************************************************************************************************************************************************************
      41. Time_isr:
      42. Incr Time_count
      43. If Time_count > 35 Then Incr Tick500ms
      44. If Time_count >= 70 Then
      45. Incr Sekunde
      46. Time_count = 0
      47. End If
      48. Return
      Alles anzeigen
      18432000 / 1024 / 256

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Tido ()

    • Tido schrieb:

      Ich möchte eigentlich nur alle ca. 2,5 Sekunden eine Sub aufrufen,
      Also du musst als erstes mal deinen Timer so konfigurieren, dass er in einem definiertem Bereich zählt.
      Z.B. mit 100ms. Somit hat der Timer eine definierte Frequenz. Also der Interrupt wird alle 100ms aufgerufen.
      Dann lässt du eine Variable im Interrupt hochzählen, in deinem Fall 25 mal, um auf ca. 2,5 Sekunden zu kommen.
      Die Variable fragst du dann in der Hauptschleife ab mit

      BASCOM-Quellcode

      1. If DeineVariable = 25 Then
      2. DeineVariable = 0
      3. Gosub DeineSub
      4. End If
      Und schon sollte die Sub alle 2,5 Sekunden aufgerufen werden.

      Den Timer kannst du z.B. hier berechnen.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @HansHans
      Oh man, ist das blöd.

      Ich hätte auf Gleichheit prüfen sollen oder die "Altlast" mit den Sekunden gleich löschen, statt später ("Vielleicht brauche ich das noch...").

      Also dauert es nur ca. 500ms bis Tick500ms = 1 und dann wird es ganz schnell >4...

      Vielen Dank, manchmal braucht es ein paar Augen mehr!

      Ist Korrigiert:

      Time_isr:
      Incr Time_count
      If Time_count > 35 Then
      Incr Tick500ms
      Time_count = 0
      End If
      Return