Ich habe das ganze jetzt etwas umständlich (codeintensiv) aber dafür sehr genau arbeitend gelöst. Bitlänge und Modulationsfrequenz sind nun auch im Code-String enthalten. Ich kann so nun jeden IR Code von jeder Fernbedienung senden. Das ganze ist Teil meies Haussteuerungsprojektes. Ich kann nun von unterwegs Geräte daheim per Funk und IR Aussendung bedienen.
Da die wenigsten Fernbedienungen mit dem von Bascom unterstützten RC5 Protokoll funktionieren, kann dieser Code vielleicht auch für andere, die an ähnlichen Projekten arbeiten mal hilfreich sein.
Hier mein fertiger Code:
Code:$regfile = "m8def.dat" $crystal = 8000000 $hwstack = 200 $swstack = 200 $framesize = 200 Config Portb.1 = Output Config Pinb.0 = Input Taster Alias Pinb.0 Irled Alias Portb.1 Portb.0 = 1 'pullup' Dim Pwmwert As Word Dim L As Byte Dim H As Byte Dim Code As String * 120 , Stellenzaehler As Byte , Bitwert_str As String * 1 , A As Byte , Bitlaenge As Word , Bitlaenge_str As String * 3 Dim Khz As Word , Khz_str As String * 3 L = 0 H = 1 Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1 Pwmwert = 104 ' 110=36khz, 104=38Khz, 99=40Khz (wert im code string enthalten) Do Debounce Taster , 0 , Sendecodeklimaanlage , Sub Loop Sendecodeklimaanlage: Code = "386001111111111111110000000101010101010010101001001001001001010010010100101010101010100101001001001001001001" 'stelle 1-2 modulation in khz, stelle 3-5 bitlänge in us Gosub Auswertung Return Satcodelauter: Code = "3685011001100110101010011001011" 'stelle 1-2 modulation in khz, stelle 3-5 bitlänge in us Gosub Auswertung Return Fernseherleiser: Code = "38600111111100000001001001001010101010100100100101010101010010010100101010101010100101001001001001" 'stelle 1-2 modulation in khz, stelle 3-5 bitlänge in us Gosub Auswertung Return Auswertung: Khz_str = Mid(code , 1 , 2) 'holt die modulationsfrequenz aus dem string (36,38 oder 40 Khz) Khz = Val(khz_str) Select Case Khz Case 36 Pwmwert = 110 Case 38 Pwmwert = 104 Case 34 Pwmwert = 99 Case Else 'wenn wert unbekannt dann 38 Khz Pwmwert = 104 End Select Compare1a = Pwmwert Bitlaenge_str = Mid(code , 3 , 3) 'holt die bitlänge aus dem string Bitlaenge = Val(bitlaenge_str) Stellenzaehler = Len(code) + 5 For A = 6 To Stellenzaehler 'von selle 6 weg die bits des sendecodes lesen und senden Bitwert_str = Mid(code , A , 1) Select Case Bitwert_str Case "1" Gosub Sendehigh Case "0" Gosub Sendelow End Select Next A Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1 'am ende einer codeaussendung "disconnect" pwm damit die sendeled niemals an bleiben kann Return Sendehigh: Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 'nur bei einem "high" die pulswellenausgabe aktivieren Gosub Wartezeitbitlaenge 'variable wartezeit = bitlänge Return Sendelow: Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1 'bei einem "low" erfolgt keine pwm ausgabe Gosub Wartezeitbitlaenge 'variable wartezeit = bitlänge Return Wartezeitbitlaenge: 'waitus führt mit einer variablen zu starken abweichungen (auch mit 16Mhz takt), darum diese umständliche (aber genaue) lösung Select Case Bitlaenge 'bitlänge: 850us technisat, 600us klimaanlage Case 550 Waitus 550 Case 560 Waitus 560 Case 570 Waitus 570 Case 580 Waitus 580 Case 590 Waitus 590 Case 600 Waitus 600 Case 610 Waitus 610 Case 620 Waitus 620 Case 630 Waitus 630 Case 640 Waitus 640 Case 650 Waitus 650 Case 660 Waitus 660 Case 670 Waitus 670 Case 680 Waitus 680 Case 690 Waitus 690 Case 700 Waitus 700 Case 710 Waitus 710 Case 720 Waitus 720 Case 730 Waitus 730 Case 740 Waitus 740 Case 750 Waitus 750 Case 760 Waitus 760 Case 770 Waitus 770 Case 780 Waitus 780 Case 790 Waitus 790 Case 800 Waitus 800 Case 810 Waitus 810 Case 820 Waitus 820 Case 830 Waitus 830 Case 840 Waitus 840 Case 850 Waitus 850 Case 860 Waitus 860 Case 870 Waitus 870 Case 880 Waitus 880 Case 890 Waitus 890 Case 900 Waitus 900 Case 910 Waitus 910 Case 920 Waitus 920 Case 930 Waitus 930 Case 940 Waitus 940 Case 950 End Select Return End







Zitieren
Lesezeichen