Sound parallel zu anderen Aktionen

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

    • Sound parallel zu anderen Aktionen

      Hallo,
      ich möchte ein paar Töne abspielen und parallel dazu im 50ms Takt Licht ein und ausschalten.
      Nach dem folgenden Prinzip funktioniert das auch, aber man hört halt den Timer Interrupt.
      Ich denke es bleibt nichts anderes über als den "Sound" von Hand und nicht über den Bascom Befehl zu machen.
      Dann müsste es einfacher sein parallel zum Ton einen Ausgang zu setzen/rücksetzen ohne dass man das hört.
      (Die 50 ms müssen nicht exakt sein)

      Oder übersehe ich da mal wieder was und es geht einfacher?
      Danke im Voraus
      Gruß Climber



      Quellcode

      1. Sub Musik
      2. Start Timer1
      3. Sound Speaker , 261 ,191
      4. Sound Speaker , 294 ,170
      5. Sound Speaker , 331 ,151
      6. Sound Speaker , 349 ,143
      7. Sound Speaker , 787 ,127
      8. Sound Speaker , 787 ,127
      9. Stop Timer1
      10. Flash_1 = 0
      11. End Sub
      12. Isr_Timer1:
      13. Timer1 = Timer1_Preload
      14. Toggle Flash_1
      15. Return
      Alles anzeigen
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • Danke Michael,
      das was Du beschreibst meinte ich mit: "den "Sound" von Hand und nicht über den Bascom Befehl zu machen."
      Das Licht muss nicht genau sein. Es geht um meinen Klingelverstärker. Wenn es klingelt soll einfach am Empfänger
      ein zusätzlicher Ton aktiviert werden und parallel dazu sollen die LEDS blinken. Funktioniert schon, hört sich aber
      nicht sehr elegant an. Der Sound Befehl war halt schön praktisch und einfach. a_224_a22645d4 Mal schauen was ich hin bekommen.
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • Hallo Hero,
      jetzt hast Du mich aber kalt erwischt. "über die HW des Timer1 ein - und auszuschalten" sagte mir erst mal nichts.
      Bin nun auf die Register TCCR1A und TCCR1B gestoßen. So wie ich das verstehe kann also Timer 1 ganz ohne Programm
      Signale über die Pins OC1A (PB1) und OC1B(PB2) ausgeben.

      Das folgende kleine Beispiel lässt tatsächlich PB1 dauerhaft blinken. Cool . Wieder was dazugelernt ! Danke

      Wer genaueres darüber wissen will muss im Datenblatt nach diesen Registern suchen.
      Oder bietet Bascom auch hierfür high level Befehle ??



      Quellcode

      1. TCCR1A = &B01000000 'Pin PB1 /OC1A toggeln kein PWM
      2. TCCR1B = &B00001101 'Timer - Reset bei Compare , Clock/ 1024
      3. Compare1A = 500 'Auslösewert
      P.S. PortB1 muss natürlich als Ausgang deklariert werden
      Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie
    • Ist aber zugegebenermaßen etwas schwierig, dass aus der Hilfe herauszulesen.

      Dein äquivalenter Befehl wäre
      Config Timer1=timer, Prescale=1024, Compare_a = Toggle, Clear_timer=1
      Dabei wird dann auch noch der Port richtig konfiguriert.
      Wobei, wenn du das aus dem DB rausgefunden hast, wirst du es auch aus der Hilfe lesen können.
    • Na - es sind fast 8k der kopf reicht vielleicht?
      Mit timer1 gehts problemlos

      $regfile = "m8def.dat"
      $crystal = 1000000
      $hwstack = 40
      $swstack = 16
      $framesize = 32

      Config Serialin = Buffered , Size = 16 , Bytematch = All
      Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
      Dim Send As String * 16
      Dim Einstr As String * 16 At $60 Overlay
      'Dim Rbef As String * 3 At $63 Overlay ' strings werden 4Byte lang ????
      'Dim Rarg As String * 4 At $66 Overlay
      'Dim Rwert As String * 3 At $6a Overlay ' Vergleiche unmöglich
      Dim Tempstr As String * 3
      Dim Tempst2 As String * 4

      'Config Timer1 = Timer , Prescale = 64 , Compare_a = Toggle, Clear_timer=1
      'Compare1a = 128

      Config Timer2=timer, Prescale=64, Compare = toggle, Clear_timer=1
      'TCCR2 =$1c 'geht auch nicht
      compare2 = 64
      'ocr2=$80 ' =copmare2=128


      Config Base = 0
      Dim Talk As Bit , Neu As Bit , Zin As Bit , Ring As Bit , Ok As Bit , N As Bit
      Dim Ein As Byte , A As Byte , B As Byte , Z As Byte

      Dim T(4) As Byte 'Ost West Vorlauf Boiler
      'Dim Talt(4) As Byte
      Dim Ta(4) As Integer 'Sammeldaten
      Dim Tb(4) As Integer 'Offset
      Dim T5 As Integer , T15 As Integer
      Dim Tmin(4) As Byte
      Dim Tminalt(4) As Byte
      Dim Tmax(4) As Byte
      Dim Tmaxalt(4) As Byte
      Dim Poproz As Byte 'Pumpe Ost Prozent
      Dim Pwproz As Byte 'Pumpe West Prozent
      Dim Polzm As Word 'Pumpe Ost Pro min
      Dim Pwlzm As Word 'Pumpe West pro min
      Dim Polzs As Byte 'Pumpe Ost Pro s
      Dim Pwlzs As Byte 'Pumpe West pro s
      Dim Pglzm As Word 'Pumpen laufzeit m

      Dim So As Byte , Sw As Byte , S As Byte , M As Byte , H As Byte ', F As Byte 'Sekunden
      'Dim M As Word ,
      Dim Temp As Word 'Minuten

      'Porta.0=Kollector Ost , 1=Kol West, 2=Boiler, 3=Vorlauf/ LCD RS
      'Porta.4 =LCD 4 Scl 'Usck,Porta.5 =LCD 5 Miso,Porta.6=LCD 6'Mosi ,Sda

      Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.4 , Db6 = Portd.5 , Db7 = Portb.5 , E = Portb.0 , Rs = Portd.7
      Config Lcd = 16 * 4

      Config Timer0 = Timer , Prescale = 1024

      Timer0 , 2 alias Portd.3 ` ' geht nicht

      'Admux = &B100010 'Aktiviert internen TempSensor ADC8
      Ddrb = $ff
      Ddrc = 0
      Ddrd = $fe
      Pinb = 0
      Pinc = 0
      Pind = 0
      Portd = 2
      Set Pinc.6 'Reset

      Po Alias Portd.2 'Pumpe Ost
      Pw Alias Portd.3 'Pumpe West

      Config Adc = Single , Prescaler = Auto , Reference = Internal '2,56V
      Start Adc
    • anstelle &H $ zu schreiben hat bisher keine Probleme gemacht. Unabhängig vom Rest sollte es funktionieren aber wenn Du Dir die Arbeit antuen wills gerne:

      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 16
      5. $framesize = 32
      6. Config Serialin = Buffered , Size = 16 , Bytematch = All
      7. Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
      8. Dim Send As String * 16
      9. Dim Einstr As String * 16 At $60 Overlay
      10. 'Dim Rbef As String * 3 At $63 Overlay
      11. 'Dim Rarg As String * 4 At $66 Overlay
      12. 'Dim Rwert As String * 3 At $6a Overlay
      13. Dim Tempstr As String * 3
      14. Dim Tempst2 As String * 4
      15. 'Config Timer1 = Timer , Prescale = 64 , Compare_a = Toggle, Clear_timer=1 ', Configuration = Mysetting , Async = On
      16. 'Compare1a = 128
      17. Config Timer2=timer, Prescale=64, Compare = toggle, Clear_timer=1
      18. 'TCCR2 =$34
      19. compare2 = 64
      20. 'ocr2=$80
      21. Config Base = 0
      22. Dim Talk As Bit , Neu As Bit , Zin As Bit , Ring As Bit , Ok As Bit , N As Bit
      23. Dim Ein As Byte , A As Byte , B As Byte , Z As Byte
      24. Dim T(4) As Byte 'Ost West Vorlauf Boiler
      25. 'Dim Talt(4) As Byte
      26. Dim Ta(4) As Integer 'Sammeldaten
      27. Dim Tb(4) As Integer 'Offset
      28. Dim T5 As Integer , T15 As Integer
      29. Dim Tmin(4) As Byte
      30. Dim Tminalt(4) As Byte
      31. Dim Tmax(4) As Byte
      32. Dim Tmaxalt(4) As Byte
      33. Dim Poproz As Byte 'Pumpe Ost Prozent
      34. Dim Pwproz As Byte 'Pumpe West Prozent
      35. Dim Polzm As Word 'Pumpe Ost Pro min
      36. Dim Pwlzm As Word 'Pumpe West pro min
      37. Dim Polzs As Byte 'Pumpe Ost Pro s
      38. Dim Pwlzs As Byte 'Pumpe West pro s
      39. Dim Pglzm As Word 'Pumpen laufzeit m
      40. Dim So As Byte , Sw As Byte , S As Byte , M As Byte , H As Byte ', F As Byte 'Sekunden
      41. 'Dim M As Word ,
      42. Dim Temp As Word 'Minuten
      43. 'Porta.0=Kollector Ost , 1=Kol West, 2=Boiler, 3=Vorlauf/ LCD RS
      44. 'Porta.4 =LCD 4 Scl 'Usck,Porta.5 =LCD 5 Miso,Porta.6=LCD 6'Mosi ,Sda
      45. Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.4 , Db6 = Portd.5 , Db7 = Portb.5 , E = Portb.0 , Rs = Portd.7
      46. Config Lcd = 16 * 4
      47. Config Timer0 = Timer , Prescale = 1024
      48. Timer0 , 2 alias Portd.3
      49. 'Admux = &B100010 'Aktiviert internen TempSensor ADC8
      50. Ddrb = $ff
      51. Ddrc = 0
      52. Ddrd = $fe
      53. Pinb = 0
      54. Pinc = 0
      55. Pind = 0
      56. Portd = 2
      57. Set Pinc.6 'Reset
      58. Po Alias Portd.2 'Pumpe Ost
      59. Pw Alias Portd.3 'Pumpe West
      60. Config Adc = Single , Prescaler = Auto , Reference = Internal '2,56V
      61. Start Adc
      62. Declare Sub Lcd100p(byval S As Byte)
      63. Declare Sub Lcd100m(byval S As Word)
      64. Declare Sub Lcd1000(byval S As Byte)
      65. Declare Sub Lcdproz(p As Byte)
      66. Declare Sub Antwort
      67. Declare Function Pumpproz(byval T As Byte) As Byte
      68. Enable Interrupts
      69. So = 0
      70. Sw = 10
      71. M = 0
      72. Z = 0
      73. For A = 0 To 3
      74. Tmin(a) = 150
      75. Tmax(a) = 0
      76. Next
      77. Polzs = 0
      78. Pwlzs = 0
      79. Pglzm = 0
      80. Tb(0) = 0
      81. Tb(1) = 0
      82. Tb(2) = 0
      83. Tb(3) = 0
      84. Talk = 1
      85. Ring = 1
      86. Initlcd
      87. Do
      88. For A = 0 To 3
      89. Temp = Getadc(a)
      90. If Temp < 290 Then
      91. Ta(a) = 0
      92. Else
      93. If Temp > 540 Then
      94. Ta(a) = Ta(a) + 255
      95. Else
      96. Temp = Temp - 290
      97. Ta(a) = Ta(a) + Temp
      98. End If
      99. End If
      100. Next
      101. If Z >= 4 Then 'Uartwertesequenz
      102. Z = 0
      103. Incr So
      104. Incr Sw
      105. Incr S
      106. If So >= 20 Then
      107. So = 0
      108. Sw = 10
      109. End If
      110. For A = 0 To 3
      111. Shift Ta(a) , Right , 2
      112. Ta(a) = Ta(a) + Tb(a)
      113. T(a) = Ta(a)
      114. If T(a) > Tmax(a) Then Tmax(a) = T(a)
      115. If T(a) < Tmin(a) Then Tmin(a) = T(a)
      116. Ta(a) = 0
      117. Next
      118. End If
      119. If Sw > 20 Then Sw = 0
      120. T5 = T(3) + 5
      121. T15 = T(3) + 15
      122. If T(0) > T5 Then
      123. If T(3) > T(2) Then
      124. If T(0) > T15 Then
      125. Poproz = 10
      126. Else
      127. Poproz = 0
      128. End If
      129. Else
      130. Poproz = Pumpproz(t(0))
      131. End If
      132. Else
      133. Poproz = 0
      134. End If
      135. If So < Poproz Then
      136. Set Po
      137. Incr Polzs
      138. If Polzs > 119 Then
      139. Polzs = 0
      140. Incr Polzm
      141. End If
      142. Else
      143. Reset Po
      144. End If
      145. If T(1) > T5 Then
      146. If T(3) > T(2) Then
      147. If T(1) > T15 Then
      148. Pwproz = Pumpproz(t(1))
      149. Else
      150. Pwproz = 0
      151. End If
      152. Else
      153. Pwproz = Pumpproz(t(1))
      154. End If
      155. Else
      156. Pwproz = 0
      157. End If
      158. If Sw < Pwproz Then
      159. Set Pw
      160. Incr Pwlzs
      161. If Pwlzs > 119 Then
      162. Pwlzs = 0
      163. Incr Pwlzm
      164. End If
      165. Else
      166. Reset Pw
      167. End If
      168. If S >= 60 Then
      169. Incr M
      170. S = 0
      171. If M >= 60 Then
      172. Incr H
      173. M = 0
      174. End If
      175. Initlcd
      176. End If
      177. Locate 1 , 1
      178. Lcd "O"
      179. Call Lcd1000(t(0))
      180. Lcd Chr(223)
      181. Call Lcd1000(tmin(0))
      182. Lcd "/"
      183. Call Lcd1000(tmax(0))
      184. Lcd Chr(223)
      185. Call Lcd100p(poproz)
      186. If Polzm < 10 Then Lcd " "
      187. Lcd Polzm
      188. 'Lcd "m"
      189. Locate 2 , 1
      190. Lcd "W"
      191. Call Lcd1000(t(1))
      192. Lcd Chr(223)
      193. Call Lcd1000(tmin(1))
      194. Lcd "/"
      195. Call Lcd1000(tmax(1))
      196. Lcd Chr(223)
      197. Call Lcd100p(poproz)
      198. If Pwlzm < 10 Then Lcd " "
      199. Lcd Polzm
      200. ' Lcd "m"
      201. Locate 3 , 1
      202. Lcd "V"
      203. Call Lcd1000(t(2))
      204. Lcd Chr(223)
      205. Call Lcd1000(tmin(2))
      206. Lcd "/"
      207. Call Lcd1000(tmax(2))
      208. Lcd Chr(223)
      209. Lcd " "
      210. If Pglzm < 100 Then Lcd " "
      211. If Pglzm < 10 Then Lcd " "
      212. Lcd Pglzm
      213. Lcd "m"
      214. Locate 4 , 1
      215. Lcd "B"
      216. Call Lcd1000(t(3))
      217. Lcd Chr(223)
      218. Call Lcd1000(tmin(3))
      219. Lcd "/"
      220. Call Lcd1000(tmax(3))
      221. Lcd Chr(223)
      222. Lcd " "
      223. Lcd H
      224. Lcd ":"
      225. If M < 10 Then Lcd "0"
      226. Lcd M
      227. Lcd "h"
      228. ' Select Case Uz
      229. ' Case Is = 0
      230. ' Send = "Temp" + Str(z) + "," + Str(t(z))
      231. ' Case Is = 1
      232. ' Send = "Tmin" + Str(z) + "," + Str(tmin(z))
      233. ' Case Is = 2
      234. ' Send = "Tmax" + Str(z) + "," + Str(tmax(z))
      235. ' Case Is = 3
      236. ' Select Case Z
      237. ' Case Is = 0
      238. ' Send = "Lz Po," + Str(polzm)
      239. ' Case Is = 1
      240. ' Send = "Lz Pw," + Str(pwlzm)
      241. ' Case Is = 2
      242. ' Send = "Lz Pg," + Str(pglzm)
      243. ' Case Is = 3
      244. ' Send = "Lz Rg," + Str(m)
      245. ' End Select
      246. ' End Select
      247. ' Send = Chr(13) + Send
      248. ' Print Send
      249. Do
      250. If Zin = 1 Then
      251. Reset Zin
      252. If Ring = 1 Then Print Chr(_rs232inbuf0(ein));
      253. End If
      254. If Neu = 1 Then Antwort
      255. Loop Until Timer0 > 244 '0,25s
      256. Timer0 = 0
      257. Incr Z
      258. Loop
      259. End
      260. Sub Lcd100p(s As Byte)
      261. If S = 10 Then
      262. Lcd "Ein "
      263. Else
      264. If S = 0 Then
      265. Lcd "Aus"
      266. Else
      267. Lcd S
      268. Lcd "0%"
      269. End If
      270. End If
      271. End Sub
      272. Sub Lcd1000(s As Byte)
      273. If S < 10 Then Lcd " "
      274. Lcd S
      275. End Sub
      276. Sub Pumpproz(t As Byte)
      277. Local P As Byte
      278. P = T - T(2) '
      279. P = P - 5
      280. If P > 10 Then P = 10
      281. Pumpproz = P
      282. End Sub
      283. Sub Antwort
      284. If Neu = 1 Then
      285. N = 1
      286. If Ein > 8 Then
      287. Tempstr = Left(einstr , 3)
      288. If Tempstr = "id3" Then
      289. Tempstr = Mid(einstr , 4 , 3)
      290. Tempst2 = Mid(einstr , 7 , 4)
      291. Select Case Tempstr 'Tempstr
      292. Case Is = "get" 'Cget
      293. N = 0
      294. Select Case Tempst2
      295. Case Is = "talk"
      296. Send = "Talk = " + Str(talk)
      297. Case Is = "echo"
      298. Send = "Echo = " + Str(ring)
      299. Case Else
      300. N = 1
      301. End Select
      302. Case Is = "set"
      303. N = 0
      304. Select Case Tempst2
      305. Case Is = "talk"
      306. Set Talk
      307. Case Is = "echo"
      308. Set Ring
      309. Case Else
      310. N = 1
      311. End Select
      312. Case Is = "res"
      313. N = 0
      314. Select Case Tempst2
      315. Case Is = "talk"
      316. Reset Talk
      317. Case Is = "echo"
      318. Reset Ring
      319. Case Else
      320. N = 1
      321. End Select
      322. End Select
      323. End If
      324. End If
      325. Neu = 0
      326. Clear Serialin0
      327. If Talk = 1 Then
      328. If N = 1 Then
      329. Send = Send + " Nack"
      330. Else
      331. Send = Send + " Ack"
      332. End If
      333. End If
      334. Print Send
      335. Send = ""
      336. End If
      337. End Sub
      338. Serial0bytereceived:
      339. Ein = _rs_bufcountr0 - 1
      340. Set Zin 'Zin = 1
      341. If Ein > 15 Then Clear Serialin0
      342. If _rs232inbuf0(ein) = Chr(13) Then
      343. Set Neu
      344. End If
      345. Return
      Alles anzeigen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ceperiga () aus folgendem Grund: Code in Codetag gesetzt

    • Pluto25 schrieb:

      aber wenn Du Dir die Arbeit antuen wills gerne:
      nur mal so als Info: Ich helfe gerne und manchmal muss man auch einem User auf den Weg helfen.
      Viele begreifen nicht, dass der Fehler ganz woanders liegen kann und posten nur das, was sie denken, wo es dran liegt (Dunning-Kruger Effekt) und werden dann sarkastisch, wenn man nachbohrt.

      Ich habe dir jetzt so weit geholfen, dass du die Mögklichkeit hast, dass andere User sich dein Programm näher ansehen.
      Die, die nämlich nicht nachfragen und dann auch nicht posten, weil da nichts kommt.

      Bitte denk immer daran, dass wir kein Support-Unternehmen sind sondern lauter private Nerds, die das freiwillig machen und gerne eine Lösung für Probleme finden wollen.

      Aber schön, dass du das Programm gepostet hast, das können sich jetzt die Helfer in ihre IDE laden und Fehlersuche betreiben.
      Wenn du das Programm in Codetags setzt, geht das noch besser.
      Oben in der Leiste im Antwort-Fenster auf dieses Symbol klicken: </>, das ist das 2.von rechts.
      Große Programme gehen natürlich auch als Anhang.
    • Verziehung, das sollte nicht sarkastisch sein, ich finde es eher lästig hunderte Zeilen zu lesen um endlich die Frage zu kennen und dachte das geht anderen auch so. Dann ist mir auch der halbfertige experimentier Code ein bischen peinlich. Timer 1 toggelt bereits beim initlcd daher dachte ich der Rest würde eher lästig als hilfreich sein. Das mir den Tags werde ich demächst beachten - guter Tip - man lernt nie aus.
    • Michael schrieb:

      Wenn du das Programm in Codetags setzt, geht das noch besser.
      Oben in der Leiste im Antwort-Fenster auf dieses Symbol klicken: </>, das ist das 2.von rechts.
      Große Programme gehen natürlich auch als Anhang.
      Hab ich jetzt gemacht, die Länge des Programms ohne Codetag ist im Forum doch recht unübersichtlich.

      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Pluto25 schrieb:

      Config Timer2=timer, Prescale=64, Compare = toggle, Clear_timer=1
      'TCCR2 =$34
      compare2 = 64
      'ocr2=$80
      und wo passiert was, wenn compare2 erreicht wird? Hab' ich noch meine Schönheitsgurken auf den Augen?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Und was soll passieren? Der pin soll zappeln? Ist der ein output? Wo/wie soll timer2 überlaufen, wenn der bei Erreichen von compare auf 0 gesetzt wird (clear timer=1)?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Noch was, ein pin zappelt ja auch nur, wenn man das durch Setzen von Registern enabled. Config timer2=timer macht das nicht, sonst könnte man den pin zu nix mehr verwenden, auch wenn man nur einen interrupt braucht.
      Raum für Notizen

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

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