Warum hängt diese Programm manchmal ?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Warum hängt diese Programm manchmal ?

      Hallo,
      ich habe mal wieder ein Problem mit meinem Hoflicht-projekt. Manchmal stoppt das Programm einfach so .
      Ich kann mir einfach keinen Reim drauf machen. Bitte mal drüber schauen, ob da sich ein Fehler eingeschlichen hat.

      BASCOM-Quellcode

      1. 'Laufrichtungslicht für Hofeinfahrt (Wegbeleuchtung)
      2. 'D.Jäschke 20.05.11 fertig 16.11.13
      3. 'rev.20.07.2014 wegen Regen ISR zeitlich auf 40ms
      4. 'rev.25.02.2017 Comperator mit Rückkopplung (ä.LM358)wegen Hysterese
      5. '_______________________________________________________________
      6. $regfile = "attiny2313.dat"
      7. $crystal = 1000000
      8. $hwstack = 32
      9. $swstack = 10
      10. $framesize = 40
      11. '$sim
      12. '-------Pin, Port, Alias------------------------------------------
      13. Ddrb = &B00011100 'PB1 ist LDR
      14. Ddrd = &B11110011
      15. A1 Alias Portb.4 'OC1B
      16. A2 Alias Portb.3 'OC1A
      17. A3 Alias Portb.2 'OC0A
      18. A4 Alias Portd.5 'OC0B
      19. Led Alias Portd.4 'Anzeige Hell oder Dunkel
      20. Raus_led Alias Portd.0 'LED nur für Test
      21. Rein_led Alias Portd.1 'LED nur für Test
      22. Isr0 Alias Pind.2 'rot raus
      23. Portd.2 = 1
      24. Config Int0 = Falling
      25. Enable Int0
      26. On Int0 Raus_isr0
      27. Isr1 Alias Pind.3 'blau rein
      28. Portd.3 = 1
      29. Config Int1 = Falling
      30. Enable Int1
      31. On Int1 Rein_isr1
      32. 'Ddra = &B0000000 'Eingänge setzen
      33. '----------Helligkeitseinstellung--------------------------------
      34. Acsr = &B00000000 'komp ein, V+ -- 47k -- AIN0 -- 24k -- GND ACSR.aco -- 240k -- AIN0
      35. Du Alias Acsr.aco 'zeigt dunkel = 1
      36. '----------PWM---------------------------------------------------
      37. Config Timer0 = Pwm , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up , Prescale = 1
      38. Config Timer1 = Pwm , Pwm = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up , Prescale = 1
      39. Enable Interrupts
      40. '---------Variablen---------------------------------------------
      41. Dim X_1 As Byte 'Anzahl Durchläufe
      42. Dim X_2 As Byte
      43. Dim X_3 As Byte
      44. Dim X_4 As Byte
      45. 'Dim Du As Bit 'Helligkeitseinstellung
      46. Dim Pwm As Byte
      47. Dim A As Byte
      48. Dim Raus As Bit 'Status für RAUS
      49. Raus = 0
      50. Dim Rein As Bit 'Status für REIN
      51. Rein = 0
      52. Const Zeit = 120 'Laufdauer
      53. '--------Hauptprogramm------------------------------------------
      54. Led = 1
      55. Do
      56. Led = Du
      57. If Du = 1 Then
      58. If Raus = 1 And Rein = 0 Then
      59. A = 0
      60. For A = 1 To 10 '10 Durchläufe
      61. For X_1 = 0 To 255 Step 51 'a1 an
      62. Pwm1b = X_1
      63. Waitms Zeit
      64. Next
      65. For X_2 = 0 To 255 Step 51 'a2 an
      66. Pwm1a = X_2
      67. Gosub 1 'a1 aus
      68. Waitms Zeit
      69. Next
      70. For X_3 = 0 To 255 Step 51 'a3 an
      71. Pwm0a = X_3
      72. Gosub 2 'a2 aus
      73. Waitms Zeit
      74. Next
      75. For X_4 = 0 To 255 Step 51 'a4 an
      76. Pwm0b = X_4
      77. Gosub 3 'a3 aus
      78. Waitms Zeit
      79. Next
      80. For X_4 = 255 To 0 Step -51 'a4 aus
      81. Pwm0b = X_4
      82. Waitms Zeit
      83. Next
      84. If Rein = 1 Then
      85. Exit For 'Abfrage ob Weg fertig
      86. End If
      87. Next A
      88. Rein = 0
      89. Raus = 0
      90. Elseif Rein = 1 And Raus = 0 Then
      91. A = 0
      92. For A = 1 To 10 '10 Durchläufe
      93. For X_4 = 0 To 255 Step 51 'a4 an
      94. Pwm0b = X_4
      95. Waitms Zeit
      96. Next
      97. For X_3 = 0 To 255 Step 51 'a3 an
      98. Pwm0a = X_3
      99. Gosub 4 'a4 aus
      100. Waitms Zeit
      101. Next
      102. For X_2 = 0 To 255 Step 51 'a2 an
      103. Pwm1a = X_2
      104. Gosub 3 'a3 aus
      105. Waitms Zeit
      106. Next
      107. For X_1 = 0 To 255 Step 51 'a1 an
      108. Pwm1b = X_1
      109. Gosub 2 'a2 aus
      110. Waitms Zeit
      111. Next
      112. For X_1 = 255 To 0 Step -51 'a1 aus
      113. Pwm1b = X_1
      114. Waitms Zeit
      115. Next
      116. If Raus = 1 Then 'Abfrage ob Weg fertig
      117. Exit For
      118. End If
      119. Next A
      120. Rein = 0
      121. Raus = 0
      122. End If
      123. End If
      124. Loop
      125. End
      126. '----------------------Gosub's----------------------------------------
      127. 1:
      128. X_1 = X_1 - 51
      129. Pwm1b = X_1
      130. Return
      131. 2:
      132. X_2 = X_2 - 51
      133. Pwm1a = X_2
      134. Return
      135. 3:
      136. X_3 = X_3 - 51
      137. Pwm0a = X_3
      138. Return
      139. 4:
      140. X_4 = X_4 - 51
      141. Pwm0b = X_4
      142. Return
      143. '---------------------Isr's-------
      144. Raus_isr0:
      145. A = 0
      146. For A = 1 To 80 'ist taster aktiv ?
      147. Waitus 500
      148. If Isr0 = 1 Then Exit For 'nein Abbruch
      149. Next
      150. If A = 81 And Isr0 = 0 Then 'verhindert Fehlauslösung
      151. Raus = 1
      152. End If
      153. Return
      154. '----------
      155. Rein_isr1:
      156. A = 0
      157. For A = 1 To 80 'ist taster aktiv ?
      158. Waitus 500
      159. If Isr1 = 1 Then Exit For 'nein Abbruch
      160. Next
      161. If A = 81 And Isr1 = 0 Then 'verhindert Fehlauslösung
      162. Rein = 1
      163. End If
      164. Return
      Alles anzeigen
    • Hallo daja,
      ich denke das hier

      If A = 81 And Isr0 = 0 Then 'verhindert Fehlauslösung
      Raus = 1
      End If

      bedeutet, dass du den Taster bis auf 500µs genau 40ms drücken musst. Ansonsten kann Raus nicht 1 werden. Genauso bei Rein. Ich kann mir nicht vorstellen, dass du das schaffst. Oder ich übersehe etwas.
      Wie stellst du denn fest, dass das Programm stehenbleibt?
    • Dieser Code habe ich so geschrieben weil Schneeflocken oder auch starker Regen den Infrarottaster ausgelöst hat.
      Habe diese Zeit mit einem Osszi und einer Testperson( diese mußte den Taster auslösen) ausgemessen.

      Festgestellt habe ich das weil 1. das beleuchten des LDR keine Reaktion aus gelöst hat und nachdem ich die Eingänge separat ansteuerte auch keine Reaktion erfolgte
    • Hallo Daja

      was ich im Vorbeigene gesehen habe :

      Quellcode

      1. Gosub 1
      Das macht man aber nicht. In den Language Fundamentals steht ganz sicher irgendwo beschrieben, dass Labels mit einem Buchstaben beginnen sollen, aber nicht mit einer Zahl und schon ganircht nur aus einer Zahl bestehen sollen.

      Ich kann in einem x-Beliebigen Programm ohne dafür ein entsprechendes Label vorgesehen zu haben Gosub 2 schreiben und der Compiler meckert vielleicht nicht einmal.



      Das Zweite. Ist die mehfachnutzung von A so richtig - im Hauptprogramm und in den ISR?

      Gruß
      Galahat
    • Ich tippe auf zu wenih hwstack. Du hast isr und gosub. 32 bytes für isr und wenn der innerhalb von gosub auftritt, sind schon 2 bytes für gosub verbraucht. Also mal hwstack erhöhen.
      Raum für Notizen

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

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

      Ich tippe auf zu wenih hwstack. Du hast isr und gosub. 32 bytes für isr und wenn der innerhalb von gosub auftritt, sind schon 2 bytes für gosub verbraucht. Also mal hwstack erhöhen.
      War auch mein Anfangsverdacht, aber kurz gerechnet, sind es wirklich nur maximal 32 bytes die benötigt werden. Selbst wenn es zu einem Überlauf kommt, macht das nichts. Dabei würde zwar der SW-Stack zerstört, der wird aber imho nicht gebraucht. Der Frame im Übrigen auch nicht.
    • hero schrieb:

      Hallo daja,
      ich denke das hier

      If A = 81 And Isr0 = 0 Then 'verhindert Fehlauslösung
      Raus = 1
      End If

      bedeutet, dass du den Taster bis auf 500µs genau 40ms drücken musst. Ansonsten kann Raus nicht 1 werden. Genauso bei Rein. Ich kann mir nicht vorstellen, dass du das schaffst. Oder ich übersehe etwas.
      Wie stellst du denn fest, dass das Programm stehenbleibt?
      Sehe ich nicht so. Man muss nur lang genug drücken, (aber nicht dabei Prellen) sonst fliegt man aus der isr. Die zitierte if-Abfrage ist eigentlich überflüssig.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Dein Programm kann hängen bleiben, wenn zufällig beide isr nacheinander aufgerufen werden und das Hauptprogramm keine wahre if -Abfrage bearbeitet. Du=0 zB. wenn jetzt Rein=1 wird und Raus=1 wird, ist's erledigt. Keine Abfrage wird mehr wahr wo Rein oder Raus zurück gesetzt werden.
      Ein Abhilfe wäre

      BASCOM-Quellcode

      1. Raus_isr0:
      2. A = 0
      3. For A = 1 To 80 'ist taster aktiv ?
      4. Waitus 500
      5. If Isr0 = 1 Then Exit For 'nein Abbruch
      6. Next
      7. Raus = 1
      8. Raus=0
      9. Return
      also in der isr jeweils das andere 'Hin' auf =0 zu setzen. So können nicht beide Richtungen =1 werden.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Guten Morgen und Danke erst mal für die Tipps und Hinweise.
      Der "Taster" ist kein mechanisches Teil sondern der hier
      sick.com/de/de/lichttaster-und…-3/wtb27-3p2411/p/p236356

      Mit den Gosubs das wird ich ändern.

      Die Mehrfachnutzung von A : ist nur eine Zählvariable, sollte ich das besser trennen ?

      Die isr werde ich so ändern, leuchtet ein war mir so noch nicht aufgefallen, da das Programm eigentlich seit Jahren läuft (über eine Zeitschaltuhr)
    • Zu der Variablen 'A':
      Während in der main die verwendet wird, könnte die isr aufgerufen werden, die dann A neu zuweißt und nach dem Rücksprung einen anderen Wert für A hinterlässt, als A vor der isr hatte.

      Die Zeitschaltuhr hat vielleicht das Setzen von 'Rein' und 'Raus' tagsüber verhindert.
      Raum für Notizen

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

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

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()