Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.
|
Forum Index : Microcontroller and PC projects : IR Remote Control Rx and Tx for Philips RC-5 Protocol.
Author | Message | ||||
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 2133 |
To go with the NEC protocol here is Philips RC-5 Sub IR_RC5_Rx and Sub IR_RC5_Tx are the useful bits in this program. The rest just reads and decodes the Manchester protocol, sending the result to the console. Then transmits the IR code 3 seconds later to the device so you can verify that it is correct. The codes it produces match the published ones so it should be ok. The older version of RC-5 sends a Start pulse, a Control bit to distinguish a double press from auto-repeat, a 5 bit device code and a 6 bit key code. As that only gives 64 key codes the current version has a Field bit between the Start and Control bits to provide another 64 key codes. Field = 1 for keys 0 to 63 Field = 0 for keys 64 to 127 Control alternates between 0 and 1 on each key press. Sub IR_RC5_Tx should work with all the above but the devices I have (Philips audio system & Schaub Lorenz TV) both use Start = 1 & Field = 1 so the others are untested. For old devices that don't use the Field bit set the Start bit to 0 and the Field bit to 1. The Field bit becomes the Start bit. Usage: IR_RC5_Tx start, field, control, device, key Eg: IR_RC5_Tx 1,0,17,63 turns on the sterio and IR_RC5_Tx 1,1,17,12 turns it off. If you want to modify the subs for your own projects there are plenty of comments and diagnostic prints to help. ' "IR Philips RC-5 code Rx & Tx.bas" 'Option explicit Dim integer RxPin=MM.Info(pinno GP1), TxPin=MM.Info(pinno GP0) ' set GPxx for IR Tx & Tx Dim Integer N = 29 ' expected maximum number of transitions, plus a few Dim integer m, b(N), c(N\2), dev, key, r(N*2), strt=1, Tend Dim Float T SetPin RxPin, intl, IR_RC5_Rx 'wait for IR activity to pull IRpin low SetPin TxPin, DOUT : Dim integer ctrl '<-- only needed for Sub IR_RC5_Tx demo Print " To send commands un-comment 2 lines in the loop at the end of the program then:-" Print " Start = 1 for new RC-5, Start = 0 for original (obsolete) RC-5" Print " Field = 1 for Key codes 0 to 63, Field = 0 for Key codes 64 to 127" Print " Control toggle between 0 and 1 on each Key press to distinguish from auto-repeat" Print " Device = device code, 0 to 31" Print " Key = Key code, 0 to 63. Field = 0 shifts these up by 128" : Print Print " Press a key on the IR remote control to record the RC-5 code" : Print Sub IR_RC5_Rx T=Timer :Tend = T SetPin RxPin, off : SetPin RxPin, Din :m=1 :b(0)=0 Do While m<(N-1)And(Timer-T<300) 'get pulses/pauses & convert to Manchester bits Do While (Pin(RxPin)=0(And(Timer-T<300) :Loop If (Timer-T)>2.2 Then Exit Do b(m)=1:If (Timer-T)>1.6 Then:Inc m :b(m)=1:EndIf T=Timer :Inc m Do While (Pin(RxPin)=1)And(Timer-T<300):Loop If (Timer-T)>2.2 Then Exit Do b(m)=0:If (Timer-T)>1.6 Then:Inc m :b(m)=0:EndIf T=Timer :Inc m Loop SetPin RxPin, off : b(N)=Timer-Tend : m=0 'disable interrupt while processing ' Print :Print "IR BitStream - b() ";:Math V_Print b() If b(4)+b(5)+b(6)+b(7)+b(8)=0 Then GoTo no.data If b(N-2)=0 And b(N-3)=0 Then strt = 0 'detect obsolete RC-5 code (no field bit) If b(N-2)=1 Xor b(N-3)=1 Then strt = 1 'detect new RC-5 code (with field bit) If strt = 0 Then For m=(N-2) To 0 Step -1 b(m+2)=b(m) Next b(0)=0 : b(1)=0 EndIf m=2 Do While m<(N) 'convert pairs of Manchester half-bits to ordinary bits If (b(m)=0)And(b(m+1)=1) Then c(m\2-1)=1 If (b(m)=1)And(b(m+1)=0) Then c(m\2-1)=0 Inc m, 2 Loop Print "c()=bits ";:Math V_print c() field=c(0): ctrl=c(1): dev=0: key=0 'ctrl toggles on each key press to distinguish autorepeat from double press For m=2 To 6:Inc dev,dev +c(m):Next 'assemble Device code For m=7 To 12:Inc key,key +c(m):Next 'assemble Key code If strt=1 Then Print "field";field;" control";ctrl;" dev";dev;" key";key If strt=0 Then Print "old RC-5 no field. control";ctrl;" dev";dev;" key";key ' Pause 3000 : IR_RC5_Tx 1, field, ctrl, dev, key 'resend the received code after 3S ' ctrl=Not ctrl no.data: T=0 Math set 0, b() Math set 0, c() Pause 400 'block repeat codes SetPin RxPin, intl, IR_RC5_Rx 're-enable interrupt for next key End Sub Sub IR_RC5_Tx(strt, field, ctrl, dev, key) As integer strt=strt And 1 : field=field And 1 : ctrl=ctrl And 1 : dev=dev And 31 : key=key And 63 Local integer ord(14), bs(900), m=0, n, z Math set 14, bs() 'load BitStream array with 36kHz half cycles (14uS) 'assemble ordinary bit array For n=6 To 2 Step -1 : ord(n) = (dev >> m) And 1 : Inc m :Next m=0 For n=12 To 7 Step -1 : ord(n) = (key >> m) And 1 : Inc m :Next If strt = 0 Then field = 1 ord(0)=field : ord(1)=ctrl ' Print "f";field,"c";ctrl,"dev";dev,"key";key,, "ord()";:Math V_print ord()' :Print ' Print " b() ";:Math V_Print b()' :Print 'convert ordinary bits to pairs of Manchester half-bits and load into BitStream array - 'merging adjacent high or low pairs of half-bits into long highs or long lows, ' without causing inversions in the BitStream 'half cycle at 36kHz = 14uS = 64 or 65 half cycles per short pulse, 129 per long pulse m=0 If strt=1 Then m=64 'Else m=1 'm=65 -> start pulse If (field=1)And(strt=1) Then : bs(65)=889 :Inc m,65 : EndIf If (field=0)And(strt=1) Then : Inc m,64 : bs(m)=889 : EndIf If strt = 0 Then m=65 For n=0 To 11 If (ord(n)=1)And(ord(n+1)=1) Then : bs(m)=889 : Inc m,64 : EndIf If (ord(n)=1)And(ord(n+1)=0) Then : Inc m,64 : bs(m)=889 : EndIf If (ord(n)=0)And(ord(n+1)=1) Then : bs(m)=1778 : Inc m,64 : EndIf If (ord(n)=0)And(ord(n+1)=0) Then : bs(m)=889 : Inc m,64 : EndIf Next Inc m ' BitBang BitStream TxPin, m, bs() 'for ARMMiteF4 Device BitStream TxPin, 832+66*strt, bs() 'for PicoMite Pause 88 Device BitStream TxPin, 832+66*strt, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run ' Print : Math V_print bs() :Print End Sub Do 'un-comment the next 2 lines to send data 'Input "Enter RC-5 Data:- Start, Field, Control, Device, Key ";strt,field,ctrl,dev,key 'IR_RC5_Tx strt,field,ctrl,dev,key Pause 400 Loop End Getting the BitStream to work properly with Manchester half-bits realy taxed my geriatric brain. Senility is advancing. Edit 29/09/2024 The code above has been edited. A closer inspection of the output for the old version of RC-5 was not quite right. Should now be ok, but still can't test on an actual device. However sending from one Pico to another does work and scope pics of the data appear to match the specification. Also added automatic detection of old RC-5 to IR_RC5_Rx Sub. Output when receiving. RUN Press a key on the IR remote control to record the RC-5 code field 1 control 0 dev 1 key 53 field 1 control 1 dev 1 key 0 field 1 control 0 dev 17 key 63 field 1 control 1 dev 17 key 7 field 1 control 0 dev 18 key 63 old RC-5 no field. control 1 dev 28 key 0 field 0 control 0 dev 20 key 63 field 0 control 1 dev 20 key 8 field 0 control 0 dev 20 key 54 field 1 control 1 dev 20 key 63 Edited 2024-09-29 14:31 by phil99 |
||||
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 2133 |
RC-6 Rx and Tx Although I don't have any RC-6 devices to test it on scope traces of the output match those published by others on the net. Tested ok going from one PicoMite to another. RC-6 has provision for 8 different modes but it appears all consumer devices use mode 0. There is little I could find on the other modes so Tx only supports mode 0. The Rx Sub should however be able to show the mode number other modes but might not decode them correctly. ' "IR Philips RC-6 Mode 0 Rx & Tx.bas" 'Option explicit Dim integer RxPin=MM.Info(pinno GP0), TxPin=MM.Info(pinno GP1) ' set GPxx for IR Tx & Tx Dim Integer N = 44 ' expected maximum number of transitions, plus a few Dim integer m, b(N), c(N\2), dev, key, r(N*2), Tend, Toggle, Type'Type = RC6 Mode or Field Dim Float T SetPin RxPin, intl, IR_RC6_Rx 'wait for IR activity to pull IRpin low SetPin TxPin, DOUT Print " To send commands un-comment the lines near the end of the program then:-" Print " Toggle toggles between 0 and 1 on each Key press to distinguish from auto-repeat" Print " Device = device code, 0 to 255" Print " Key = Key code, 0 to 255." : Print Print " Press a key on the IR remote control to record the RC-6 code" : Print Sub IR_RC6_Rx T=Timer :Tend = T SetPin RxPin, off : SetPin RxPin, Din :m=1 :b(0)=0 Do While m<(N-1)And(Timer-T<300) 'get pulses/pauses & convert to Manchester bits Do While (Pin(RxPin)=0)And(Timer-T<300) :Loop If (Timer-T)>3 Then Exit Do b(m)=1 If m=11 Then 'toggle is double normal pulse If (Timer-T)>1.2 Then:Inc m :b(m)=1:EndIf Else If (Timer-T)>0.66 Then:Inc m :b(m)=1:EndIf EndIf T=Timer :Inc m Do While (Pin(RxPin)=1)And(Timer-T<300):Loop If (Timer-T)>1.6 Then Exit Do b(m)=0 If m=10 Then 'toggle is double normal pause If (Timer-T)>1.33 Then:Inc m :b(m)=0:EndIf Else If (Timer-T)>0.66 Then:Inc m :b(m)=0:EndIf EndIf T=Timer :Inc m Loop SetPin RxPin, off' : b(N)=Timer-Tend : m=0 'disable interrupt while processing If b(4)+b(5)+b(6)+b(7)+b(8)=0 Then GoTo no.data ' Print :Print "IR BitStream - b() ";:Math V_Print b() m=2 Do While m<(N) 'convert pairs of Manchester half-bits to ordinary bits (oposite of RC-5) If (b(m)=0)And(b(m+1)=1) Then c(m\2-1)=0 '01 = 0 If (b(m)=1)And(b(m+1)=0) Then c(m\2-1)=1 '10 = 1 Inc m, 2 Loop Print "c()=bits ";:Math V_print c() Type = c(1)*4+c(2)*2+c(3) : toggle=c(4) : dev=0 : key=0 'ctrl toggles on each key press to distinguish autorepeat from double press For m=5 To 12 : Inc dev,dev + c(m) : Next 'assemble Device code For m=13 To 20 : Inc key,key + c(m) : Next 'assemble Key code Print "Mode";type;" Toggle";toggle;" Dev";dev;" Key";key :Print 'un-comment the following lines to re-transmit the received code to verify operation ' Pause 3000 ' IR_RC6_Tx 1, toggle, dev, key 'resend the received code after 3S ' Pause 83 ' IR_RC6_Tx 1, toggle, dev, key 'resend the received code after 3S ' toggle=Not toggle no.data: T=0 Math set 0, b() Math set 0, c() Pause 400 'block repeat codes SetPin RxPin, intl, IR_RC6_Rx 're-enable interrupt for next key End Sub Sub IR_RC6_Tx(toggle, dev, key) As integer toggle=toggle And 1 : dev=dev And 255 : key=key And 255 ': type=type And 7 'only uses Mode 0 Local integer ord(19), bs(1993), m=0, n, z Math set 14, bs() 'load BitStream array with 36kHz half cycles (14uS) 'assemble ordinary bit array ' For n=3 To 0 Step -1 : ord(n) = (dev >> m) And 1 : Inc m :Next ' ord(4)=toggle m=0 : For n=15 To 8 Step -1 : ord(n) = (key >> m) And 1 : Inc m :Next m=0 : For n=7 To 0 Step -1 : ord(n) = (dev >> m) And 1 : Inc m :Next Print "toggle";toggle,"dev";dev,"key";key,, "ord() ";:Math V_print ord() 'convert ordinary bits to pairs of Manchester half-bits and load into BitStream array - 'merging adjacent high or low pairs of half-bits into long highs or long lows, ' without causing inversions in the BitStream 'half cycle at 36kHz = 14uS = 32 half cycles per short pulse, 65 per long pulse bs(193)=1333 : bs(225)=444 : bs(257)=444' : bs(289)=444 ' Start pulse + Mode=0 3 bits If toggle=0 Then bs(289)=889 'long pause - long pulse If toggle=1 Then bs(355)=889 'long pulse - long pause m=355 If (toggle=1) And (ord(0)=1) Then bs(355)=444 : Inc m,32 : EndIf If (toggle=1) And (ord(0)=0) Then bs(355)=1333 : Inc m,32 : EndIf If (toggle=0) And (ord(0)=1) Then Inc m,32 : bs(m)=444 : EndIf If (toggle=0) And (ord(0)=0) Then bs(355)=444 :Inc m,32 : EndIf For n=0 To 15 If (ord(n)=1)And(ord(n+1)=1) Then : bs(m)=444 : Inc m,32 : EndIf If (ord(n)=1)And(ord(n+1)=0) Then : bs(m)=889 : Inc m,32 : EndIf If (ord(n)=0)And(ord(n+1)=1) Then : Inc m,32 : bs(m)=444 : EndIf If (ord(n)=0)And(ord(n+1)=0) Then : bs(m)=444 : Inc m,32 : EndIf Next ' BitBang BitStream TxPin, 868, bs() 'for ARMMiteF4 Device BitStream TxPin, 868, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run Pause 83 Device BitStream TxPin, 868, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run ' Print : Math V_print bs() :Print End Sub Do 'un-comment the next 2 lines to send data ' Input "Enter RC-6 Data:- toggle, Device, Key "; toggle,dev,key ' IR_RC6_Tx toggle,dev,key ' toggle = Not toggle Pause 300 Loop End Tx usage:- IR_RC6_Tx toggle, device, key . Edited 2024-10-01 22:27 by phil99 Footnote added 2024-10-03 11:36 by phil99 Sub IR_RC6_Tx needed some tidying up, so here it is. Sub IR_RC6_Tx(toggle, dev, key) As integer toggle=toggle And 1 : dev=dev And 255 : key=key And 255 'only uses Mode 0 Local integer ord(16), bs(870), m=0, n Math set 14, bs() 'load BitStream array with 36kHz half cycles (14uS) 'assemble ordinary bit array m=0 : For n=15 To 8 Step -1 : ord(n) = (key >> m) And 1 : Inc m :Next m=0 : For n=7 To 0 Step -1 : ord(n) = (dev >> m) And 1 : Inc m :Next Print "toggle";toggle,"dev";dev,"key";key,, "ord() ";:Math V_print ord() 'fixed 3 bit Field / Mode number = 0 for consumer electronics 'convert ordinary bits to pairs of Manchester half-bits and load into BitStream array - 'merging adjacent high or low pairs of half-bits into long highs or long lows, ' without causing inversions in the BitStream 'half cycle at 36kHz = 14uS = 32 half cycles per short pulse, 65 per long pulse bs(193)=1333 : bs(225)=444 : bs(257)=444 ' Start pulse + Mode=0 3 bits If toggle=0 Then bs(289)=889 'long pause - long pulse for toggle bit If toggle=1 Then bs(355)=889 'long pulse - long pause m=355 If (toggle=1) And (ord(0)=1) Then bs(355)=444 If (toggle=1) And (ord(0)=0) Then bs(355)=1333 If (toggle=0) And (ord(0)=1) Then bs(m+32)=444 If (toggle=0) And (ord(0)=0) Then bs(355)=444 Inc m,32 For n=0 To 15 If (ord(n)=1)And(ord(n+1)=1) Then bs(m)=444 If (ord(n)=1)And(ord(n+1)=0) Then bs(m)=889 If (ord(n)=0)And(ord(n+1)=1) Then bs(m+32)=444 If (ord(n)=0)And(ord(n+1)=0) Then bs(m)=444 Inc m,32 Next ' BitBang BitStream TxPin, 868, bs() 'for ARMMiteF4 Device BitStream TxPin, 868, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run Pause 83 Device BitStream TxPin, 868, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run ' Print : Math V_print bs() :Print End Sub |
||||
Marcel27 Regular Member Joined: 13/08/2024 Location: NetherlandsPosts: 53 |
Thanks phil99, I love this timing stuff. Yes! I know how it feels, I've seen man in white coats and dispensing yellow pills to keep me stable at some programming jobs. If you use AI, you lose your mind. |
||||
Mixtel90 Guru Joined: 05/10/2019 Location: United KingdomPosts: 6764 |
The answer is (usually) Dried Frog Pills, I believe. :) Mick Zilog Inside! nascom.info for Nascom & Gemini Preliminary MMBasic docs & my PCB designs |
||||
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 2133 |
This months edition of Silicon Chip has an article that includes a description of IR protocols. From that I see that my RC-6 Rx and Tx Subs aren't quite right. The start sequence includes a Bit that I missed. Here is an updated version. Not having anything to test it on is a bit of a problem so any feedback from anyone that does have RC-6 equipment would be welcome. ' "IR Philips RC-6 Mode 0 Rx & Tx.bas" 'Option explicit Dim integer RxPin=MM.Info(pinno GP0), TxPin=MM.Info(pinno GP1) ' set GPxx for IR Rx & Tx Dim Integer N = 48 ' expected maximum number of transitions, plus a few Dim integer m, b(N), c(N\2), dev, key, r(N*2), Tend, Toggle, Type'Type = RC6 Mode or Field Dim Float T 'SetPin RxPin, off 'for RP2350 if all pins have been set to DIN Pullup at start-up. SetPin RxPin, intl, IR_RC6_Rx 'wait for IR activity to pull IRpin low 'SetPin TxPin, off 'for RP2350 if all pins have been set to DIN Pullup at start-up. SetPin TxPin, DOUT Print " To send commands un-comment the lines near the end of the program then:-" Print " Toggle toggles between 0 and 1 on each Key press to distinguish from auto-repeat" Print " Device = device code, 0 to 255" Print " Key = Key code, 0 to 255." : Print Print " Press a key on the IR remote control to record the RC-6 code" : Print Sub IR_RC6_Rx SetPin RxPin, off : SetPin RxPin, Din :m=1 :b(0)=0 :T=Timer Do While (Pin(RxPin)=0) And (Timer-T<300) :Loop 'skip lead-in pulse Do While (Pin(RxPin)=1) And (Timer-T<300) :Loop Do While m<(N-1) And (Timer-T<300) 'get pulses/pauses & convert to Manchester bits Do While (Pin(RxPin)=0) And (Timer-T<300) :Loop If (Timer-T)>5 Then Exit Do b(m)=1 If m=10 Or m=11 Then Inc T,0.444 'toggle is 444uS longer than normal pulse If (Timer-T)>0.66 Then : Inc m : b(m)=1 : EndIf T=Timer :Inc m Do While (Pin(RxPin)=1) And (Timer-T<300):Loop If (Timer-T)>1.9 Then Exit Do b(m)=0 If m=10 Or m=11 Then Inc T,0.444 'toggle is 444uS longer than normal pause If (Timer-T)>.66 Then : Inc m :b(m)=0 : EndIf T=Timer :Inc m Loop SetPin RxPin, off 'disable interrupt while processing If b(6)+b(7)+b(8)+b(9)=0 Then GoTo no.data ' Print :Print "IR BitStream - b() ":Math V_Print b() m=2 Do While m<(N) 'convert pairs of Manchester half-bits to ordinary bits (oposite of RC-5) If (b(m)=0)And(b(m+1)=1) Then c(m\2-1)=0 '01 = 0 If (b(m)=1)And(b(m+1)=0) Then c(m\2-1)=1 '10 = 1 Inc m, 2 Loop ' Print "c()=bits ";:Math V_print c() Type = c(1)*4+c(2)*2+c(3) : toggle=c(4) : dev=0 : key=0 'Toggle toggles on each key press to distinguish autorepeat from double press For m=5 To 12 : Inc dev,dev + c(m) : Next 'assemble Device code For m=13 To 20 : Inc key,key + c(m) : Next 'assemble Key code Print "Received:- Type";type;" Toggle";toggle;" Dev";dev;" Key";key :Print 'un-comment the following lines to re-transmit the received code to verify operation ' Pause 3000 : Print "re-sendimg above codes, with Type = 0" ' IR_RC6_Tx toggle, dev, key 'resend the received code after 3S ' Pause 83 ' IR_RC6_Tx toggle, dev, key 'resend the received code after 3S ' toggle=Not toggle no.data: T=0 Math set 0, b() Math set 0, c() Pause 400 'block repeat codes SetPin RxPin, intl, IR_RC6_Rx 're-enable interrupt for next key End Sub Sub IR_RC6_Tx(toggle, dev, key) As integer toggle=toggle And 1 : dev=dev And 255 : key=key And 255 'only uses Field=0 Local integer ord(16), bs(900), m=0, n Math set 14, bs() 'load BitStream array with 36kHz half cycles (14uS) 'assemble ordinary bit array m=0 : For n=15 To 8 Step -1 : ord(n) = (key >> m) And 1 : Inc m :Next m=0 : For n=7 To 0 Step -1 : ord(n) = (dev >> m) And 1 : Inc m :Next 'Print "ord() ";:Math V_print ord() 'fixed 3 bit Field / Mode number = 0 for consumer electronics 'convert ordinary bits to pairs of Manchester half-bits and load into BitStream array - 'merging adjacent high or low pairs of half-bits into long highs or long lows, ' without causing inversions in the BitStream 'half cycle at 36kHz = 14uS = 32 half cycles per short pulse, 65 per long pulse bs(193)=889 : bs(225)=889 : bs(257)=444 : bs(289)=444 ' Leader pulse + Start bit=1 + Mode=0 3 bits If toggle=0 Then bs(321)=889 'long pause - long pulse for toggle bit If toggle=1 Then bs(387)=889 'short pulse+long pulse - long pause m=387 If toggle=0 And ord(0)=0 Then bs(m)=444 If toggle=1 And ord(0)=1 Then bs(m)=889 If toggle=1 And ord(0)=0 Then bs(m)=1333 If toggle=0 And ord(0)=1 Then bs(m+32)=444 Inc m,32 For n=0 To 15 If ord(n)=ord(n+1) Then bs(m)=444 If ord(n)=1 And ord(n+1)=0 Then bs(m)=889 If ord(n)=0 And ord(n+1)=1 Then bs(m+32)=444 Inc m,32 Next ' BitBang BitStream TxPin, 900, bs() 'for ARMMiteF4 Device BitStream TxPin, 900, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run Pause 5 Device BitStream TxPin, 900, bs() 'for PicoMite Pin(TxPin) = 0 'ensure correct polarity for next run ' Print : Math V_print bs() :Print End Sub dev = 128 : key = 0 Do 'un-comment the next line to send data ' Input "Enter RC-6 Data:- toggle, Device, Key "; toggle,dev,key IR_RC6_Tx toggle,dev,key Print "Sent:- toggle";toggle,"dev";dev,"key";key Inc key Pause 2000 IR_RC6_Tx toggle,dev,key Print "Sent:- toggle";toggle,"dev";dev,"key";key Inc dev Pause 2000 toggle = Not toggle Loop End Edited 2024-10-11 11:45 by phil99 Footnote added 2024-10-12 21:48 by phil99 Noticed some redundant variables and commands left over from development. in this line near the start: Dim integer m, b(N), c(N\2), dev, key, r(N*2), Tend, Toggle, Type'Type = RC6 Mode or Field delete:r(N*2), Tend, And near the end of Sub IR_RC6_Rx remove: Math set 0, b() Math set 0, c() Footnote added 2024-10-13 16:38 by phil99 Red Face Time! Math set 0, b() does serve a purpose. As the number of transitions for a fixed number of bits can vary in Manchester encoded data, there can be a left-over bit or two in b() from the previous IR input. This can result in the last bit of the Key code being a 0 instead of 1. However you don't need to set the whole array to 0. Replacing Math set 0, b() with b(43)=0 is all that is needed to fix it. Footnote added 2024-10-13 22:16 by phil99 Bought a universal remote control and programmed it for a Philips RC-6 TV and Sub IR_RC6_Rx outputs the correct codes for all the buttons! When those codes are fed into Sub IR_RC6_Tx the Rx Sub repeats them so it all works. |
||||
Marcel27 Regular Member Joined: 13/08/2024 Location: NetherlandsPosts: 53 |
At the moment I do some reading about the NEC protocol. This is very good information at a level that I can understand. The reason for this is that I bought a beautiful vintage amplifier, HK6350R, without a remote. The device had some strange problems, the volume runs high or low at random or dropped random in standby mode. The problem was the M50761 processor IC201. After I removed this chip everything worked normal albeit without remote control. Now I'm trying to add "something" to this amplifier to get the simple remote function for volume and standby back. I can drop in an Pico or Arduino but I also have some PIC-controllers lying around that I can use, such as the PIC10F200. A simple little controller. [Edit:start] But I will start with the Pico and MMbasic for a faster result. What the hack cost a Pico these days.[Edit:end] I'll keep you posted and see where the ship ends up. I'm retired and have far too many "projects" again. Edited 2024-10-11 19:34 by Marcel27 If you use AI, you lose your mind. |
||||
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 2133 |
The NEC protocol is a good choice, used on almost everything. The MMBasic version on this thread can record the required button codes of whatever spare remote you have. Those codes can then be programmed to trigger what ever output you need. |
||||
EDNEDN Senior Member Joined: 18/02/2023 Location: United StatesPosts: 117 |
@Marcel27 Please check out the JP-1 forums at http://www.hifi-remote.com/forums/ I've been a JP-1 user for 20 years. It is absolutely fantastic to be able to put any function of any device anywhere on your remote. You get complete control of things like Volume Punch Through and Channel Punch Through. (Where regardless of what device the remote is talking to... Those buttons are hard assigned to a particular device.) It is very possible they have your device's remote codes stored in their library and you just need to load them onto a JP-1 compatible remote. And you can get a 5 device JP-1 compatible remote on eBay for $7 or $8 without even trying for a good deal. I primarily use these: https://www.ebay.com/itm/286050799445 (And incidentally... If they don't have your device in the library, there are ways to have a JP-1 remote brute force send all possible command codes to your device to find the values you need to program into your remote.) Edited 2024-10-12 01:13 by EDNEDN |
||||
Marcel27 Regular Member Joined: 13/08/2024 Location: NetherlandsPosts: 53 |
@EDNEDN. If the idea I have in mind works, I can program the code from my HK AVR145 remote for volume + and - and Pon, Standby in the pico and use my HK AVR145 remote for the HK6350R. The controller chip M50761 I removed from the HK6350R controlled only volume and standby/pon and did no security checks. I can even use an Onkyo amplifier remote. The only thing I have to do is to integrate the pico in the HK6350R with all the klimbim. The HK AVR145 or HK6350R never run simultaneously and when they do I use an unused device code e.g. TAPE device button. Thanks anyway for the information , I'll check it out. Marcel If you use AI, you lose your mind. |
||||
Print this page |