RFM 12 Kommunikation

    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!

    • RFM 12 Kommunikation

      Hier ein kurzes Beispiel zur Kommunikation zwischen 2 RFM12 Funkmodulen, 833 MHz.
      Die 433MHz Module müssen entsprechend die Einstellung für 433MHz haben (logisch)
      Die beiden Module wurden hier benutzt, um die Pulse eines Ferraris-Stromzählers zu übertragen.
      Der Slave mit Atmega8 hat dafür einen Infrarotsensor, der auf die Kante der Scheibe leuchtet, ein Phototransistor erfasst den Moment, wenn die Markierung vorbei kommt.
      Dazu habe ich ein Sück 6mm Plexigals mit 2 Löchern versehen und dort die beiden Sensorbauteile rein gesteckt, der Phototransistor hat ein kleines schwarzes Röhrchen, damit er kein Fremdlicht bekommt.
      Aus der Dauer zwischen 2 Markierungen lässt sich die aktuelle Leistung (vulgo Stromverbrauch) berechnen und natürlich die aufgelaufene Energie.
      Bei 75U/kWh sind z.B. bei 20 Sekunden für einen Umlauf eine Leistung von 2,4 kW

      Masterprogramm:

      BASCOM-Quellcode: RFM12_Master_web.bas

      1. 'Programm RFM12_Master_web.bas
      2. 'RFM12 868 Transceiver mit Soft SPI
      3. 'Grafikdisplay Pollin 128x64 SED
      4. 'Sendet Anfragen über RFM12 und empfängt Zählerimpulse von einem Ferraris-Zähler
      5. 'Creative Commons Lizens
      6. 'Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0
      7. 'http://creativecommons.org/licenses/by-nc-sa/3.0/de/
      8. '
      9. 'Michael bascomforum.de
      10. 'Holli bascom-forum.de
      11. $regfile = "m16def.dat"
      12. $crystal = 8000000
      13. $hwstack = 64
      14. $swstack = 64
      15. $framesize = 80
      16. '******************************************************************************
      17. $lib "glcdSED1520.lbx"
      18. Nsel Alias Portd.0
      19. Sdi Alias Portd.2
      20. Sdo Alias Pind.3
      21. Sck Alias Portd.1
      22. Rfm_reset Alias Portc.3
      23. Config Rfm_reset = Output
      24. Rfm_reset = 0
      25. Dim D As Word
      26. Dim Data_in(10) As Byte
      27. Dim Eingang(7) As Byte
      28. Dim Ausgang(7) As Byte
      29. Dim Neustartbit As Bit
      30. Neustartbit = 1
      31. Dim N As Byte
      32. Dim T As Word
      33. Dim Nspi As Integer
      34. Dim Dspi As Integer
      35. Dim Dsdo As Word
      36. Dim Temp As Byte
      37. Dim Z_speicher As Word
      38. Dim Z1speicher As Word
      39. Declare Sub Send_rfm12
      40. Declare Sub Receive_rfm12
      41. Declare Sub Wait_rfm12
      42. Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
      43. Config Clock = Soft , Gosub = Sectic
      44. Compare1a = 127
      45. Compare1b = 127
      46. Led Alias Portc.5
      47. Config Led = Output
      48. Led2 Alias Portc.4
      49. Config Led2 = Output
      50. Led = 1
      51. Waitms 500
      52. Led = 0
      53. Waitms 500
      54. Led = 1
      55. Portd.6 = 1
      56. Config Pind.4 = Output
      57. Config Pind.5 = Output
      58. Res Alias Portb.4
      59. Config Res = Output
      60. Res = 1
      61. Waitms 50
      62. Led = 1
      63. Waitms 100
      64. Led = 0
      65. Res = 0
      66. Waitms 100
      67. Led = 1
      68. Waitms 100
      69. Led = 0
      70. Waitms 100
      71. Led = 1
      72. Res = 1
      73. Waitms 50
      74. Config Nsel = Output
      75. Config Sdi = Output
      76. Config Sck = Output
      77. Enable Interrupts
      78. Dim Neusec As Bit
      79. Dim Z_string As String * 8
      80. Dim Fffz As Word
      81. Dim Ffez As Word
      82. Dim Timeout As Word
      83. Dim Debugz As Word
      84. Config Rfm_reset = Input
      85. Rfm_reset = 1
      86. Waitms 20
      87. Gosub Initrfm12
      88. Led2 = 1
      89. Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portb , Ce = 3 , Ce2 = 2 , Cd = 1 , Rd = 0
      90. Cls
      91. Glcdcmd &HAE ' , 1 ': Glcdcmd &H3E , 2 ' both displays off
      92. Glcdcmd &HAF ', 1 ': Glcdcmd &H3F , 2 'both on
      93. Led2 = 0
      94. '*******************************************************************************
      95. 'Waitms 100
      96. Setfont My6_8
      97. Dim X As Byte
      98. Dim Richtung As Bit
      99. Dim A As Byte
      100. Dim Empfang As Byte
      101. Dim Lcdflag As Bit
      102. Dim Crcbyte As Byte
      103. Dim Zaehler As Word
      104. Dim Status As Byte
      105. Dim Wdz As Word
      106. Dim Zaehlerstand As Word
      107. Dim Zaehlerst_alt As Word
      108. Dim Tempw As Word
      109. Dim Periode As Word
      110. Dim Leistung As Word
      111. Dim Intervall As Word
      112. Anfrage Alias Status.0
      113. Const Startbyte = &HAA
      114. Const Zieladresse = 12
      115. Const Sendeadresse = 11
      116. Const Laenge = 6
      117. Dim Ausgabe As String * 20
      118. Dim Wh As Word
      119. Dim Nurregister As Bit
      120. Setfont My6_8
      121. Cls
      122. Lcdat 2 , 1 , "V RFM12_Master_web" , 0
      123. Waitms 300
      124. Cls
      125. D = &H82C8 : Gosub Wert 'Empfang einschalten
      126. D = &HCA93 : Gosub Wert 'warten auf 2DD4,dann SDO=1
      127. Zaehlerstand = 1
      128. Leistung = 500
      129. Periode = 100
      130. Lcdflag = 1
      131. '----------------------------------------------------------------------------------
      132. '----------------------------------------------------------------------------------
      133. Wdz = 1
      134. Do
      135. If Neusec = 1 Then
      136. Neusec = 0
      137. Ausgang(1) = Startbyte
      138. Ausgang(2) = Sendeadresse
      139. Ausgang(3) = Zieladresse
      140. Ausgang(3).7 = Neustartbit
      141. Ausgang(4) = Eingang(4)
      142. Ausgang(5) = Eingang(5)
      143. Ausgang(6) = Crc8(ausgang(1) , 5)
      144. Tempw = Eingang(4) And &H0F
      145. Tempw = Tempw * 256
      146. Tempw = Tempw + Eingang(5)
      147. Eingang(4) = 0
      148. Eingang(5) = 0
      149. Zaehlerstand = Zaehlerstand + Tempw
      150. Send_rfm12
      151. D = &H82C8 : Gosub Wert 'Empfang einschalten
      152. Lcdflag = 1
      153. Neustartbit = 0
      154. Else 'Receive_rfm12
      155. If Pind.6 = 0 Then
      156. Timeout = 1000
      157. D = &H0000 : Gosub Wert
      158. If D.9 = 0 Then
      159. Incr Fffz
      160. Else
      161. Incr Ffez
      162. End If
      163. Receive_rfm12
      164. Incr Empfang
      165. If Empfang > 6 Then
      166. Led = 1
      167. D = &H8208 : Gosub Wert
      168. D = &H0000 : Gosub Wert 'Statusregister lesen zum Resetten des Power on Flags
      169. Z1speicher = D
      170. D = &H82C8 : Gosub Wert 'Empfang einschalten
      171. Empfang = 0
      172. Lcdflag = 1
      173. Crcbyte = Crc8(data_in(1) , 5)
      174. If Crcbyte = Data_in(6) Then
      175. Eingang(1) = Data_in(1)
      176. Eingang(2) = Data_in(2)
      177. Eingang(3) = Data_in(3)
      178. Eingang(4) = Data_in(4)
      179. Eingang(5) = Data_in(5)
      180. Eingang(6) = Data_in(6)
      181. Eingang(7) = Data_in(7)
      182. End If
      183. End If
      184. End If
      185. End If
      186. If Timeout > 0 Then
      187. Decr Timeout
      188. Waitus 5
      189. Else
      190. Led = 0
      191. Empfang = 0
      192. End If
      193. If Lcdflag = 1 Then
      194. Led2 = 1
      195. If Zaehlerstand <> Zaehlerst_alt Then
      196. Intervall = Periode
      197. Periode = 0
      198. End If
      199. Zaehlerst_alt = Zaehlerstand
      200. If Intervall > 0 Then
      201. Leistung = 48000 / Intervall
      202. End If
      203. Lcdflag = 0
      204. Crcbyte = Crc8(data_in(1) , 5)
      205. Setfont My6_8
      206. 'Lcdat 1 , 1 , Hex(data_in(1)) ; Hex(data_in(2)) ; Hex(data_in(3)) ; Hex(data_in(4)) ; Hex(data_in(5)) ; Hex(data_in(6)) ; Hex(data_in(7)) ; " " ; Hex(crcbyte)
      207. Lcdat 1 , 1 , Hex(eingang(2)) ; Hex(eingang(3)) ; Hex(eingang(4)) ; Hex(eingang(5)) ; Hex(eingang(6))
      208. Lcdat 2 , 1 , Hex(ausgang(2)) ; Hex(ausgang(3)) ; Hex(ausgang(4)) ; Hex(ausgang(5)) ; Hex(ausgang(6)) '"FEDCBA9876543210"
      209. Lcdat 3 , 1 , Leistung ; " Watt " ; Time$ ; " "
      210. Ausgabe = ""
      211. If Zaehlerstand < 1000 Then Ausgabe = Ausgabe + " "
      212. If Zaehlerstand < 100 Then Ausgabe = Ausgabe + " "
      213. If Zaehlerstand < 10 Then Ausgabe = Ausgabe + " "
      214. Ausgabe = Ausgabe + Str(zaehlerstand)
      215. Ausgabe = Ausgabe + " "
      216. Wh = Zaehlerstand * 4
      217. Wh = Wh / 300
      218. If Wh < 100 Then Ausgabe = Ausgabe + " "
      219. If Wh < 10 Then Ausgabe = Ausgabe + " "
      220. Ausgabe = Ausgabe + Str(wh) + ","
      221. Wh = Zaehlerstand * 4
      222. Wh = Wh / 3
      223. Wh = Wh Mod 100
      224. If Wh < 10 Then Ausgabe = Ausgabe + "0"
      225. Ausgabe = Ausgabe + Str(wh) + "kWh"
      226. Lcdat 4 , 1 , Ausgabe
      227. Setfont My12_16
      228. Ausgabe = Str(leistung) + "W "
      229. Lcdat 1 , 64 , Ausgabe
      230. ' Lcdat 4 , 1 , Debugz ; " " ; Ffez ; " " ; Fffz ; " Z " ; Zaehlerstand
      231. Led2 = 0
      232. End If
      233. Incr Wdz
      234. Loop
      235. End
      236. $include "C:\Users\xxxx\Eigene Dateien\Bascom\my12_16.font"
      237. $include "C:\Users\xxxx\Eigene Dateien\Bascom\my6_8.font"
      238. Start:
      239. Receive_rfm12 'Daten empfangen,in tabelle schreiben
      240. ' If Data_in(1) <> 1 Then Goto Start 'wenn 1. Byte=1 dann weiter(z.B. Adresse)
      241. Waitms 100 'kurz warten
      242. Send_rfm12 'Daten zurücksenden
      243. Return
      244. '----------------------------------------------------------------------------------------------------------------
      245. Sub Send_rfm12:
      246. D = &H8238 : Gosub Wert
      247. Wait_rfm12
      248. If Nurregister = 1 Then Goto Endsend
      249. D = &HB8AA : Gosub Wert
      250. Wait_rfm12
      251. D = &HB8AA : Gosub Wert
      252. Wait_rfm12
      253. D = &HB8AA : Gosub Wert
      254. Wait_rfm12
      255. D = &HB82D : Gosub Wert
      256. Wait_rfm12
      257. D = &HB8D4 : Gosub Wert
      258. For N = 1 To 6
      259. Wait_rfm12
      260. D = &HB800 + Ausgang(n) : Gosub Wert
      261. Next N
      262. Wait_rfm12
      263. D = &HB8AA : Gosub Wert
      264. Wait_rfm12
      265. D = &HB8AA : Gosub Wert
      266. Wait_rfm12
      267. Endsend:
      268. Nurregister = 0
      269. D = &H8208 : Gosub Wert
      270. End Sub
      271. Sub Wait_rfm12
      272. Nsel = 0
      273. Do
      274. 'Led2 = 1
      275. Loop Until Sdo = 1
      276. 'Led2 = 0
      277. End Sub
      278. Sub Receive_rfm12
      279. D = &HB000 : Gosub Wert 'Seriell-Parralel
      280. Data_in(empfang + 1) = D 'in Empfangspuffer schreiben
      281. End Sub
      282. Wert:
      283. Incr Debugz
      284. Nsel = 0
      285. Dsdo = 0
      286. For Nspi = 1 To 16
      287. Dspi = D And &H8000
      288. If Dspi = 0 Then
      289. Sdi = 0
      290. Else
      291. Sdi = 1
      292. End If
      293. D = D * 2
      294. Dsdo = Dsdo * 2
      295. Dsdo = Dsdo + Sdo
      296. Sck = 1
      297. Waitus 5
      298. Sck = 0
      299. Next Nspi
      300. Nsel = 1
      301. D = Dsdo
      302. Return
      303. Initrfm12:
      304. Nsel = 1
      305. Sck = 0
      306. D = &H0000 : Gosub Wert
      307. 'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
      308. D = &H80E7 : Gosub Wert ' El , Ef , 11.5pf, 868 MHz band
      309. D = &H82D9 : Gosub Wert '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
      310. D = &HA67C : Gosub Wert ' 434,15 MHz / 868,3 MHz
      311. D = &HC647 : Gosub Wert ' 4.8kbps
      312. 'D = &HC612 : Gosub Wert ' 19.2kbps
      313. 'D = &H94A4 : Gosub Wert ' Vdi , Fast , 134 kHz , 0db , -79dbm
      314. D = &H9427 : Gosub Wert
      315. D = &HC2AC : Gosub Wert ' Al , !ml , Dig , Dqd4
      316. D = &HCA81 : Gosub Wert ' Fifo8 , Sync , !ff , Dr
      317. D = &HC483 : Gosub Wert ' @pwr , No Rstric , !st , !fi , Oe , En
      318. D = &H9850 : Gosub Wert ' 90 kHz , power - 0 dB
      319. D = &HE000 : Gosub Wert '
      320. D = &HC800 : Gosub Wert '
      321. D = &HC000 : Gosub Wert ' 1 MHz , 2.2V
      322. 'D = &HC060 : Gosub Wert ' 2 MHz , 2.2V
      323. 'D = &HC0C0 : Gosub Wert ' 5 MHz , 2.2V
      324. D = 1660 + &HA000 : Gosub Wert 'Frequenz einstellen 868,3 MHz
      325. ' (868,3-860)/0,005 = 1660 ,muß aber > 96 und < 3903 sein
      326. D = &H0000 : Gosub Wert 'Statusregister lesen zum Resetten des Power on Flags
      327. Nurregister = 1
      328. Send_rfm12
      329. Return
      330. Sectic:
      331. ' Toggle Led
      332. Neusec = 1
      333. Incr Periode
      334. If Wdz > 0 Then
      335. Wdz = 0
      336. Else
      337. Config Rfm_reset = Output
      338. Rfm_reset = 0
      339. Waitms 10
      340. Config Rfm_reset = Input
      341. Rfm_reset = 1
      342. Waitms 20
      343. Gosub Initrfm12
      344. End If
      345. Return
      Alles anzeigen

      Slaveprogramm:

      BASCOM-Quellcode: RFM12_SlaveM8_web.bas

      1. 'Programm RFM12_SlaveM8_web.bas
      2. 'RFM12 868 Transceiver mit Soft SPI
      3. 'Empfängt Anfragen über RFM12 und sendet aufgenommene Zählerimpulse von einem Ferraris-Zähler
      4. 'Creative Commons Lizens
      5. 'Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0
      6. 'http://creativecommons.org/licenses/by-nc-sa/3.0/de/
      7. '
      8. 'Michael bascomforum.de
      9. 'Holli bascom-forum.de
      10. $regfile = "m8def.dat"
      11. $crystal = 16000000
      12. $hwstack = 72
      13. $swstack = 72
      14. $framesize = 80
      15. $baud = 38400
      16. Config Timer1 = Timer , Prescale = 256
      17. On Timer1 T1irq
      18. Enable Timer1
      19. Enable Interrupts
      20. Led Alias Portb.5
      21. Config Led = Output
      22. Led2 Alias Portc.0
      23. Config Led2 = Output
      24. Nsel Alias Portd.3
      25. Sdi Alias Portc.5
      26. Sdo Alias Pind.4
      27. Sck Alias Portd.2
      28. Rfm_reset Alias Portd.5
      29. Taster Alias Pinc.1 'Optokoppler von Zählermarkierung
      30. Portc.1 = 1
      31. Nirq Alias Pind.6
      32. Config Portc.2 = Output
      33. P_debug Alias Portc.2
      34. Config Nsel = Output
      35. Config Sdi = Output
      36. Config Sck = Output
      37. Config Rfm_reset = Input
      38. Config Watchdog = 2048
      39. Start Watchdog
      40. Reset Watchdog
      41. Dim D As Word
      42. Dim Data_in(10) As Byte
      43. Dim Ausgang(8) As Byte
      44. Dim Eingang(8) As Byte
      45. Dim N As Byte
      46. Dim T As Word
      47. Dim Nspi As Integer
      48. Dim Dspi As Integer
      49. Dim Dsdo As Word
      50. Declare Sub Send_rfm12
      51. Declare Sub Receive_rfm12
      52. Declare Sub Wait_rfm12
      53. Print " Start"
      54. Print " Version 14"
      55. Led = 1
      56. Led2 = 1
      57. Waitms 500
      58. Led = 0
      59. Led2 = 0
      60. Dim Rfminit As Bit
      61. Rfminit = 0
      62. Dim Zaehler As Word
      63. Dim Sendzaehler As Word
      64. Dim Tick As Bit
      65. Dim Wdzaehler As Byte
      66. Dim Led_wd As Byte
      67. Dim Resrfm12 As Bit
      68. Dim Status As Byte
      69. Dim Temp As Word
      70. Dim Empfang_ok As Bit
      71. Dim Rfm_irq As Bit
      72. Dim E_r_wd As Byte
      73. Dim E_z As Byte
      74. Dim Nursenderegister As Bit
      75. 'Dim Test_z As Word
      76. Dim Telegramm_ctr As Word
      77. Dim Telegramm_ctr_alt As Word
      78. Dim Mark As Bit
      79. Dim Time_mmv As Byte
      80. Const Startbyte = &HAA
      81. 'Const Zieladresse = 11
      82. 'Const Sendeadresse = 12
      83. D = &H82C8 : Gosub Wert 'Empfang einschalten
      84. D = &HCA83 : Gosub Wert 'warten auf 2DD4,dann SDO=1
      85. '################################################################################
      86. Do
      87. If Rfminit = 0 Then
      88. Gosub Initrfm12
      89. Rfminit = 1
      90. D = &H82C8 : Gosub Wert 'Empfang einschalten
      91. D = &HCA83 : Gosub Wert 'warten auf 2DD4,dann SDO=1
      92. End If
      93. If Nirq = 0 Then
      94. If E_z = 0 Then
      95. D = &H0000 : Gosub Wert
      96. End If
      97. Rfm_irq = 1
      98. Receive_rfm12
      99. Incr E_z
      100. If E_z > 8 Then
      101. Led2 = 1
      102. D = &H8208 : Gosub Wert
      103. D = &H0000 : Gosub Wert 'Statusregister lesen zum Resetten des Power on Flags
      104. D = &H82C8 : Gosub Wert 'Empfang einschalten
      105. E_z = 0
      106. Empfang_ok = 1
      107. ' For Status = 1 To 8
      108. ' Print Hex(data_in(status));
      109. ' Next
      110. ' Print
      111. Status = Crc8(data_in(1) , 7)
      112. If Status = Data_in(8) Then
      113. Eingang(1) = Data_in(1) 'Startbyte
      114. Eingang(2) = Data_in(2) 'Quelle
      115. Eingang(3) = Data_in(3) 'Ziel
      116. Eingang(4) = Data_in(4) 'Telegrammzähler
      117. Eingang(5) = Data_in(5) 'Telegrammzähler
      118. Eingang(6) = Data_in(6) 'Nutzdaten
      119. Eingang(7) = Data_in(7) 'Nutzdaten
      120. Eingang(8) = Data_in(8) 'CRC8
      121. 'If Eingang(3).7 = 0 Then 'Master Neustart Bit
      122. Temp = Eingang(4) * 256
      123. Temp = Temp + Eingang(5)
      124. Telegramm_ctr = Temp + 1
      125. If Temp = Telegramm_ctr_alt Then
      126. Else
      127. Telegramm_ctr_alt = Temp
      128. Temp = Eingang(6) * 256
      129. Temp = Temp + Eingang(7)
      130. ' Print "Temp " ; Hex(temp)
      131. Zaehler = Zaehler - Temp
      132. End If
      133. 'End If
      134. Led2 = 0
      135. End If
      136. End If
      137. End If
      138. P_debug = Not Taster
      139. If Taster = 1 Then
      140. Time_mmv = 2
      141. End If
      142. If Time_mmv > 0 Then
      143. If Mark = 0 Then
      144. Mark = 1
      145. Incr Zaehler
      146. End If
      147. 'P_debug = 0
      148. Else
      149. Mark = 0
      150. 'P_debug = 1
      151. D = &H0000 : Gosub Wert
      152. End If
      153. If Empfang_ok = 1 Then
      154. D = &H0000 : Gosub Wert
      155. Ausgang(1) = Startbyte
      156. Ausgang(2) = Eingang(3) And &H0F
      157. Ausgang(3) = Eingang(2) 'Zieladresse
      158. Ausgang(4) = High(telegramm_ctr)
      159. Ausgang(5) = Low(telegramm_ctr)
      160. Ausgang(6) = High(zaehler)
      161. Ausgang(7) = Low(zaehler)
      162. Ausgang(8) = Crc8(ausgang(1) , 7)
      163. Waitms 10
      164. Send_rfm12
      165. D = &H82C8 : Gosub Wert 'Empfang einschalten
      166. Empfang_ok = 0
      167. ' Print "gesendet";
      168. ' For Status = 1 To 8
      169. ' Print Hex(ausgang(status));
      170. ' Next
      171. ' Print
      172. 'Test_z = Test_z + &H1000
      173. Waitms 10
      174. End If
      175. Incr Wdzaehler
      176. Loop
      177. End
      178. Tasterauswertung:
      179. Return
      180. '----------------------------------------------------------------------------------------------------------------
      181. Sub Send_rfm12:
      182. D = &H8238 : Gosub Wert
      183. Wait_rfm12
      184. If Nursenderegister = 1 Then Goto S_ende
      185. D = &HB8AA : Gosub Wert
      186. Wait_rfm12
      187. D = &HB8AA : Gosub Wert
      188. Wait_rfm12
      189. D = &HB8AA : Gosub Wert
      190. Wait_rfm12
      191. D = &HB82D : Gosub Wert
      192. Wait_rfm12
      193. D = &HB8D4 : Gosub Wert
      194. ' Wait_rfm12
      195. ' D = &HB8AA : Gosub Wert
      196. For N = 1 To 8
      197. Wait_rfm12
      198. D = &HB800 + Ausgang(n) : Gosub Wert
      199. Next N
      200. Wait_rfm12
      201. D = &HB8AA : Gosub Wert
      202. Wait_rfm12
      203. D = &HB8AA : Gosub Wert
      204. Wait_rfm12
      205. S_ende:
      206. D = &H8208 : Gosub Wert
      207. Nursenderegister = 0
      208. End Sub
      209. Sub Wait_rfm12
      210. Nsel = 0
      211. Do
      212. Led = 1
      213. If Rfminit = 0 Then Exit Do
      214. Loop Until Sdo = 1
      215. Led = 0
      216. End Sub
      217. Sub Receive_rfm12
      218. D = &HB000 : Gosub Wert
      219. Data_in(e_z + 1) = D
      220. End Sub
      221. Wert:
      222. Nsel = 0
      223. Waitus 10
      224. Dsdo = 0
      225. For Nspi = 1 To 16
      226. Dspi = D And &H8000
      227. If Dspi = 0 Then
      228. Sdi = 0
      229. Else
      230. Sdi = 1
      231. End If
      232. D = D * 2
      233. Dsdo = Dsdo * 2
      234. Dsdo = Dsdo + Sdo
      235. Sck = 1
      236. Waitus 5
      237. Sck = 0
      238. Next Nspi
      239. Nsel = 1
      240. D = Dsdo
      241. Return
      242. Initrfm12:
      243. 'Print "- Init -"
      244. Waitms 100
      245. Nsel = 1
      246. Waitus 10
      247. Sck = 0
      248. D = &H0000 : Gosub Wert
      249. 'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
      250. D = &H80E7 : Gosub Wert ' El , Ef , 11.5pf, 868 MHz band
      251. D = &H82D9 : Gosub Wert '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
      252. D = &HA67C : Gosub Wert ' 434,15 MHz / 868,3 MHz
      253. D = &HC647 : Gosub Wert ' 4.8kbps
      254. 'D = &HC612 : Gosub Wert ' 19.2kbps
      255. D = &H94A4 : Gosub Wert ' Vdi , Fast , 134 kHz , 0db , -79dbm
      256. D = &HC2AC : Gosub Wert ' Al , !ml , Dig , Dqd4
      257. D = &HCA11 : Gosub Wert ' Fifo8 , Sync , !ff , Dr
      258. D = &HC483 : Gosub Wert ' @pwr , No Rstric , !st , !fi , Oe , En
      259. D = &H9850 : Gosub Wert ' 90 kHz , power - 0 dB
      260. D = &HE000 : Gosub Wert '
      261. D = &HC800 : Gosub Wert '
      262. D = &HC000 : Gosub Wert ' 1 MHz , 2.2V
      263. D = 1660 + &HA000 : Gosub Wert 'Frequenz einstellen 868,3 MHz
      264. ' (868,3-860)/0,005 = 1660 ,muß aber > 96 und < 3903 sein
      265. D = &H0000 : Gosub Wert
      266. Return
      267. T1irq:
      268. Timer1 = 3036
      269. Reset Watchdog
      270. If Time_mmv > 0 Then Decr Time_mmv
      271. Tick = 1
      272. 'Print "Tick = 1 E_ok=" ; Empfang_ok ; " RfmIRQ=" ; Rfm_irq ; " E_r_wd=" ; E_r_wd ; " Wdz=" ; Wdzaehler
      273. If Empfang_ok = 0 And Rfm_irq = 0 Then
      274. Incr E_r_wd
      275. End If
      276. Rfm_irq = 0
      277. If E_r_wd > 2 Then
      278. E_r_wd = 0
      279. Wdzaehler = 0
      280. End If
      281. If Wdzaehler > 0 Then
      282. Wdzaehler = 0
      283. Else
      284. If Empfang_ok = 1 Then
      285. Config Rfm_reset = Output
      286. Rfm_reset = 0
      287. Waitms 100
      288. Config Rfm_reset = Input
      289. Rfm_reset = 1
      290. Rfminit = 0
      291. 'Gosub Initrfm12
      292. ' Goto 0
      293. Else
      294. Empfang_ok = 1
      295. Nursenderegister = 1
      296. End If
      297. End If
      298. Return
      Alles anzeigen
      StromZsensor.JPG