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.
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
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
- '##############################
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 25
- $swstack = 25
- $framesize = 25
- Dim Anzahl_impulse As Byte
- Dim Eins_oder_null As Byte
- Dim Sende_status As Byte
- Dim Code As Byte
- Dim X As Byte
- Dim Y As Byte
- Dim Z As Byte
- '##################################
- Dim Phrasen(5) As Long
- Phrasen(1) = &H00000011 ' ein paar Dummy-Daten
- Phrasen(2) = &H00000000 '
- Phrasen(3) = &H12345678
- Phrasen(4) = &HABCDEF00
- Phrasen(5) = &H10203040
- Dim Schluessel(20) As Byte At Phrasen Overlay ' geht los mit &H11 = &B0001_0001 aus Phrasen(1)
- ' nicht ganz verstanden aber herausgefunden
- ' in der Uebertragung dann LSB zuerst!
- '###############################
- Config Portd.2 = Output
- Ir_led Alias Portd.2
- Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect
- Ocr0a = 49 ' f.40KHz- IR- Empfaenger
- ' bei 16Mhz / 8 - > dann von 0-49 (50) zaehlen (2MHz /50 -> 40khz >
- 'muesste nicht soo genau sein - aber passt eben hier super
- On Oc0a Isr_timer0_oc0a ' OC0A-Interrupt konfigurieren
- Enable Oc0a ' OC0A-Interrupt zulassen
- Enable Interrupts
- '##############################
- 'ist "0" beim Start - hier fuer den Ueberblick
- Sende_status.0 = 0 ' Freigabe zur Uebertragung des Schluessels '
- Sende_status.1 = 0 ' Freigabe zum Senden eines Bits des Schluessels
- Sende_status.2 = 0 ' Schluessel wurde komplett gesendet
- Declare Sub Bits_deklarieren()
- Declare Sub Sendung_zusammenstellen()
- '##############################
- Do
- If Sende_status.2 = 1 Then 'Sendung ist raus
- Waitms 200
- Sende_status = 0 ' alles "null" - zum Test im Moment - spaeter mit Sendetaste z.B. den Prozess in Gang setzen
- End If
- If Sende_status = 1 Then
- Bits_deklarieren
- End If
- If Sende_status = 0 Then
- Sendung_zusammenstellen
- Sende_status = 1
- End If
- Loop
- End
- '###############################
- Sub Bits_deklarieren
- Select Case Y
- Case 0:
- Eins_oder_null = 3 '30 Impulse als Vorspann
- Incr Y
- Sende_status.1 = 1
- Case 1:
- Eins_oder_null = 3 'weitere 30 Impulse als Vorspann
- Incr Y
- Sende_status.1 = 1
- Case 2:
- Eins_oder_null = 4 ' Pause
- Incr Y
- Sende_status.1 = 1
- Case Else:
- Code = Schluessel(y - 2) ' ein Byte aus den 20 Schluesselbytes
- If X < 8 Then
- Eins_oder_null = Code.x 'die einzelnen Bits aus dem Byte
- Sende_status.1 = 1
- Incr X
- End If
- If X = 8 Then
- X = 0
- Incr Y 'naechste der 20 Bytes
- End If
- End Select
- End Sub
- '###############################
- Sub Sendung_zusammenstellen
- ' hier ist spaeter evtl. mehr zu rechnen (RTC ueber I2C? -> Hash? oder andere Sachen)
- Waitms 250
- End Sub
- '###############################
- Isr_timer0_oc0a:
- If Sende_status.1 = 1 And Sende_status.2 = 0 Then
- Select Case Eins_oder_null
- Case 1:
- If Anzahl_impulse < 15 Then ' Manchestercode hier f. 1 (erst impulse dann pause)
- Set Ir_led
- Waitus 5 ' 5us breit bei gesamt 25us (1/40000) -> on-off-Verhaeltnis = 1:4
- Reset Ir_led
- End If
- Case 0:
- If Anzahl_impulse > 14 Then ' Manchestercode hier f. 0 (erst pause dann impulse)
- Set Ir_led
- Waitus 5 ' 5us breit bei gesamt 25us (1/40000) -> on-off-Verhaeltnis = 1:4
- Reset Ir_led
- End If
- Case 3: ' impulse als Vorspann 2 * 30 = 60 Stück
- Set Ir_led
- Waitus 5
- Reset Ir_led
- Case 4: 'eine Pause nach dem Vorspann
- Anzahl_impulse = Anzahl_impulse + 2
- 'dadurch nur eine kurze Pause - gesamt 3 x incr > 10 Ticks
- End Select
- Incr Anzahl_impulse
- If Anzahl_impulse = 30 Then ' sollen ja nur 0 - 29 = 30 Impulse jeweils werden
- Anzahl_impulse = 0
- Sende_status.1 = 0 ' jetzt koennte das naechste Bit aufgelegt werden
- If Y = 23 Then '0,1,2 für den Vorspann 20 Bytes im Anschluss -> 23 ist dann Ende
- Y = 0
- Sende_status.2 = 1 ' alles ist raus
- End If
- End If
- End If
- Return
- '###############################
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 ()