Vorüberlegungen zu einem 'Sisyphus table'

    • Neu

      Puh, wenn man erstmal alle Fehler macht, die man machen kann und dann ewig braucht, um alle Fehler zu finden und zu beheben, dann braucht man für ein paar Zeilen code 2 Tage. Aber ich hab's vor meinem Lebensende geschafft a_64_3a718cae
      Mein Elektrosandkasten malt, was ich will. Hier das Haus vom Nikolaus. Als Nächstes sind die Bezierkurven dran...
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?
    • Neu

      Michael schrieb:

      nice.
      Wo ist das Programm? ;)
      Na hier:

      BASCOM-Quellcode

      1. 'Elektrosandkasten
      2. $regfile = "m168pdef.dat"
      3. $crystal = 20000000
      4. $hwstack = 234
      5. $swstack = 232
      6. $framesize = 400
      7. 'ports
      8. Config Portd.4 = Output 'step Sonnenrad
      9. Config Portd.5 = Output 'dir Sonnenrad
      10. Config Portd.6 = Output 'step Planetenrad
      11. Config Portd.7 = Output 'dir Planetenrad
      12. 'alias
      13. Step_sonne Alias Portd.4
      14. Step_planet Alias Portd.6
      15. Dir_sonne Alias Portd.5
      16. Dir_planet Alias Portd.7
      17. 'Konstanten
      18. Const Pi = 3.1415927
      19. Const 2pi = Pi * 2
      20. Const Pi_halbe = Pi / 2
      21. Const Microstep = 16 'Einstellung microsteps/fullstep
      22. Const Stepperstep = 200 'Anzahl Vollschritte/U
      23. Const Gear = 190 / 10 'Übersetzung Sonnen/Planetenrad zu Motorritzel
      24. Const Steps_per_u = 60800 'Microstep * Stepperstep * Gear 'steps pro Umdrehung
      25. Const Steps_per_u_minus = -60800 '0 - steps_per_u
      26. Const Steps_per_u_halbe = 30400 'Steps_per_u / 2
      27. Const Steps_per_u_halbe_minus = -30400 '0 - steps_per_u_halbe
      28. Const Steps_per_2pi = 9676.6205 'Steps_per_u /(2 * Pi)
      29. Const Laenge_ausleger = 126.6 'Länge des Auslegers=1/4 des Zeichenflächendurchmessers
      30. Const 2_la_quadrat = 32055.12 '2 *(laenge_ausleger ^ 2)
      31. 'Variablen
      32. Dim Stand_sonne As Long
      33. Dim Step2go_sonne As Long , Step2go_s As Long
      34. Dim Winkel_sonne As Single
      35. Dim Stand_planet As Long
      36. Dim Step2go_planet As Long , Step2go_p As Long
      37. Dim Winkel_planet As Single
      38. Dim Step_s As Long , Step_p As Long
      39. Dim Radius As Single , Winkel As Single
      40. Dim Make_step As Bit
      41. Dim Ready_for_step As Bit
      42. Dim X As Integer , Y As Integer
      43. Dim N As Word
      44. 'timer
      45. Config Timer0 = Timer , Prescale = 256 , Clear_timer = 1
      46. On Compare0a Steppertakt_isr
      47. Enable Compare0a
      48. Start Timer0
      49. Compare0a = 20
      50. Enable Interrupts
      51. 'subs
      52. Declare Sub Fahre_zu_punkt(byval W As Single , Byval R As Single)
      53. Declare Sub Fahre_zu_xy(byval X1 As Single , Byval Y1 As Single)
      54. Declare Sub Linie_zu(byval X1 As Integer , Byval Y1 As Integer )
      55. 'init
      56. Wait 5
      57. X = 0 : Y = 0
      58. Linie_zu -100 , -150
      59. Do
      60. Linie_zu 100 , -150
      61. Linie_zu -100 , 50
      62. Linie_zu 100 , 50
      63. Linie_zu 0 , 150
      64. Linie_zu -100 , 50
      65. Linie_zu -100 , -150
      66. Linie_zu 100 , 50
      67. Linie_zu 100 , -150
      68. Linie_zu -100 , -150
      69. Linie_zu 100 , 50
      70. Linie_zu -100 , 50
      71. Linie_zu 0 , 150
      72. Linie_zu 100 , 50
      73. Linie_zu 100 , -150
      74. Linie_zu -100 , 50
      75. Linie_zu -100 , -150
      76. Loop
      77. 'subs
      78. '-------------------------------------------------------------------------------
      79. ' Bresenham-Algorithm for LINE. nach six1
      80. '-------------------------------------------------------------------------------
      81. Sub Linie_zu(byval X1 As Integer , Byval Y1 As Integer )
      82. Local Dx As Integer , Dy As Integer
      83. Local Adx As Integer , Ady As Integer
      84. Local Sdx As Integer , Sdy As Integer
      85. Local Pdx As Integer , Pdy As Integer
      86. Local Ddx As Integer , Ddy As Integer
      87. Local Es As Integer , El As Integer , I As Integer
      88. Local Error As Integer
      89. Dx = X1 - X
      90. Dy = Y1 - Y
      91. Adx = Abs(dx)
      92. Ady = Abs(dy)
      93. if dx < 0 then
      94. sdx = -1
      95. Else
      96. If Dx = 0 Then
      97. Sdx = 0
      98. else
      99. sdx = 1
      100. End If
      101. End If
      102. If Dy < 0 Then
      103. Sdy = -1
      104. Else
      105. If Dy = 0 Then
      106. Sdy = 0
      107. else
      108. Sdy = 1
      109. End If
      110. End If
      111. If Adx > Ady Then
      112. ' x is fast direction
      113. Pdx = Sdx
      114. Pdy = 0 ' pd. is move in Parall
      115. Ddx = Sdx
      116. Ddy = Sdy ' dd. is move in Diagonal
      117. Es = Ady
      118. El = Adx ' move in error direction
      119. Else
      120. ' y is fast direction
      121. Pdx = 0
      122. Pdy = Sdy
      123. Ddx = Sdx
      124. Ddy = Sdy
      125. Es = Adx
      126. El = Ady
      127. End If
      128. Error = El / 2
      129. For I = 1 To El
      130. Error = Error - Es
      131. If Error < 0 Then
      132. Error = Error + El
      133. X = X + Ddx
      134. Y = Y + Ddy ' move Diagonal
      135. Else
      136. X = X + Pdx
      137. Y = Y + Pdy ' move Parallel
      138. End If
      139. Fahre_zu_xy X , Y
      140. Next
      141. End Sub
      142. Sub Fahre_zu_xy(byval X1 As Single , Byval Y1 As Single)
      143. Local H As Single
      144. Winkel = Atn2(y1 , X1) : If Y1 < 0 Then Winkel = 2pi + Winkel
      145. X1 = X1 * X1 : Y1 = Y1 * Y1 : H = X1 + Y1
      146. Radius = Sqr(h) : If Radius > 250 Then Radius = 250
      147. Fahre_zu_punkt Winkel , Radius
      148. End Sub
      149. Sub Fahre_zu_punkt(byval W As Single , Byval R As Single)
      150. Local W1 As Single 'Winkel in der Spitze gleichschenkligen Dreiecks, Seiten 2x Auslegerlänge, Basis=Radius
      151. '0=max Radius, 180°=Radius=0
      152. Local W2 As Single
      153. Local H As Single , Hh As Single
      154. Local Hs As Long , Hp As Long
      155. 'aktuelle Werte für die aktuelle Stellung
      156. If Stand_planet > Steps_per_u Then Stand_planet = Stand_planet - Steps_per_u
      157. If Stand_planet < 0 Then Stand_planet = Steps_per_u + Stand_planet
      158. H = R / 2_la_quadrat : H = H * R : Hh = 1 -h
      159. W1 = Acos(hh) 'Winkel an der pitze des gleichschenkligen Dreiecks bei Basislänge R
      160. 'Erweiterung des Orbits auf R
      161. Hs = W1 * Steps_per_2pi 'Verdrehung des Auslegers um die Kugel auf Abstand R vom Mittelpunkt zu bekommen
      162. Step_s = Hs - Stand_sonne 'steps, die von der alten Stellung bis zur neuen gebraucht werden
      163. Stand_sonne = Hs 'neuer Stand
      164. 'Verdrehung auf den Winkel W
      165. Hp = W * Steps_per_2pi
      166. Step_p = Hp - Stand_planet
      167. 'Drehrichtung optimieren
      168. If Step_p > Steps_per_u_halbe Then Step_p = Step_p - Steps_per_u
      169. If Step_p < Steps_per_u_halbe_minus Then Step_p = Step_p + Steps_per_u
      170. Stand_planet = Hp 'neuer Stand
      171. Hs = Step_s / 2
      172. Step_p = Step_p - Hs
      173. Step_s = Step_s - step_p
      174. Bitwait Ready_for_step , Set
      175. Step2go_sonne = Step_s
      176. Step2go_planet = Step_p
      177. Ready_for_step = 0
      178. ' Bitwait Ready_for_step , Reset
      179. End Sub
      180. Steppertakt_isr:
      181. If Make_step = 1 Then
      182. 'Sonne
      183. If Step2go_sonne > 0 Then
      184. Dir_sonne = 0
      185. Step_sonne = 1
      186. Decr Step2go_sonne
      187. End If
      188. If Step2go_sonne < 0 Then
      189. Dir_sonne = 1
      190. Step_sonne = 1
      191. Incr Step2go_sonne
      192. End If
      193. 'Planet
      194. If Step2go_planet > 0 Then
      195. Dir_planet = 1
      196. Step_planet = 1
      197. Decr Step2go_planet
      198. End If
      199. If Step2go_planet < 0 Then
      200. Dir_planet = 0
      201. Step_planet = 1
      202. Incr Step2go_planet
      203. End If
      204. Make_step = 0
      205. Else
      206. Step_planet = 0
      207. Step_sonne = 0
      208. Make_step = 1
      209. End If
      210. Compare0a = 20 '__ms Pulslänge
      211. If Step2go_sonne = 0 And Step2go_planet = 0 Then 'alle step sind gemacht
      212. Ready_for_step = 1
      213. Else
      214. Ready_for_step = 0
      215. End If
      216. Return
      Alles anzeigen
      noch schlecht kommentiert :S
      Ich hab' jetzt die Möglichkeit gerade Linien zwischen 2 Punkten(X,Y) zu zeichnen. Unterprogramme positionieren den Magnet auf x,y, bzw auf polare Koordinaten.
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?