Hi all, I made a RGB LED lamp with super bright RGB LEDs from sparkfun and control the color from my TV remote. I use 16F628s X2 because I couldnt get pulsein to work with MIBAM (inturupt timming issue) Here is the code if it will help anyone. Its not real clean but it works well
Aaron
IR CODE
Code:
'****************************************************************
'* Name : IR_RGB_ControlV2
'* Author : Aaron E.Wilson
'* Notice : Copyright (c) 2009
'* : All Rights Reserved
'* Date : 2/21/2009
'* Version : 1.0
'* Notes : Sets RGB select ports and UP/DN ports from IR remote
'* :
'****************************************************************
define osc 4
CMCON = 7 ' PortA = digital I/O
VRCON = 0 ' A/D Voltage reference disabled
TRISA = %00000010 ' Set PortA I/O
TRISB = %00000000 ' Set PortB I/O
PORTA = 0 ' Clear PortA
PORTB = 0 ' Clear PortB
IRpulse_length var word(13)
xx var Byte
Command Var Byte
Device Var Byte 'IR Chip---------RGB Chip
IR_IN var PORTA.1 'Pin 18 N/A
RED_SEL var PORTB.1 'Pin 7 Pin 18
BLUE_SEL var PORTB.2 'Pin 8 Pin 3
GREEN_SEL var PORTB.3 'Pin 9 Pin 17
UP var PORTB.5 'Pin 11 Pin 1
DN var PORTB.4 'Pin 10 Pin 2
pause 500
Main:
gosub ReadIr
if command = 1 then RED_Adj
if command = 2 then BLUE_Adj
if command = 3 then GREEN_Adj
goto Main
Red_Adj:
blue_sel = 0
Green_sel = 0
red_sel = 1
gosub ReadIr
if command = 17 then
dn = 0
up = 1
pause 100
up = 0
endif
if command = 18 then
up = 0
dn = 1
pause 100
dn = 0
endif
if command = 2 then BLUE_Adj
if command = 3 then GREEN_Adj
goto red_adj
BLUE_Adj:
red_sel = 0
green_sel = 0
blue_sel = 1
gosub ReadIr
if command = 17 then
dn = 0
up = 1
pause 100
up = 0
endif
if command = 18 then
up = 0
dn = 1
pause 100
dn = 0
endif
if command = 1 then red_Adj
if command = 3 then GREEN_Adj
goto blue_adj
GREEN_Adj:
red_sel = 0
Blue_sel = 0
green_sel = 1
gosub ReadIr
if command = 17 then
dn = 0
up = 1
pause 100
up = 0
endif
if command = 18 then
up = 0
dn = 1
pause 100
dn = 0
endif
if command = 2 then BLUE_Adj
if command = 1 then red_Adj
goto green_adj
ReadIR:
PuLSIN IR_IN,0,IRpulse_length(0)
if IRpulse_length(0) < 200 then
goto ReadIR
Endif
for xx=1 to 12
pulsin ir_in,0,IRpulse_length(xx)
next xx
if IRpulse_length(1) < 100 then
Command.bit0 = 0
Else
Command.bit0 = 1
endif
if IRpulse_length(2) < 100 then
Command.bit1 = 0
Else
Command.bit1 = 1
endif
if IRpulse_length(3) < 100 then
Command.bit2 = 0
Else
Command.bit2 = 1
endif
if IRpulse_length(4) < 100 then
Command.bit3 = 0
Else
Command.bit3 = 1
endif
if IRpulse_length(5) < 100 then
Command.bit4 = 0
Else
Command.bit4 = 1
endif
if IRpulse_length(6) < 100 then
Command.bit5 = 0
Else
Command.bit5 = 1
endif
if IRpulse_length(7) < 100 then
Command.bit6 = 0
Else
Command.bit6 = 1
endif
Command.bit7 = 0
Command = Command + 1
If Command = 10 then
Command = 0
Endif
if IRpulse_length(8) < 100 then
Device.bit0 = 0
Else
Device.bit0 = 1
endif
if IRpulse_length(9) < 100 then
Device.bit1 = 0
Else
Device.bit1 = 1
endif
if IRpulse_length(10) < 100 then
Device.bit2 = 0
Else
Device.bit2 = 1
endif
if IRpulse_length(11) < 100 then
Device.bit3 = 0
Else
Device.bit3 = 1
endif
return
DebugInfo:
SEROUT2 PORTA.0,16780,[13]
pause 100
SEROUT2 PORTA.0,16780,[10]
pause 100
SEROUT2 PORTA.0,16780,["Device ", dec Device, " Command ", dec command]
pause 100
return
end
MIBAM CODE
Code:
'****************************************************************
'* Name : Adj_Color
'* Author : Aaron E.Wilson
'* Notice : Copyright (c) 2009
'* : All Rights Reserved
'* Date : 2/22/2009
'* Version : Final
'* Notes :
'* :
'****************************************************************
;_________________________Interrupt Context save locations]_________________
wsave var byte $20 SYSTEM ' location for W if in bank0
wsave1 VAR BYTE $A0 SYSTEM ' location for W if in bank1
wsave2 VAR BYTE $120 SYSTEM ' location for W if in bank2
ssave VAR BYTE BANK0 SYSTEM ' location for STATUS register
psave VAR BYTE BANK0 SYSTEM ' location for PCLATH register
;----[ MIBAM Setup ]--------------------------------------------------------
BAM_COUNT CON 3 ; How many BAM Pins are used?
INCLUDE "MIBAM.pbp" ; Mirror Image BAM module
RED VAR BYTE
GREEN VAR BYTE
BLUE VAR BYTE
ASM
BAM_LIST macro ; Define PIN's to use for BAM
BAM_PIN (PORTB,0, GREEN) ; Pin 6
BAM_PIN (PORTB,1, BLUE) ; Pin 7
BAM_PIN (PORTB,2, RED) ; Pin 8
endm
BAM_INIT BAM_LIST ; Initialize the Pins
ENDASM
;----[ Chip Setup ]--------------------------------------------------------
define osc 4
CMCON = 7 ' PortA = digital I/O
VRCON = 0 ' A/D Voltage reference disabled
TRISA = %00011111 ' Set PortA I/O
TRISB = %11111000 ' Set PortB I/O
PORTA = 0 ' Clear PortA
PORTB = 0 ' Clear PortB
;----[ Adjustment Setup ]-------------------------------------------------
RED_VAL var byte
GREEN_VAL var byte
BLUE_VAL var byte
UP_SEL var bit
DN_SEL var bit
RED_PORT var PORTA.1 'Pin 18
GREEN_PORT var PORTA.0 'Pin 17
BLUE_PORT var PORTA.4 'Pin 3
UP_PORT var PORTA.2 'Pin 1
DN_PORT var PORTA.3 'Pin 2
;----[ Inital Settings ]--------------------------------------------------
RED_VAL = 0
GREEN_VAL = 0
BLUE_VAL = 0
;----[ Program ]----------------------------------------------------------
Main:
gosub led
gosub Adjust
goto main
Adjust:
if PORTA = 0 then main
Red_Up:
if red_val > 250 then red_dn
if red_port = 1 and up_port = 1 then
red_val = red_val +1
pause 100
endif
Red_Dn:
if red_val = 0 then green_up
if red_port = 1 and dn_port = 1 then
red_val = red_val -1
pause 100
endif
Green_Up:
if green_val > 250 then green_dn
if green_port = 1 and up_port = 1 then
green_val = green_val +1
pause 100
endif
Green_Dn:
if green_val = 0 then blue_up
if green_port = 1 and dn_port = 1 then
green_val = green_val -1
pause 100
endif
Blue_Up:
if Blue_val > 250 then BLue_dn
if Blue_port = 1 and up_port = 1 then
Blue_val = Blue_val +1
pause 100
endif
Blue_Dn:
if Blue_val = 0 then main
if BLue_port = 1 and dn_port = 1 then
Blue_val = Blue_val -1
pause 100
endif
goto main
LED:
red = red_val
pause 20
blue = blue_val
pause 20
green = green_val
pause 20
return
end
Bookmarks