ASK-Empfänger einlesen?

    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!

    • Hallo!
      Nun bin ich einen riesigen Schritt weiter.

      Als weil danach gefragt wurde...der Testsender sieht so aus:

      BASCOM-Quellcode

      1. 'Einfacher Testsender für ASK-Empfängertest
      2. $regfile = "m328pdef.dat" 'ARUNDIO-NANO Prozessor
      3. $crystal = 16000000 'ARUNDIO-NANO Originalquarz
      4. $hwstack = 40
      5. $swstack = 40
      6. $framesize = 40
      7. $baud = 115200
      8. Config Portb = &B11111111 'Pull Up Deaktiviert (0) oder aktiviert (1)
      9. Config Portc = &B11111110 'Pull Up Deaktiviert (0) oder aktiviert (1)
      10. Config Portd = &B11111111 'Pull Up Deaktiviert (0) oder aktiviert (1)
      11. Ddrb = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
      12. Ddrc = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
      13. Ddrd = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
      14. Dim Paket1(21) as Word
      15. Dim Paket2(29) as Word
      16. Dim N as byte
      17. Paket1(1) = &h6666 'Dotting
      18. Paket1(2) = &h6666 'Dotting
      19. Paket1(3) = &h6666 'Dotting
      20. Paket1(4) = &h6666 'Dotting
      21. Paket1(5) = &h9696 'Syncword
      22. Paket1(6) = &h9996 'Paketnummer
      23. Paket1(7) = &h9966 'ID1
      24. Paket1(8) = &h6666 'ID2
      25. Paket1(9) = &h6699 'ID3
      26. Paket1(10) = &h6699 'Kanal
      27. Paket1(11) = &h6996 'RC-Code
      28. Paket1(12) = &h6696 'RC-Code
      29. Paket1(13) = &h6999 'RC-Code
      30. Paket1(14) = &h6999 'Zehntel xx,X°C
      31. Paket1(15) = &h9999 'Einer xX,x°C
      32. Paket1(16) = &h9699 'Zehner Xx,x°C
      33. Paket1(17) = &h9999 'Sign
      34. Paket1(18) = &h6699 'EXOR-CRC
      35. Paket1(19) = &h6999 'EXOR-CRC
      36. Paket1(20) = &h6996 'CRC8
      37. Paket1(21) = &h9699 'CRC8
      38. Paket2(1) = &h6666 'Dotting
      39. Paket2(2) = &h6666 'Dotting
      40. Paket2(3) = &h6666 'Dotting
      41. Paket2(4) = &h6666 'Dotting
      42. Paket2(5) = &h9696 'Syncword
      43. Paket2(6) = &h9996 'Paketnummer
      44. Paket2(7) = &h9966 'ID1
      45. Paket2(8) = &h6666 'ID2
      46. Paket2(9) = &h6699 'ID3
      47. Paket2(10) = &h6699 'Kanal
      48. Paket2(11) = &h6996 'RC-Code
      49. Paket2(12) = &h6696 'RC-Code
      50. Paket2(13) = &h6969 'RC-Code
      51. Paket2(14) = &h6999 'Sekunde Einer
      52. Paket2(15) = &h9999 'Sekunde Zehner
      53. Paket2(16) = &h9699 'Minute Einer
      54. Paket2(17) = &h9999 'Minute Zehner
      55. Paket2(18) = &h6699 'Stunde Einer
      56. Paket2(19) = &h6999 'Stunde Zehner
      57. Paket2(20) = &h6996 'Kalendertag Einer
      58. Paket2(21) = &h9699 'Kalendertag Zehner
      59. Paket2(22) = &h9669 'Monat
      60. Paket2(23) = &h9699 'Wochentag
      61. Paket2(24) = &h6999 'Jahr Einer
      62. Paket2(25) = &h9699 'Jahr Zehner
      63. Paket2(26) = &h9666 'EXOR-CRC?
      64. Paket2(27) = &h6996 'EXOR-CRC?
      65. Paket2(28) = &h9669 'CRC8
      66. Paket2(29) = &h9969 'CRC8
      67. Do
      68. Portc.0 = 0
      69. Print "Starte scheife..."
      70. wait 10
      71. Gosub Send1
      72. wait 10
      73. Gosub Send1
      74. wait 10
      75. Gosub Send1
      76. wait 10
      77. Gosub Send1
      78. wait 10
      79. Gosub Send2
      80. Loop
      81. Send1:
      82. Print "Sende Paket1"
      83. For N = 1 to 21
      84. Shiftout PortC.0, Portc.1, Paket1(N), 0, 16, 240
      85. Next
      86. Print "Paket1 gesendet!"
      87. Portc.0 = 0
      88. Return
      89. Send2:
      90. Print "Sende Paket2"
      91. For N = 1 to 29
      92. Shiftout Portc.0, portc.1, Paket2(N), 0, 16, 240
      93. Next
      94. Print "Paket2 gesendet!"
      95. Portc.0 = 0
      96. Return
      Alles anzeigen


      Dummer weise bleibt nach Shiftout der Pegel des Ausgangspins (PortC.0) auf High kleben, was bei Anschluss des ASK-Senders zu Dauersenden führte.
      Daher muss ich ihn nach jedem Paket wieder auf Low setzen.

      Der Empfänger sieht nun so aus:

      BASCOM-Quellcode

      1. 'ARUDINO-NANO auf Steckbrett mit 433MHz ASK-Empfänger RXB6
      2. 'Evaluation eines ASK-Empfängers zur Langzeitdoku über UART
      3. 'Datenquelle an PB0 ist ein Testgenerator welcher die Sensorpakete originalgetreu via Shiftout ausgibt.
      4. $regfile = "m328pdef.dat" 'ARUNDIO-NANO Prozessor
      5. $crystal = 16000000 'ARUNDIO-NANO Originalquarz
      6. $hwstack = 40
      7. $swstack = 40
      8. $framesize = 40
      9. $baud = 115200
      10. Config Portb = &B11111110 'Pull Up Deaktiviert (0) oder aktiviert (1)
      11. Config Portc = &B11111111 'Pull Up Deaktiviert (0) oder aktiviert (1)
      12. Config Portd = &B11111111 'Pull Up Deaktiviert (0) oder aktiviert (1)
      13. Ddrb = &B11111110 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
      14. Ddrc = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
      15. Ddrd = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
      16. Dim RXword as Word
      17. Dim RXwordpacket(255) as Word
      18. Dim Rxbitpacket(255) as Byte
      19. Dim PacketA(26) as Byte
      20. Dim PacketB(26) as Byte
      21. Dim Pulse as Word
      22. Dim Pulse_neu as Word
      23. Dim Pulse_alt as Word
      24. Dim bitcount as Byte
      25. Dim bytecount as Byte
      26. Dim Wordcount as Byte
      27. Dim Pegel as Bit
      28. Dim Pegel1 as Bit
      29. Dim Newbit as Bit
      30. Dim Status as Byte
      31. Dim Bittime as Byte
      32. Dim Newpacket as Bit
      33. Dim HL as Bit
      34. bitcount = 0
      35. Status = 0
      36. Config Timer1 = Timer, Prescale = 64, Noise_Cancel = 1, Capture_EDGE = RISING 'müssten 4µs (250kHz) sein.
      37. timsk1 =&b00100000 'Input Capture Int Enable
      38. On ICP1 ASKvalidierung
      39. enable interrupts
      40. Print "Start..."
      41. Wordcount = 1
      42. Do
      43. If Status = 0 then Gosub Error 'Fehler, alles löschen
      44. If Status = 1 then gosub Push1 'Ein gültiges Bit gefunden
      45. If Status = 2 then gosub Push2 'Zwei gültige Bits gefunden
      46. If Newpacket = 1 and Wordcount > 22 then 'Wenn ungültiges Bit am Paketende und min. 22 Wörter empfangen wurden
      47. stop Timer1
      48. Print "Stoppe Timer, gebe Array aus:"
      49. For Wordcount = 1 to 25
      50. Print Bin(RXwordpacket(Wordcount))
      51. next
      52. Newpacket = 0
      53. Print "Starte Timer"
      54. Wordcount = 1
      55. Start Timer1
      56. end if
      57. Loop
      58. ASKvalidierung:
      59. Pulse_neu = ICR1
      60. Pegel1 = TCCR1B.6
      61. Toggle TCCR1B.6
      62. Pulse = Pulse_neu - Pulse_alt
      63. Pulse_alt = Pulse_neu
      64. Pegel = not Pegel1
      65. select case Pulse
      66. Case 110 to 130 : Status = 1 'Ein Bit gefunden
      67. Case 220 to 260 : Status = 2 'Zwei Bit gefunden
      68. Case 131 to 219 : Status = 0 'Ungültiges Bit
      69. Case is < 110: Status = 0 'Ungültiges Bit
      70. Case is > 260: Status = 0 'Ungültiges Bit
      71. End Select
      72. Return
      73. Push1: 'ein gültiges Bit in Buffer schieben
      74. Shift RXword, left, 1
      75. RXword.0 = Pegel
      76. Bitcount = Bitcount + 1
      77. Newbit = 0
      78. Bittime = 0
      79. Status = 3
      80. Gosub Nextword 'Prüfung Wortsync oder Word voll
      81. Return
      82. Push2: 'zwei gültige Bits in Buffer schieben.
      83. Shift RXword, left, 1 'Erstes Bit
      84. Rxword.0 = Pegel 'Setzen
      85. Bitcount = Bitcount + 1
      86. Status = 3
      87. Gosub nextword 'Prüfeung Wortsync oder Wort voll
      88. Shift Rxword, left, 1 'Zweites Bit
      89. Rxword.0 = Pegel 'Setzen
      90. Bitcount = Bitcount + 1
      91. Newbit = 0
      92. Status = 4
      93. Gosub Nextword
      94. Return
      95. Error: 'Wenn Fehler, alles Löschen
      96. Bitcount = 0
      97. Wordcount = 1
      98. Newbit = 0
      99. Newpacket = 1 'Wenn gültige Wörter empfangen wurden, an Hauptschleife melden
      100. Return
      101. nextword:
      102. If Wordcount = 1 and RXword = &h9696 then 'Wenn Array noch auf Index 1 und Syncwort gefunden,
      103. Status = 5
      104. RXwordpacket(1) = RXword 'Syncword in Index 1 schreiben
      105. Wordcount = 2 'nachfolgendes Wort in Index 2 schieben
      106. Bitcount = 0
      107. end if
      108. If Wordcount > 1 and Bitcount = 16 then 'Ist Wort voll,
      109. RXwordpacket(Wordcount) = RXword 'Ins Array schreiben
      110. Wordcount = Wordcount + 1 'Index weiter schalten
      111. Bitcount = 0
      112. RXwordpacket(Wordcount) = 0 'aktuellen Index von Altdaten befreien
      113. end if
      114. Return
      Alles anzeigen

      Muss ich morgen erst mal entschlacken. Nach so viel Versuchen sind da etliche Müllfragmente drin.

      ASK Sender oder Empfänger habe ich da noch nicht zwischen.
      Sondern der Sender (PortC.0) hängt direkt am Empfänger-NANO am Input-Capture (PinB.0).

      Und endlich, die Bits kamen erstmals fehlerfrei so an wie sie gesendet wurden.
      Jedoch anfangs dummer weise alles um 1Bit voreilend.
      Die Präamble heißt nämlich h6666, also b0110011001100110.
      Der Empfänger landete immer auf hCCCC also b1100110011001100.
      Tut aber nicht weh.
      Der Empfangsbuffer RXword wird so lange mit gültigen Bits gefüllt, bis die Bedingung in Zeile 125 erreicht ist.
      Also Empfangsarray noch leer (noch nix empfangen) und Syncword erstmals erkannt.
      Ab dort wird das Array gefüllt.

      Bis jetzt sehen die Ausgaben gut aus...bislang ohne fehlerhaftes Bit.
      Hoffe das bleibt so.

      Jürgen
    • Hallo Jürgen,
      hier mal ein ganz simples Programm mit dem du ein absolut sauberes Signal für den ASK Testsender erzeugen kannst. Wenn ich das bei MCS richtig lese, hast du ja noch kein gutes Programm dafür.
      Es verwendet als Input allerdings die Originaldaten und nicht die schon von Hand umgerechneten Manchester Code Werte. Damit ist es doch viel einfacher, mal verschiedene Daten zu prüfen.
      Vielleicht hilft es dir ja noch.

      BASCOM-Quellcode

      1. 'kleines programm zur Erzeugung eines manchester codierten ausgangssignals
      2. 'bit länge ist hier 960µs, ist aber durch ändern des Wertes von bit_length in weiten grenzen änderbar
      3. 'manchester wird erzeugt, indem für eine 0 der compare match auf clear down (also set beim hochzählen)
      4. ' und für eine 1 der compare match auf clear up (also reset beim hochzählen) gesetzt wird
      5. 'benutzt wird fast pwm mit ICR1 als Obergrenze und OCR1A als Umschaltzeitpunkt
      6. 'werte fürs nächste bit werden in der compare1a ISR gesetzt, also dann, wenn umgeschaltet wird.
      7. 'angewendet wird dieser Wert dann erst für die nächste periode
      8. $regfile = "m16def.dat"
      9. $crystal = 20000000
      10. $hwstack = 40
      11. $swstack = 40
      12. $framesize = 40
      13. $baud = 115200
      14. Const Bit_length = 960
      15. Const Icr = Int(bit_length * _xtal / 1000000) - 1
      16. Const Ocr = Int(icr / 2)
      17. Config Base = 0
      18. Signal Alias Portd.5 'OC1A Ausgang
      19. Config Signal = Output
      20. Dim Paket1(14) As Byte
      21. Dim I As Byte , J As Byte
      22. Paket1(0) = &H55
      23. Paket1(1) = &H55
      24. Paket1(2) = &H55
      25. Paket1(3) = &H55
      26. Paket1(4) = &H99
      27. Paket1(5) = &HA9
      28. Paket1(6) = &HA5
      29. Paket1(7) = &H55
      30. Paket1(8) = &H5A
      31. Paket1(9) = &H5A
      32. Paket1(10) = &H69
      33. Paket1(11) = &H59
      34. Paket1(12) = &H6A
      35. Paket1(13) = &H6A
      36. Icr1 = Icr '960µs Periode
      37. Ocr1a = Ocr 'high/low oder low/high
      38. Tccr1a.wgm10 = 0 'mode 14: Fast PWM mit Top=ICR1, umschalten bei ocr1a
      39. Tccr1a.wgm11 = 1
      40. Tccr1b.wgm12 = 1
      41. Tccr1b.wgm13 = 1
      42. Tccr1a.com1a1 = 1 ' ___ ___
      43. Tccr1a.com1a0 = Not Paket1(0).7 '0= ___| 1= |___
      44. Tccr1b.cs10 = 1 'start timer1
      45. On Compare1a Cmp1a_isr Nosave 'nosave, weil in der Main Loop eh nichts gemacht wird
      46. Enable Compare1a
      47. J = 6
      48. Enable Interrupts
      49. Do
      50. Loop
      51. End
      52. Cmp1a_isr:
      53. Tccr1a.com1a0 = Not Paket1(i).j 'neuer Wert wird beim Rücksetzen des Timers (bei erreichen von ICR1) gesetzt
      54. If J = 0 Then 'nächstes Byte
      55. J = 8
      56. Incr I
      57. If I = 14 Then I = 0 'von vorne
      58. End If
      59. Decr J 'nächstes bit
      60. Return
      Alles anzeigen