Passphrase (hier mal 20 Bytes) über IR-LED an TSOP31xxx

    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!

    • Passphrase (hier mal 20 Bytes) über IR-LED an TSOP31xxx

      Im Zuge einer kleinen Machbarkeitsstudie zu dem Thema "längere Passphrase an FB- Empfänger",
      habe ich das kleine Programm gebastelt, welches das Signal für die Sendeseite generiert.

      Durch die vorhandenen Bauteile ( Empfänger TSOP31240/ also optimiert f. 40Khz und passende IR-diode)
      waren die Rahmenbedingungen abgesteckt.
      20 Bytes! sollen gesendet werden - das sind immerhin ... Moment ...60 + (8 x 20 x 15) = 2460 IR-Impulse.
      15 Impulse/Burst sind lt. Datenblatt des Empfängers schon knapp am unteren Limit.
      Dennoch kommt die Übertragung des Komplettpaketes in einem Rutsch dann schon auf etwas über 120ms.

      nach_TSOP32xxx.jpg


      Sehr schöne Puzzleteile dafür habe ich hier im Forum gefunden (super).
      Zum Glück brachte auch die Kombination aus Timer0 / OCR0A / Quarzfrequenz einen Lösungsansatz hervor,
      welchen ich in groben Zügen auch verstehen konnte

      Der Grundtakt für die IR-LED (bei einem 0815-Quarz -> 16MHz/8/50) ist mit gemessenen 39,78Khz schon mehr als gut.
      Wichtiger sind aber die gewonnenen CPU-Takte Rechenzeit zwischen den Interrupts zum Abarbeiten der IRQs - denke ich -
      knapp 300 evtl? wegen den "waits" ?.

      Trotzdem habe ich versucht, die Senderoutine selbst nicht viel bei der Arbeit zu stören.
      Während des Sendevorgangs sollten ohnehin alle nicht notwendigen Abläufe Pause haben -
      evtl. größere Nebenrechnungen könnten ja vor dem Sendevorgang gemacht werden.

      Quellcode: IR-LED_mit_40kHz.bas

      1. '##############################
      2. $regfile = "m328pdef.dat"
      3. $crystal = 16000000
      4. $hwstack = 25
      5. $swstack = 25
      6. $framesize = 25
      7. Dim Anzahl_impulse As Byte
      8. Dim Eins_oder_null As Byte
      9. Dim Sende_status As Byte
      10. Dim Code As Byte
      11. Dim X As Byte
      12. Dim Y As Byte
      13. Dim Z As Byte
      14. '##################################
      15. Dim Phrasen(5) As Long
      16. Phrasen(1) = &H00000011 ' ein paar Dummy-Daten
      17. Phrasen(2) = &H00000000 '
      18. Phrasen(3) = &H12345678
      19. Phrasen(4) = &HABCDEF00
      20. Phrasen(5) = &H10203040
      21. Dim Schluessel(20) As Byte At Phrasen Overlay ' geht los mit &H11 = &B0001_0001 aus Phrasen(1)
      22. ' nicht ganz verstanden aber herausgefunden
      23. ' in der Uebertragung dann LSB zuerst!
      24. '###############################
      25. Config Portd.2 = Output
      26. Ir_led Alias Portd.2
      27. Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect
      28. Ocr0a = 49 ' f.40KHz- IR- Empfaenger
      29. ' bei 16Mhz / 8 - > dann von 0-49 (50) zaehlen (2MHz /50 -> 40khz >
      30. 'muesste nicht soo genau sein - aber passt eben hier super
      31. On Oc0a Isr_timer0_oc0a ' OC0A-Interrupt konfigurieren
      32. Enable Oc0a ' OC0A-Interrupt zulassen
      33. Enable Interrupts
      34. '##############################
      35. 'ist "0" beim Start - hier fuer den Ueberblick
      36. Sende_status.0 = 0 ' Freigabe zur Uebertragung des Schluessels '
      37. Sende_status.1 = 0 ' Freigabe zum Senden eines Bits des Schluessels
      38. Sende_status.2 = 0 ' Schluessel wurde komplett gesendet
      39. Declare Sub Bits_deklarieren()
      40. Declare Sub Sendung_zusammenstellen()
      41. '##############################
      42. Do
      43. If Sende_status.2 = 1 Then 'Sendung ist raus
      44. Waitms 200
      45. Sende_status = 0 ' alles "null" - zum Test im Moment - spaeter mit Sendetaste z.B. den Prozess in Gang setzen
      46. End If
      47. If Sende_status = 1 Then
      48. Bits_deklarieren
      49. End If
      50. If Sende_status = 0 Then
      51. Sendung_zusammenstellen
      52. Sende_status = 1
      53. End If
      54. Loop
      55. End
      56. '###############################
      57. Sub Bits_deklarieren
      58. Select Case Y
      59. Case 0:
      60. Eins_oder_null = 3 '30 Impulse als Vorspann
      61. Incr Y
      62. Sende_status.1 = 1
      63. Case 1:
      64. Eins_oder_null = 3 'weitere 30 Impulse als Vorspann
      65. Incr Y
      66. Sende_status.1 = 1
      67. Case 2:
      68. Eins_oder_null = 4 ' Pause
      69. Incr Y
      70. Sende_status.1 = 1
      71. Case Else:
      72. Code = Schluessel(y - 2) ' ein Byte aus den 20 Schluesselbytes
      73. If X < 8 Then
      74. Eins_oder_null = Code.x 'die einzelnen Bits aus dem Byte
      75. Sende_status.1 = 1
      76. Incr X
      77. End If
      78. If X = 8 Then
      79. X = 0
      80. Incr Y 'naechste der 20 Bytes
      81. End If
      82. End Select
      83. End Sub
      84. '###############################
      85. Sub Sendung_zusammenstellen
      86. ' hier ist spaeter evtl. mehr zu rechnen (RTC ueber I2C? -> Hash? oder andere Sachen)
      87. Waitms 250
      88. End Sub
      89. '###############################
      90. Isr_timer0_oc0a:
      91. If Sende_status.1 = 1 And Sende_status.2 = 0 Then
      92. Select Case Eins_oder_null
      93. Case 1:
      94. If Anzahl_impulse < 15 Then ' Manchestercode hier f. 1 (erst impulse dann pause)
      95. Set Ir_led
      96. Waitus 5 ' 5us breit bei gesamt 25us (1/40000) -> on-off-Verhaeltnis = 1:4
      97. Reset Ir_led
      98. End If
      99. Case 0:
      100. If Anzahl_impulse > 14 Then ' Manchestercode hier f. 0 (erst pause dann impulse)
      101. Set Ir_led
      102. Waitus 5 ' 5us breit bei gesamt 25us (1/40000) -> on-off-Verhaeltnis = 1:4
      103. Reset Ir_led
      104. End If
      105. Case 3: ' impulse als Vorspann 2 * 30 = 60 Stück
      106. Set Ir_led
      107. Waitus 5
      108. Reset Ir_led
      109. Case 4: 'eine Pause nach dem Vorspann
      110. Anzahl_impulse = Anzahl_impulse + 2
      111. 'dadurch nur eine kurze Pause - gesamt 3 x incr > 10 Ticks
      112. End Select
      113. Incr Anzahl_impulse
      114. If Anzahl_impulse = 30 Then ' sollen ja nur 0 - 29 = 30 Impulse jeweils werden
      115. Anzahl_impulse = 0
      116. Sende_status.1 = 0 ' jetzt koennte das naechste Bit aufgelegt werden
      117. If Y = 23 Then '0,1,2 für den Vorspann 20 Bytes im Anschluss -> 23 ist dann Ende
      118. Y = 0
      119. Sende_status.2 = 1 ' alles ist raus
      120. End If
      121. End If
      122. End If
      123. Return
      124. '###############################
      Alles anzeigen


      Vielleicht hilft es den ein oder anderen für eine Idee oder wenn Manchester- / RC5-/ RC6- Funktionen
      aus Bascom nicht funktionieren oder benutzt werden können.

      MfG
      port

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

    • @Franz

      Hallo Franz,

      Ja - bestimmt sind es diese Register mit den zahlreichen Möglichkeiten Wert,
      dass man sich mal ernsthafter damit beschäftigt.
      Nur die Helligkeit einer LED damit zu regeln - damit ist das Potential noch lange nicht erschöpft.
      Vielleicht fehlt mir im Moment auch etwas Fantasie, die Sachen damit zusammenzubringen.

      Was ich auf keinen Fall erreichen wollte:
      Dass durch eine separate zweite Zeitschleife (asynchron zu den 40Khz) z.B. am Ende mal 16,15 oder 14 Impulse durchrutschen.
      Bei einem anderen Verhältnis (Impulsfolge von einer Sekunde mit 100KHz oder so) hätte ich mir das "Abzählen" (s.u.) bestimmt auch geschenkt.

      Zu dem Programm hier noch mal kurz:

      Die recht genauen 40KHhz wurden ja schon mit Timer0 und Oc0a stressfrei "nebenher" erzeugt.
      Mit einem 80KHz Takt und in der Routine zu toggeln, fand ich nicht besser.
      Ein besseres Tastverhältnis (on/off) und vielleicht eine noch höhere Frequenz / weniger Rechenzeit in der IRQ- Routine,
      wollte ich dann auch nicht. Deshalb hier die nicht sehr schönen "5 waitus", welche aber wohl noch akzeptable sind.

      Auch wenn man es der Interruptroutine nicht gleich so ansieht - hier wird nur ganz wenig pro Durchlauf getan
      (auch in der Funktion : "Bits_deklarieren" - sind es nur sehr wenige Rechenschritte).
      In der IRQ-Routine wird In Abhängigkeit von "Y", "Anzahl_impulse" und Inhalt von "eins_oder_null" pro Durchlauf nur
      ein einziges "Set Ir_led" und nach 5us wieder "Reset Ir-led" generiert (neben der Pflege der Zähler nat.).

      Meine ersten Überlegungen waren:
      Warum nicht gleich diesen genauen Takt des Interrupts dafür nutzen,
      eine Impulsfolge von vielleicht 15 Impulsen durch Aufaddieren zu generieren und damit genau die Länge der Impulsfolge festzulegen.
      Damit kommt der AVR nicht in Schwitzen, auch wenn der Code damit etwas unübersichtlicher wird.

      '-----------------------
      Ich bleibe mal dran.
      Vielleicht fällt der Groschen ja noch bei mir. :/

      MfG
      port

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

    • Ich stehe etwas auf dem Schlauch.

      um in der Geschichte mit dem "Timer/ Compare-Register" etwas dazu zu lernen,
      habe ich mir diese Zeit-/Zählbasis (s.u) auch für die Empfängerseite mal ins Programm gezogen.

      Kann ich im Programm eine Art "Clear Timer" (unabhängig vom Zählerstand) auch selbst auslösen
      (z.B. durch Zustand eines Eingangs) ?
      Mit der Anweisung "Timer0 = 0" werden bildlich gesprochen doch nur die Sek/Min auf "0" gestellt
      und die Stunden (der kompletten Zeitbasis) bleiben z.B. dann noch auf "23"?

      Bei der Untersetzung ( 1:12800) nach dem Vorteiler -
      welches Register zählt hier dann die "50" ab - in dem Zusammenhang kommt man immer auf TCNT0?
      Dieses war doch aber das Zählregister für Timer0 (?)

      '-------------------------------
      Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect

      Ocr0a = 49

      On Oc0a Isr_timer0_oc0a ' OC0A-Interrupt konfigurieren
      Enable Oc0a ' OC0A-Interrupt zulassen
      Stop Timer0 ' zunaechst

      On Pcint1 Ereignis_an_c3 'wenn sich irgendetwas tut am IR- Empfaenger
      Pcmsk1 = &B0000_1000
      Enable Pcint1

      Enable Interrupts

      ' _-----------------------------------

      MfG
      port

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

    • Hallo port,
      ich weiß nicht, wie es den anderen geht, aber ich verstehe deine Frage nicht.
      Dein Vorteiler 1:12800 klingt nach 256*50. Das würde so sein, wenn der Prescale auf 256 stehen würde, bei dir ist er aber 8.
      Vielleicht hast du auch den Vorgang des Compare noch nicht verstanden.
      Da du Clear_Timer=1 angegeben hast, verwendet der Timer den CTC (Clear Timer on Compare match) Modus.
      Dabei zählt der Timer in seinem Zählregister, hier TCNT0, entsprechend dem Systemtakt durch Timer prescale hoch.
      Erreicht TCNT0 den Wert OCR0A, so wird das zugehörige Compare Interrupt Flag gesetzt und ein Interrupt ausgelöst, wenn dieser freigegeben wurde.

      Ist es das, was dir unklar ist?
      Ich verstehe noch nicht, was du mit der Frage nach den Stunden (der kompletten Zeitbasis) meinst.
      Erkläre es einfach noch einmal mit anderen Worten.
    • port schrieb:

      Kann ich im Programm eine Art "Clear Timer" (unabhängig vom Zählerstand) auch selbst auslösen
      Nicht so ohne weiteres. Der Stand kann beliebig geändert werden, Timer0 = 48 würde ein baldiges "Clear" auslösen, jedoch mit unbekannter Verzögerung. (Bei Prescaler=8 zwischen 1 und 7 Takten)

      Möglich ist auch Timer0 = 0 und call Isr_timer0_oc0a

      Dann gibt es noch das FOC0A ,aber da ist mir das Datenblatt unverständlich: ... an immediate Compare Match is forced...(erzeugt sofort ein Compare - aber) ...will not generate any interrupt, nor will it clear the timer (kein Int? , kein Clear? - nutzlos???)
      Das betrifft vermutlich ausschließlich den (hier nicht genutzten ) Ausgangspin ?
    • @Pluto25

      Hallo Pluto,

      Danke für deine Anmerkungen. :)
      Ein paar davon müssen noch etwas auf mich wirken.
      Aus deinem ersten Teil - > wenn Timer0 angehalten wird -> dann "Timer 0" und z.B. bei einem Pin-Change-Interrupt
      dann mit "Start Timer0" wieder gestartet wird, ist eine Verzögerung bestimmt nur minimal (?).

      Ja -ein Ausgangs PIN (z.B. PD6) wird hierfür nicht verwendet -> sondern der "Match- Fall" löst den Interrupt aus.

      '___________________

      @Franz

      Hallo Franz,
      danke auch fürs Mitdenken. :)

      Das muss wohl zunächst abgeheftet werden unter "dumm gelaufen".
      Durch einen Denk-/ Rechenfehler zur "Untersetzung" (Ergebnis dann größer 256) hatte ich mich erst auf die
      Suche nach einem weiteren Zählregister (neben Timer0) gemacht. :rolleyes:

      '-------------------------------

      Generell war mir die Sache mit der Interrupt-Auslösung und das Zurücksetzen beim Stand 50 (in meinem Beispiel) schon klar.
      Dieser Mechanismus läuft auf der Sendeseite ja schon - dort war die Nebenrechnung richtig.
      '___________________

      Der bildliche Vergleich mit den Stunden der Uhr sollte dann nur den "höherwertigen Zähler" darstellen,
      der aber dafür garnicht notwendig ist.
      Wahrscheinlich hatte ich in einem Moment mit wenig Sauerstoff an einen Überlauf von Timer0 gedacht,
      welcher dann in einen weiteren Zähler fällt. ;(

      '___________________

      @Franz
      @Pluto25

      Danke nochmal!

      MfG
      port
    • port schrieb:

      dann "Timer 0" und z.B. bei einem Pin-Change-Interrupt
      dann mit "Start Timer0" wieder gestartet wird, ist eine Verzögerung bestimmt nur minimal (?)
      Das Start arbeitet sofort (2Takte), der Pin-Change-Interrupt benötigt jedoch >55 Takte für den Aufruf (durch das Sichern der Register) . Da kann ein Timer0 = 7 sinnvoll sein. evt auch Timer0 = 14 , der Isr_timer0_oc0a Aufruf braucht ja auch die 55 Takte.

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

    • tsop_neu.jpg


      Den Code für den Sender habe ich zunächst noch mal angepasst.
      Ein zus. definiertes Bit ( "1" ) wird das Auswerten vereinfachen.

      Auch wird die Senderoutine gleichmäßiger belastet durch die generierte Liste
      für die Abfolge der Impulse vor dem Senden.

      Quellcode

      1. '_____________________________
      2. $regfile = "m328pdef.dat"
      3. $crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 40
      6. $framesize = 40
      7. Dim Anzahl_impulse As Byte
      8. Dim Impulse As Bit
      9. Dim Bitwert As Bit
      10. Dim A as byte
      11. Dim Z As Byte
      12. Dim Hilfsbyte As Byte
      13. Dim Sende_status As Byte
      14. Dim Impulslisten_zaehler As word
      15. '_____________________________
      16. Dim Phrasen(5) As Long
      17. Phrasen(1) = &H00000011 'ein paar Dummy-Daten
      18. Phrasen(2) = &H00000000
      19. Phrasen(3) = &H12345678
      20. Phrasen(4) = &HABCDEF00
      21. Phrasen(5) = &H10203040
      22. Dim Schluessel(20) As Byte At Phrasen Overlay 'geht los mit &H11 = &B0001_0001 aus Phrasen(1)
      23. 'in der Uebertragung dann LSB zuerst!
      24. Dim Impulsliste (328) As Byte
      25. Impulsliste (1) = 1
      26. Impulsliste (2) = 1 'die "1" steht spaeter dann für 15 Impulse
      27. Impulsliste (3) = 1
      28. Impulsliste (4) = 1 'die ersten 7 Eintraege für die Taktschablone sind fix
      29. Impulsliste (5) = 0
      30. Impulsliste (6) = 1 'ein zus. Bit als definierten Anfang erleichtert die
      31. Impulsliste (7) = 0 'Auswertung spaeter enorm (hier die "1" als "Manchestercode")
      32. Impulsliste (328) = 0 'die Uebertragung sollte garantiert enden mit "keine Takte mehr"
      33. '_____________________________
      34. Config Portd.2 = Output
      35. Ir_led Alias Portd.2
      36. Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect
      37. Ocr0a = 49 ' f.40KHz- IR- Empfaenger
      38. ' bei 16Mhz / 8 - > dann von 0-49 (50) zaehlen (2MHz /50 -> 40khz >
      39. ' muesste nicht soo genau sein - aber passt eben hier super
      40. On Oc0a Isr_timer0_oc0a ' OC0A-Interrupt konfigurieren
      41. Enable Oc0a ' OC0A-Interrupt zulassen
      42. Enable Interrupts
      43. '_____________________________
      44. 'Sende_status = 0 ' Schablone erstellen (15 Impulse oder keine Impulse)
      45. 'Sende_status = 1 ' Freigabe zur Uebertragung des Schluessels '
      46. 'Sende_status = 2 ' wird nicht ausgewertet - nur um vom Status 1 wegzukommen
      47. 'Sende_status = 3 ' Schluessel wurde komplett gesendet
      48. Declare Sub Impulse_vorlegen()
      49. Declare Sub Sendung_zusammenstellen()
      50. '_____________________________
      51. Do
      52. select case Sende_status
      53. case 1
      54. Impulse_vorlegen
      55. case 0
      56. Sendung_zusammenstellen
      57. Impulslisten_zaehler = 1
      58. Sende_status = 1
      59. case 3
      60. Waitms 200
      61. Sende_status = 0 'spaeter mit Sendetaste z.B. den Prozess in Gang setzen
      62. end select
      63. Loop
      64. End
      65. '_____________________________
      66. Sub Impulse_vorlegen
      67. if Sende_status = 1 then
      68. if Impulslisten_zaehler = 329 then
      69. Sende_status = 3
      70. else
      71. Hilfsbyte = Impulsliste (Impulslisten_zaehler)
      72. impulse = Hilfsbyte.0
      73. incr Impulslisten_zaehler
      74. Sende_status = 2
      75. end if
      76. end if
      77. End Sub
      78. '_____________________________
      79. Sub Sendung_zusammenstellen
      80. Impulslisten_zaehler = 8
      81. For Z = 1 to 20
      82. hilfsbyte = Schluessel(z)
      83. For A = 0 to 7
      84. Bitwert = hilfsbyte.A
      85. If Bitwert = 1 then
      86. Impulsliste (Impulslisten_zaehler) =1
      87. incr Impulslisten_zaehler
      88. Impulsliste (Impulslisten_zaehler) =0
      89. incr Impulslisten_zaehler
      90. else
      91. Impulsliste (Impulslisten_zaehler) =0
      92. incr Impulslisten_zaehler
      93. Impulsliste (Impulslisten_zaehler) =1
      94. incr Impulslisten_zaehler
      95. end if
      96. next A
      97. next Z
      98. Waitms 250
      99. End Sub
      100. '_____________________________
      101. Isr_timer0_oc0a:
      102. if impulse = 1 then
      103. Set Ir_led
      104. Waitus 5 '5us -> on-off-Verhaeltnis = 1:4
      105. Reset Ir_led
      106. end if
      107. Incr Anzahl_impulse
      108. If Anzahl_impulse = 16 Then
      109. Anzahl_impulse = 0
      110. Sende_status = 1 'naechster Abschnitt der Schablone koennte aufgelegt werden
      111. end if
      112. Return
      113. '_____________________________
      Alles anzeigen


      MfG
      port
    • Ergänzend zu dem IR-Sender , die Software für den IR-Empfänger (tsop31240).

      Für den Empfang habe ich eine sehr interessante (mir bisher unbekannte) Funktion benutzt.
      Die Input Capture Funktion des ARVs.
      Diese läuft ausschließlich mit dem Timer1 und zwingend mit dem "ICP1-PIN" des AVRs (hier Portb.0).

      Ihr werdet es bestimmt wissen:

      Bei richtiger Voreinstellung (fallende/steigende Flanke für den ICP1-Eingang) wird vom laufenden Timer1
      eine Art Zwischenzeit ins ICR1- Register kopiert und das Flag "ICF1" (TIFR1.5) gesetzt.
      Für eine Auslösung muss das "ICES1- Bit" ( Tccr1b.6 ) richtig gesetzt werden ( "0" für fallende Flanke).
      Wenn man beide Flanken benötigt, muss man das Register Tccr1b.6 mitpflegen (toggeln).
      Lief zusammen mit dem IR-Sender im Sekundentakt über einige Stunden ohne Probleme.
      ... ohne Interrupt

      Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 40
      4. $swstack = 40
      5. $framesize = 40
      6. Config Portb.0 = Input 'IR-Empfaenger "tsop31240" mit Beschaltung siehe Spec
      7. Portb.0 = 1 'Fuer das Programm erforderlich - der ICP1 des AVRs
      8. 'Das Programm verwendet die "Input Capture Funktion"
      9. 'von Timer1
      10. Config PORTC.3 = Output 'mein Testausgang "1" -> Schluessel passt zum Schloss
      11. Dim Level As Byte
      12. Dim B_byte_zaehler As Byte
      13. Dim C_bit_zaehler As Byte
      14. Dim Hilfsbyte As Byte
      15. Dim x As Byte
      16. Dim y As Byte
      17. Dim alt_temp_word As Word
      18. Dim diff_temp_word As Word
      19. Dim Zustand As Bit
      20. Dim Merke_letzten_Zustand As Bit
      21. Dim Manchester_paar As Bit
      22. Dim Temp_byte As Byte
      23. '--------------------------------
      24. Dim Puffer(327) As Byte
      25. Dim Puffer_x As Word
      26. Puffer_x = 1
      27. '--------------------------------
      28. Dim Schloss_05(5) As Long
      29. Schloss_05(1) = &H00000011 ' die gespeicherte Phrase als Beispiel
      30. Schloss_05(2) = &H00000000 ' normal koennten es gute Zufallsbytes sein
      31. Schloss_05(3) = &H12345678 ' 20 einzelne Bytes waeren sehr unuebersichtlich
      32. Schloss_05(4) = &HABCDEF00 ' beim Schreiben der Passphrase
      33. Schloss_05(5) = &H10203040
      34. Dim Schloss_20(20) As Byte At Schloss_05 Overlay 'hier sind diese Bytes nochmal in anderer Form
      35. Dim Schluessel(20) As Byte 'passend dann zum Format des Schluessels
      36. '--------------------------------
      37. Declare Sub Schluessel_check()
      38. Declare Sub Schluessel_bilden()
      39. Declare Sub Schluessel_bit_sammeln (byval x As Byte)
      40. '----------
      41. Config Timer1 = Timer , Prescale = 256 'ganz ohne Interrupt!
      42. Stop timer1
      43. Do
      44. select case Level
      45. case 1
      46. do
      47. loop until TIFR1.5= 1 or Timer1 > 12500 'auf Flanke warten wenn noch "in time" ca. 200ms
      48. TIFR1.5 = 1 'loeschen der Flags mit "1"!
      49. Toggle Tccr1b.6 'Wechsel Falling - Rising
      50. if Timer1 > 12500 then 'wenn der Ausbruch auf Grund der abgelaufenen Zeit war
      51. Level = 2
      52. end if
      53. 'Timer1-Wert liegt durch die "Input Capture Funktion" in ICR1
      54. diff_temp_word = ICR1 - alt_temp_word 'Differenz zweier aufeinanderfolgender Timer1 - Werte
      55. alt_temp_word = ICR1
      56. Puffer(puffer_x) = diff_temp_word 'der Low-Teil aus der Differenz ICR1 in Array
      57. Incr Puffer_x 'der laengste Impuls hate eine Timer1-Differenz von max.110
      58. waitus 300 'noch "Reservezeit" zum feststellen, reduzieren /loeschen
      59. case 0
      60. For Puffer_x = 1 to 327 'Die Anzahl der Eintragungen (Flankenwechsel) in den Puffer
      61. Puffer (Puffer_x) = 0 'ist abhängig vom gesendeten Inhalt
      62. next Puffer_x '"0" faellt durch das Raster der Auswertung
      63. Puffer_x = 1
      64. Manchester_paar = 0
      65. alt_temp_word = 0
      66. Do
      67. Loop Until Pinb.0 = 0 'warten bis sich etwas tut -> Start Timer1
      68. Tccr1b.6 = 1 'naechster Impuls mit steigender Flanke erwartet
      69. Start Timer1 'mit dem Prescale und Start hier wuerden sich die Timer1-Werte ueber 1s ziehen
      70. Level = 1
      71. case 2
      72. Stop Timer1 'Level 3 wird innerhalb "Schluessel_bilden" verwendet
      73. Timer1 = 0
      74. Schluessel_bilden
      75. case 4
      76. Schluessel_check
      77. case 5
      78. 'geschafft
      79. 'betaetige Relais
      80. 'schalte die gruene LED ein
      81. set PORTC.3
      82. waitms 1500
      83. reset PORTC.3
      84. waitms 1000
      85. Level = 0
      86. end select
      87. Loop
      88. '--------------------------------------
      89. Sub Schluessel_Bit_sammeln (byval x As Byte)
      90. Temp_byte.C_Bit_zaehler = x.0 ' Merke_letzten_Zustand
      91. incr C_Bit_zaehler
      92. If C_Bit_zaehler = 8 then
      93. Schluessel (B_byte_zaehler) = Temp_byte 'Uebernahme Byte komplett
      94. C_Bit_zaehler = 0
      95. incr B_byte_zaehler
      96. End if
      97. If B_byte_zaehler > 20 then
      98. Level = 4 'Level 4, wenn alles gut gegangen ist
      99. Else
      100. Level = 0
      101. End if
      102. End Sub
      103. '--------------------------------------
      104. Sub Schluessel_check:
      105. y = 0
      106. For x = 1 to 20
      107. if Schloss_20(x) = Schloss_20(x) then incr y
      108. Next x
      109. If y = 20 then
      110. Level = 5
      111. else
      112. Level = 0
      113. end if
      114. End Sub
      115. '-----
      116. Sub Schluessel_bilden:
      117. Hilfsbyte = Puffer(2)
      118. If Hilfsbyte > 92 and Hilfsbyte < 110 then Level = 3
      119. '-----
      120. zustand = 1 'gesendet wurde vorneweg ein zus. Bit (1)
      121. Merke_letzten_Zustand = zustand 'meine Festlegung fuer "Low" am IR-Empfaenger
      122. If Level = 3 then
      123. B_byte_zaehler = 1 'passend zur Zaehlweise im Array
      124. C_Bit_zaehler = 0
      125. For puffer_x = 5 to 327 'das erste Interessante ist in der 5. Array-Zelle
      126. 'nebenbei auch noch der zweiter Teil des ersten Bits
      127. Hilfsbyte = puffer (puffer_x)
      128. toggle Zustand 'bei jeder Flanke/Array-Zelle ein Wechsel "high/low"
      129. If Hilfsbyte > 12 and Hilfsbyte < 32 then 'schmal
      130. Toggle Manchester_paar
      131. If Manchester_paar = 1 then
      132. x =Merke_letzten_Zustand
      133. if Puffer_x > 5 then Schluessel_Bit_sammeln x 'in 5 steht nur die vorangestellte "1"
      134. End if
      135. Merke_letzten_Zustand = zustand
      136. ElseIf Hilfsbyte > 35 and Hilfsbyte < 55 then 'breit
      137. x =Merke_letzten_Zustand
      138. if Puffer_x > 5 then Schluessel_Bit_sammeln x 'in 5 steht nur die vorangestellte "1"
      139. Merke_letzten_Zustand = zustand
      140. Manchester_paar = 0
      141. End if
      142. Next Puffer_x
      143. else
      144. Level = 0
      145. End if
      146. End Sub
      147. '--------------------------------------
      Alles anzeigen
      Ach ja - die Sendesoftware (gibt 16 Impulse (0-15) aus und nicht 15). a_71_f9c57bbe

      MfG
      port
    • Quellcode

      1. Config Watchdog = 2048
      2. Config Timer1 = Timer , Prescale = 256 'ganz ohne Interrupt!
      3. Stop timer1
      4. ....
      5. Start Timer1
      6. Start Watchdog
      Ein "Watchdog = 20482
      sollte vielleicht noch hinzu, welcher dann mit Timer1 gestartet wird
      Muss ich mir aber erst genauer anschauen ...

      MfG
      port

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

    • port schrieb:

      Dim Schloss_05(5) As Long

      Schloss_05(1) = &H00000011 ' die gespeicherte Phrase als Beispiel
      Schloss_05(2) = &H00000000 ' normal koennten es gute Zufallsbytes sein
      Schloss_05(3) = &H12345678 ' 20 einzelne Bytes waeren sehr unuebersichtlich
      Schloss_05(4) = &HABCDEF00 ' beim Schreiben der Passphrase
      Schloss_05(5) = &H10203040

      Dim Schloss_20(20) As Byte At Schloss_05 Overlay 'hier sind diese Bytes nochmal in anderer Form
      Dim Schluessel(20) As Byte 'passend dann zum Format des Schluessels

      Müsste das Array 'Schloss_05()' nicht als DWord dimensioniert sein?

      Weil die Werte im Array sind 4 Byte angegeben und 5x4 würde auch die 20 Byte ergeben (Dim Schloss_20(20) as Byte)

      Ein Long hat 8 Byte. So würdest du ja nicht korrekten Daten absenden, oder?
    • @Mitch64

      Ja, da hast du wohl recht.

      Wahrscheinlich habe ich alle Zeichen auf der Empfänger sehen können, da ich auf Sende und Empfängerseite die gleichen Definitionen gemacht habe.

      Dword - wäre ausreichend.

      Auch habe ich beim Entfernen vieler Debug-Anzeigen fürs Display und Umbenennung von Variablen in treffender Begriffe am Ende zus. Fehler in den Code gebracht.

      siehe: "Sub Schluessel_check:"
      ich räume das die nächsten Wochen mal auf.

      Danke!
    • @Mitch64

      Mitch64 schrieb:

      port schrieb:

      Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect
      Was bewirkt bei deinem Sender das 'Compare A = Disconnect' bei der Timer-Konfiguration?
      Dein IR-Ausgang ist ja nicht am OC0A-Pin sondern am INT0-Pin.

      Ich hatte es so verstanden, dass man den PIN immer abtrennen sollte - wenn man ihn nicht benutzt.
      Sonst würde er ja so einfach so mitzappeln (?).

      Danke!

      MfG
      port