Start Timer0

    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!

    • Start Timer0

      Hallo Forum Gemeinde
      Ich habe ein Problem mit einer Timer Überwachung, es wird immer wieder überprüft ob der timer0 läuft, altertakt wird mit takt vergleichen und eine Wartezeit von 2ms am ende ist eingefügta . Es passiert, aber ab und zu dass das Programm gleich in Stoerung 2 geht, ohne das überhaupt was am Vorschub voran geht. Kann es sein das der Start des timer0 eine gewisse Zeit braucht, um diesen zu starten. MfG
      $regfile = "m328pdef.dat"
      $crystal = 2000000
      $hwstack = 32
      $swstack = 32
      $framesize = 32
      Config Timer0 = Timer , Prescale = 8 '0,001024s
      Enable Timer0
      On Timer0 Isr_timer0
      Start Timer0
      do
      ….
      gosub automatik

      loop
      Automatik:
      ...
      start timer0
      vorschub = 1: altertakt=0 : takt =1
      If Freigabe = 1 Then
      While Takt < Messen
      If Tasterrot = 0 Then : Freigabe = 0 : Automatikstart = 0 : : Ledrot = 1 : Ledweiss = 0 : Stoerung = 4 : Exit While : End If
      If Takt > Taktzaehler Then
      If Klappe = 0 Then
      Else
      Freigabe = 0 : Automatikstart = 0 : Ledrot = 1 : Ledweiss = 0 : Stoerung = 1 : Exit While
      End If
      End If
      If Altertakt < Takt Then 'hier liegt das Problem
      Altertakt = Takt
      Else
      Freigabe = 0 : Ledrot = 1 : Ledweiss = 0 : Stoerung = 2 : Exit While : End If
      Waitms 2
      Wend
      End If
      …...
      return

      Isr_timer0:
      Incr Takt
      Return
    • Den Timer zu starten schafft er in einer µs. Jedoch die Zeit bis zur Isr ist völlig unbestimmt. Sollte er bei 0 starten ist es ca 1ms . Ist sein Wert 255 dann nur 4 µs.
      Takt ist ein Byte? Das ist dann nach einer viertel Sekunde auch 0 (incr 255=0)
      PS Es ist recht nützlich den Code ins Code Fenster (</>) zu setzen dann behält er seine formatierung und bekommt Zeilennummern. Die vereinfachen die Antworten z.B. Das 'Start Timer0' in Zeile 8 ist unnötig da er in Zeile 6 schon gestartet wurde.
    • Hallo Walter99
      ich würde dir empfehlen so etwas
      If Tasterrot = 0 Then Freigabe = 0 : Automatikstart = 0 : : Ledrot = 1 : Ledweiss = 0 : Stoerung = 4 : Exit While : End If
      nicht zu machen. Du denkst wahrscheinlich, dass alle Zuweisungen nur dann ausgeführt werden, wenn Tasterrot=0 ist.
      Der Compiler macht daraus aber
      If Tasterrot = 0 Then Freigabe = 0 'hier ist die Bedingung zu Ende
      Automatikstart = 0
      Ledrot = 1
      Ledweiss = 0
      Stoerung = 4
      Exit While
      End If

      Ich würde ganz auf diese Mehrfachzuweisungen in einer Zeile verzichten. Si machen das Programm in meinen Augen nur unleserlicher, aber das ist Geschmacksache.
      Eigentlich sollte auch für das zusätzliche End If eine Fehlermeldung kommen. Kann man hier nicht sehen, weil du keinen kompilierbaren Code eingestellt hast.
    • Quellcode so zu schreiben ist eine Strafe für Augen und Geist. Und was eben @Franz schon erwähnte: Die wichtigen Informationen hast Du einfach weggelassen. Was soll ich dazu sagen? Keine Ahnung was in den Bereichen mit „…“ passiert. Auch kann ich keine Definition der Variablen erkennen.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Hallo Franz
      If Tasterrot = 0 Then : Freigabe = 0 : Automatikstart = 0 : Ledrot = 1 : Ledweiss = 0 : Stoerung = 4 : Exit While : End If
      Ist korrekt, da dem Compiler durch den Doppelpunkt angewiesen wird, alles in eine neue Zeile zusetzen und dies funktioniert auch richtig und wird auch compiliert.
      hallo pluto25
      Du hast auch Recht , der Timer0 wird vorher noch gestoppt und wird nur im Unterprogramm gestartet und gestoppt. Takt ist als word deklariert, da der Ganze durchlauf nach ca 6 sekunden beendet ist. Mir geht es hierum, da altertakt nicht kleiner neuer Takt ist, obwohl korrekt gestartet und eine Wartezeit von 2ms eingefügt ist, sollte doch der neue Takt immer größer sein. Ich konnte das Problem bis jetzt nur einmal erkennen. Mein weiteres Vorgehen wird sein, dass ich nach Start timer0 eine Wartezeit von 10ms einfügen und den Takt danach nochmal auf null setze.
      danke an alle MfG
    • Der Altertakt ist auch ein Word ? $FF (Byte) ist größer als $0100 (Word) :D
      Geht es nur darum zu erkennen ob der Timer0 läuft? Da wäre If TCCR0B>0 then (Timer läuft) einfacher.

      Franz wrote:

      If Tasterrot = 0 Then Freigabe = 0 'hier ist die Bedingung zu Ende
      ist sie nicht da dort ein Doppelpunkt zwischen steht. (nach dem Then)

      Anstelle 'If Klappe=0 then
      else'
      wäre 'If Klappe <>0 then' 4Flash kleiner und könnte auch alles in einer Zeile untergebracht werden ;)

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

    • Hallo Pluto
      Ja altertakt ist auch word, ich will nicht nur erkennen ob er startet, sondern in der Schleife while ... wend auch weiterhin läuft, da dieser timer0 Systemrelevant ist. Ich hatte bis jetzt einmal gesehen, das er in die Stoerung = 2 rein läuft, ohne das die Maschine sichtbar was getätigt hat. Deswegen auch die Frage, ob der Start timer0 etwas länger braucht, damit wäre das Ergebnis der Störung zu erklären oder halt das er überhaupt nicht gestartet hat, dies wäre auch noch möglich.
      "If klappe...." ja man kann vieles machen , ist wie oben schon geschrieben wurde, für den einen ist es Augenkrebs und für mich die ideale Lösung. Trotzdem Danke dafür.
      Mfg
    • Hallo Pluto, ja immer nach 5320 takten, wird die schleife spätestens beendet, also knapp 5,45 Sekunden, eine andere isr ist nicht in Benutzung, strings und overlays werden auch nicht genutzt. Stacks sind eigentlich genügend freigegeben. Variable geschreddert? werden ja vorm Unterprogramm nochmal gesetzt. altertakt = 0: takt=1. Ich werde wie oben schon geschrieben, nach dem starten vom timer0 ein waitms 10 einfügen und dort nach diesem den Takt auf 1 setzen. Was noch möglich wäre, ein Spannungseinbruch oder ein Peak, wobei ein Spannungseinbruch wahrscheinlich eher ein Reset auslöst. Eine Spannungsspitze könnte eher passen, ich muss mir das nochmal anschauen.
      Danke, das hat mich doch inspiriert, mit der variable geschreddert.
      MfG
    • Solch ein Codegewusel soll eine ideale Lösung sein? Trifft so nie zu, weil total unübersichtlich und gewisse Fehler weder auf fallen noch bewusster werden.
      Habe dein obiger Programauszug mal übersichtlicher in Bascom ein gegeben.

      Desweiteren habe ich dieses gosub Automatik zwischen Do und Loop komplett eingesetzt, weil sonst nichts zwischen Do und Loop zu verarbeiten ist. Ebenso habe ich die entsprechenden Programzeilen passend eingerückt.
      Nun erst wird es eine ideale Lösung die uns Mark zur Verfügung gestellt hat.

      Erst jetz fällt auf, unmittelbar nach Do folgt folgendes: (Die Doppelpunkte entfernt natürlich)
      do
      Vorschub = 1
      Altertakt = 0
      Takt = 1
      If Freigabe = 1 Then

      Na, ist das ein idealer Beginn nach Do?
      Ich fand in deinem Programm nirgends die Stelle, in der Freigabe auf 1 gesetzt wird.
      Ebenso gibt es keine Örtlichkeit in der ein Taktzähler generiert und bearbeitet wird.
      Welchen Sinn hat also dieser Befehlsauszug ---> If Takt > Taktzaehler Then

      Ferner, wo werden denn Altertakt und Takt unterschiedlich behandelt?
      If Altertakt < Takt Then 'hier liegt das Problem

      Direkt nach dem Do gibt es einzig Takt = 1 ; Altertakt = 0
      Logisch betrachtet ist folglich die entsprechende If Bedingung immer wie, wenn nicht sonst wo was verändert wird?

      Hier der Versuch deinen Code besser dargestellt hier einzubinden.
      Das If in Zeile 28 hat sein zugehöriges End if in Zeile 62.
      Na, ist solcherlei Code-Darstellung nicht viel besser zu lesen, besser zu verstehen, zu überblicken?
      Ich bitte um solcherlei Code, zumal nicht viel anders zu erstellen ist, es jedoch besser ist.
      Um das zu verdeutlichen, habe ich diese Antwort gegeben. Fasse es bitte nicht als Kritik auf.

      Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 2000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 32
      6. Config Timer0 = Timer , Prescale = 8 '0,001024s
      7. Enable Timer0
      8. On Timer0 Isr_timer0
      9. Start Timer0
      10. Dim Vorschub As Byte
      11. Dim Takt As Word
      12. Dim Altertakt As Word
      13. Dim Freigabe As Byte
      14. Dim Tasterrot As Byte
      15. Dim Automatikstart As Byte
      16. Dim Messen As Byte
      17. Dim Ledrot As Byte
      18. Dim Ledweiss As Byte
      19. Dim Stoerung As Byte
      20. Dim Klappe As Byte
      21. Dim Taktzaehler As Byte
      22. do
      23. Vorschub = 1
      24. Altertakt = 0
      25. Takt = 1
      26. If Freigabe = 1 Then 'wo ist das zugehörige End if?
      27. While Takt < Messen 'wo taucht "messen" überhaupt auf?
      28. If Tasterrot = 0 Then
      29. Freigabe = 0 'wodurch kann Freigabe wieder 1 werden?
      30. Automatikstart = 0
      31. Ledrot = 1
      32. Ledweiss = 0
      33. Stoerung = 4
      34. Exit While
      35. End If
      36. If Takt > Taktzaehler Then
      37. If Klappe = 0 Then
      38. Else
      39. Freigabe = 0 'wodurch kann Freigabe wieder 1 werden?
      40. Automatikstart = 0
      41. Ledrot = 1
      42. Ledweiss = 0
      43. Stoerung = 1
      44. Exit While
      45. End If
      46. End If
      47. If Altertakt < Takt Then 'hier liegt das Problem
      48. Altertakt = Takt
      49. Else
      50. Freigabe = 0 'wodurch kann Freigabe wieder 1 werden?
      51. Ledrot = 1
      52. Ledweiss = 0
      53. Stoerung = 2
      54. Exit While
      55. End If
      56. Waitms 2
      57. Wend
      58. End If
      59. loop
      60. Isr_timer0:
      61. Incr Takt
      62. Return
      Display All
    • Grüße dich Bitlogger
      Schön das du dir die Mühe gemacht hast, meine code besser darzustellen , aber wie ich schon oben schon mal schrieb
      ""If klappe...." ja man kann vieles machen , ist wie oben schon geschrieben wurde, für den einen ist es Augenkrebs und für mich die ideale Lösung.". Auch wollte ich hier nicht, das ganze Programm zeigen, da dies eventuell Urheberrechtlich geschützt ist und dies .ein Nachbau ist, weil der Pic Controller defekt ist. Mir ging es nur darum, warum altertakt = oder > takt ist und das Programm in "Stoerung 2" geht, ohne das überhaupt die Maschine startet. Ach so Taktzaehler ist eine feste Variable, die beim Einschalten größer und beim 2. Durchlauf kleiner ist.
      Eigentlich hat Pluto25 schon richtig erkannt das wahrscheinlich irgendwas geschreddert wird und ich bin auch dieser Meinung. Ich werde dieses weiter Nachforschen und eventuell zu gegebener Zeit, auch dies Kund tun.
      MfG
    • walter99 wrote:

      bis jetzt einmal
      pro Stunde oder Woche?
      ich halte die Avr für sehr unempfindlich was Störungen angeht.
      Die denken auch noch nach wenn andere Komponenten an Unterspannung versagen. Daher besser den Broun Out aktivieren, dann gibt's einen sauberen Reset und er kann erfassen das der Strom fehlte.
      Längere Zeit 8V und kurz 24V überleben sie auch daher ist Überspannung eher kein Problem.
      Andererseits 'Irjendwat is immer' So unter hundert Watchdog 'bissen' würde ich nicht mal die Schaltschranktüre öffnen. Selten auftretene Fehler sind kaum zu finden. Erst wenn sie regelmäßig auftreten oder den Ablauf stören hat man bessere Karten.
      PS Es gibt keine andere Störmeldung die auch Nummer 2 hat?
      PPS Neulich hatten wir einen Bug der den Stak flutete. Das könnte geprüft werden in dem eine Ungenutzte Variable als letzte 'geDimt' wird. Die bleibt immer 0 solange der nicht überläuft.
    • Hallo Pluto25
      Bisher konnte ich den Fehler nur einmal identifizieren und das bei einer Laufzeit von z.Z. 14 Tagen. Da ich nur bei Störungen gerufen werde, wo die Mitarbeiter das nicht selbst lösen können, kann ich nicht garantieren, ob dieser Fehler schon mehrfach aufgetreten ist. Die Störung, kann nicht weg quittiert werden, nur durch ausschalten und einschalten der Maschine. Störmeldung 2 betrifft nur die Timerüberwachung.
      "PPS Neulich hatten wir einen Bug der den Stak flutete." Kannst du mir ein Beispiel dazu geben, wie man diesen überwacht, dies ist für mich Neuland.
      MfG
    • Hilfreich wäre vielleicht dir Verwendung von einem Teil, das im Lexikon vom Forum unter Open Log beschrieben ist.
      Kostet nicht die Welt, wäre sinnvoll so in das Programm ein zu binden dass Rückschlüsse auf die möglichen Störungen aufgezeichnet
      werden. Die Speicherkarte könnte während der Auswertung, Analyse ausgetauscht werden. Man hätte viel Zeit zur Analyse der Aufzeichnung und sogar, ob die Aufzeichnungsmethode gut gewählt wurde, oder angepasst werden müsste.

      Ist wieder mal nur ein Vorschlag, eine Idee von mir.
      Gruß Bitlogger
    • walter99 wrote:

      Störmeldung 2 betrifft nur die Timerüberwachung.
      Und die kann eigentlich (ohne weitere Isr) nie passieren. ?(
      Warum kam man überhaupt auf die Idee das das irgendwie passieren könnte? War der Code in der Nähe mal umfangreicher?
      Ich kenne Timerfehler bei Software Usart Störungen, aber das er ohne Grund nicht losläuft oder stehen bleibt hatte ich noch nie.
      Die Staks beginnen am Ende des Ram und füllen sich mit absteigender Adresse Richtung Adressraumes der Variablen. Sollte der Stak nun überfüllt werden nimmt er einfach mehr Platz ein. Das wird evt zum Problem wenn er dabei die selbe Zelle nutzt die für eine Variable genutzt wird. Sehr gut zu sehen im Simulator bei einen Code für einen Tiny13. Bei dem Mega muß da etwas gescrollt werden um die Grenzen zu sehen. Die zuletzt Per Dim eingerichtete Variable nutzt die Zelle mit der höchsten Adresse darüber sind alle frei bis die Staks beginnen. Wenn diese nun im Code nie beschrieben wird ist sie nach dem Starten 0 und bleibt 0 bis in die Ewigkeit oder bis der Stak sie beschreibt. Den gleichen Fehler (nur andersrum) macht ein String oder Array wenn sie überfüllt werden. z.b.
      Dim Text1 as String*5
      Dim s(6) as Byte
      Dim Text2 as String*5
      Text1 = "Hallo guten Tag" schreddert das Array und Text2 wird "Tag"
      S(7) = 48 macht den ersten Buchstaben in Text2 zu "0" (Text2 zu "0ag")
      Staks kann man auch leicht fluten:
      sowas schreddert alles :D
      sub1:
      gosub sub2
      return
      sub2:
      gosub sub1
      Return

      walter99 wrote:

      Kannst du mir ein Beispiel dazu geben
      Nicht so einfach ohne weitere Angaben. Hier ein Auszug aus der .rpt eines was hier arbeitet :
      Stack start : 8FF hex
      Stack size : 40 hex
      S-Stacksize : 40 hex
      S-Stackstart : 8C0 hex
      Framesize : 48 hex
      Framestart : 838 hex
      Space left : 1311 dec
      ...letzte Variable
      DUMMY Byte 0318 792

      Das könnte so warnen:
      if inp($837)<>0 then Print "Vorsicht Stak Überlauf"
      if inp($400)<>0 then Print "Achtung Freier Bereich wird klein"
      if dummy <>0 then :Print "Absturz steht unmittelbar bevor" :goto 0 (=Reset) :End if

      Anstelle des Print könnte es auch eine Variable im Eeprom hochzählen so kann man bei einer Inspektion nachschauen ob da was war.

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

    • Hallo Pluto25
      "Und die kann eigentlich (ohne weitere Isr) nie passieren. Warum kam man überhaupt auf die Idee das das irgendwie passieren könnte?"
      Eigentlich nicht, aber es passiert immer wieder mal, auch während es läuft, ich habe die Zeiten auf 3ms angehoben und konnte keine Stoerung=2 mehr erkennen. Das Programm ist eine Eigenentwicklung für einen defekten PIC Controller, dieser überwachte noch mit Motorkontakten die auf Reed Basis arbeiteten, leider entstehen da viele Impulse durch das Schließen und Öffnen. Deswegen mache ich die ganze Sache mit dem Timer0, der die Länge vom Vorschub und das Schneidmesser überwacht, sollte etwas Größer sein als eingestellt geht er in verschiedenen Störungen. Aber hier ist aber wichtig, das Timer0 auch läuft, deswegen die Überwachung vom Timer0. Ansonsten würde er unendliche Längen von Material vorschieben.
      MfG
    • walter99 wrote:

      Stacks sind eigentlich genügend freigegeben.
      Ich habs mal simuliert (mit bitloggers Vorgaben), da knallt er sofort in die Störung 2 =O
      Mit einem 'Enable Interrupts' beschwerte er sich über zu kleine Staks. Was aber hier bisher keine negativen Auswirkungen hat. Mal sehen ob er aussteigt a_15_a5ddcf85

      Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 2000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 32
      6. Config Timer0 = Timer , Prescale = 8 '0,001024s
      7. Enable Timer0
      8. On Timer0 Isr_timer0
      9. Start Timer0
      10. Dim Vorschub As Byte
      11. Dim Takt As Word
      12. Dim Altertakt As Word
      13. Dim Freigabe As Byte
      14. Dim Tasterrot As Byte
      15. Dim Automatikstart As Byte
      16. Dim Messen As Word 'Byte
      17. Dim Ledrot As Byte
      18. Dim Ledweiss As Byte
      19. Dim Stoerung As Byte
      20. Dim Klappe As Byte
      21. Dim Taktzaehler As Byte
      22. Tasterrot = 1
      23. Freigabe = 1
      24. Messen = 5678
      25. Enable Interrupts
      26. Do
      27. '….
      28. Gosub Automatik
      29. Stop Timer0
      30. '…
      31. Loop Until Stoerung <> 0
      32. Print "Störung: " ; Stoerung
      33. Do : Loop
      34. Automatik:
      35. '...
      Display All
      Ps mit den 3ms ist die Präzision um 50% schlechter :D Dann scheint mir die Bestimmung über Zeit auch recht ungenau. Werden die Abschnitte nicht spürbar länger je leichter das Vorzuschiebende wird?
      Oder immer kürzer je schwerer es der Motor hat (Lagerverschleiß oder Schmiermittelverharzung?)

      PPS Selbst mit den 2ms hat er oft sogar 3 Takte mehr als die Altertakt. Gibt es keine anderen Isr die seine Ausfürung hemmen? Timer1 und die Pin Isr haben Vorrang vor dem Timer0. Adc und Kommunikaton würden zwar später ausgeführt, könnten aber auch stören wenn ihre Abarbeitung 1ms überschreitet.

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

    • Wieder nur eine Empfehlung von mir. Deshalb nur ein kleiner Auszug aus deinem Programm zur weiteren Bearbeitung.

      Source Code

      1. 'Handschalter sollte Automatikstart, heissen
      2. 'entsprechend Handbetriebstart für Handbetrieb bedienen
      3. 'Falls Automatik aus sein sollte, wenn Handbetrieb gedrückt wurde
      4. 'sollte das passend berücksichtigt werden, und Automatikbetrieb nur möglich sein,
      5. 'wenn alle dafür erforderlichen Vorbedingungen vorhanden sind.
      6. 'Versuche das Programm so auf zu bauen dass es wie eine SPS funktioniert!
      7. 'Eine SPS ist eine Statemaschine! Sie sammelt Vorbedingungen und gibt nur nach
      8. 'gültigen Bedingungen das aus, was zu den Vorbedinungen passt.
      9. 'Nimm mal an du solltest eine Siemens Logo SPS programieren.
      10. If Freigabe = 1 And Handschalter = 1 And Tasterstart = 1 Then
      11. Gosub Automatik
      12. Elseif Freigabe = 1 And Fusspedal = 1 Then
      13. Waitms 100
      14. Gosub Fussbetrieb
      15. 'Vorbedingung für Handbetrieb fehlt hier, gehört nachfolgend hin
      16. If Tasterstart = 1 Then 'gibt es bereits in oberster Zeile!
      17. Waitms 100
      18. Gosub Handbetrieb
      19. End If
      20. End If
      21. Loop
      Display All