|
Hi All I wonder if anyone could help with the enclosed code running on a Stamp BS2. I think the big problem is the Ir code timing but would be gratefull for any help.
' {$STAMP BS2}
declarations:
DIRS = %0000000000000001
i CON 254 clr CON 1 line1 CON 128 line2 CON 192 'baud CON 396+$4000 'SE Display - 9600 Baud baud CON 84+$4000 lcd CON 11 IR_in CON 1 IR_detect VAR Bit IR_pulse VAR Word(8) IR_word VAR Byte index VAR Byte prev VAR Byte counter VAR Nib mute VAR Nib tapemon VAR Nib power VAR Nib volume VAR Byte setting VAR Byte drc VAR Nib new VAR Nib old VAR Nib
'-------------------------------------------- initialize:
old.BIT0=IN2 old.BIT1=IN3
PAUSE 2000 volume = 0 SEROUT lcd,baud,[i,clr] prev = 99 LOW 7 PAUSE 10 SHIFTOUT 6, 5, MSBFIRST, [volume8,volume8] PAUSE 10 HIGH 7
'-------------------------------------------- main:
GOSUB encoder GOSUB ir_scan
GOTO main
'-------------------------------------------- ir_scan:
IR_detect=IN1 IF IR_detect = 1 THEN end_ir_scan GOSUB startbit GOSUB get_pulse_stream GOSUB decode GOSUB function
end_ir_scan
RETURN
'-------------------------------------------- encoder:
new.BIT0=IN2 new.BIT1=IN3 IF new=old THEN end_encoder drc=(new^old)&3 IF power = 0 THEN end_encoder IF drc = 1 THEN countdown IF drc = 2 THEN countup
countdown: IF volume=0 THEN continue volume = volume - 1 old=new GOTO set_volume GOTO end_encoder
countup: IF volume=255 THEN continue volume = volume + 1 old=new GOTO set_volume GOTO end_encoder
continue: old=new GOTO end_encoder
end_encoder:
RETURN
'-------------------------------------------- startbit:
FOR counter = 0 TO 15 PULSIN IR_in,0,IR_pulse(0) IF IR_pulse(0) > 900 THEN startbit_detected NEXT
startbit_detected
RETURN
'--------------------------------------------- get_pulse_stream:
find_stopbit: PULSIN IR_in,1,IR_pulse(0) IF IR_pulse(0) > 1400 AND IR_pulse(0) <> 0 THEN decodebits GOTO find_stopbit
decodebits: PULSIN IR_in,0,IR_pulse(0) PULSIN IR_in,0,IR_pulse(1) PULSIN IR_in,0,IR_pulse(2) PULSIN IR_in,0,IR_pulse(3) PULSIN IR_in,0,IR_pulse(4) PULSIN IR_in,0,IR_pulse(5) PULSIN IR_in,0,IR_pulse(6) PULSIN IR_in,0,IR_pulse(7)
RETURN
'--------------------------------------------- decode:
FOR counter = 0 TO 7 LOOKDOWN IR_pulse(counter),< [400,800], IR_word.LOWBIT(counter) NEXT IF (IR_word > 191) THEN main 'ignore codes to high IF (IR_word < 128) THEN main 'ignore code to low IF (IR_word = 128) THEN valid_code 'one IF (IR_word = 129) THEN valid_code 'two IF (IR_word = 130) THEN valid_code 'three IF (IR_word = 131) THEN valid_code 'four IF (IR_word = 132) THEN valid_code 'five IF (IR_word = 133) THEN valid_code 'six IF (IR_word = 134) THEN valid_code 'seven IF (IR_word = 135) THEN valid_code 'eight IF (IR_word = 136) THEN valid_code 'nine IF (IR_word = 137) THEN valid_code 'zero IF (IR_word = 144) THEN valid_code 'channel up IF (IR_word = 145) THEN valid_code 'channel dn IF (IR_word = 146) THEN valid_code 'volume up IF (IR_word = 147) THEN valid_code 'volume dn IF (IR_word = 148) THEN valid_code 'mute IF (IR_word = 149) THEN valid_code 'power IF (IR_word = 187) THEN valid_code 'Back - Tapemon IF (IR_word = 191) THEN valid_code 'Info GOTO main
valid_code: index=IR_word & %01111111
RETURN
'--------------------------------------------- set_volume:
setting = ABS((1 */ 8192) - (127 - ABS(128 */ volume))) 'debug " ", "Volume = ", dec setting, ".", dec1 setting, dec2 setting, " ", "dB", cr LOW 7 PAUSE 10 SHIFTOUT 6, 5, MSBFIRST, [volume8,volume8] PAUSE 10 HIGH 7 SEROUT lcd,baud,[i,192, "Volume"] SEROUT lcd,baud,[i,201, "-", DEC setting,".",DEC1 setting,"dB"]
RETURN
'--------------------------------------------- function:
IF (index ^ 21 = 0) | (power = 0) THEN complete IF (index < 10) THEN numb_keys IF (index > 10) THEN func_keys
numb_keys: LOOKDOWN index, [0,1,2,3,4,5,6,7,8,9], index IF (index = prev) THEN complete IF (index > 2) THEN complete DIRS = %0100000000000001 prev = index BRANCH index, [S0,S1,S2,S3,S4,S5,S6,S7,S8,S9]
func_keys: LOOKDOWN index, [11,16,17,18,19,20,21,59,63], index BRANCH index, [S10,S11,S12,S13,S14,S15,S16,S17,S18]
S0: 'debug "P10 - Input One", cr SEROUT lcd,baud,[i,clr] PAUSE 1 SEROUT lcd,baud,[i,128,"Button One"] HIGH 10 GOTO complete
S1: 'debug "P11 - Input Two", cr SEROUT lcd,baud,[i,clr] PAUSE 1 SEROUT lcd,baud,[i,128,"Button Two"] HIGH 11 GOTO complete
S2: 'debug "P12 - Input Three", cr SEROUT lcd,baud,[i,clr] PAUSE 1 SEROUT lcd,baud,[i,128,"Button Three"] HIGH 12 GOTO complete
S3: DEBUG "P12 - Input Three", CR SEROUT lcd,baud,[i,clr] PAUSE 1 SEROUT lcd,baud,[i,128,"Button Four"] HIGH 13
GOTO complete
S4: GOTO complete
S5: GOTO complete
S6: GOTO complete
S7: GOTO complete
S8: GOTO complete
S9: GOTO complete
S10: GOTO complete
S11: index = prev + 1 PAUSE 250 SEROUT lcd,baud,[i,clr] SEROUT lcd,baud,["Channel Up"] GOTO numb_keys
S12: index = prev - 1 PAUSE 250 SEROUT lcd,baud,[i,clr] SEROUT lcd,baud,["Channel Down"] GOTO numb_keys
S13: IF (volume >= 255) THEN complete volume = volume + 1 GOTO set_volume
GOTO complete
S14: IF (volume <= 1) THEN complete volume = volume - 1 GOTO set_volume
GOTO complete
S15: mute = mute + 1 IF mute = 2 THEN mute_off SEROUT lcd,baud,[i,line2,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] SEROUT lcd,baud,[i,192,"Mute"] HIGH 8 'debug "mute on", cr RETURN mute_off: mute = 0 SEROUT lcd,baud,[i,line2,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] SEROUT lcd,baud,[i,192, "Volume"] SEROUT lcd,baud,[i,201, "-", DEC setting,".",DEC1 setting,"dB"] LOW 8 'debug "mute off", cr GOTO complete
S16: power = power + 1 IF power = 2 THEN power_off 'debug "Power On", cr SEROUT lcd,baud,[i,clr] HIGH 8 PAUSE 1000 HIGH 14 SEROUT lcd,baud,[i,128,"Hello"] prev = 0 PAUSE 1000 LOW 8 GOTO S0 power_off 'debug "Power Off", cr SEROUT lcd, baud, [i,clr] PAUSE 1 SEROUT lcd, baud, [i,128,"Good Bye"] PAUSE 3000 SEROUT lcd, baud, [i,clr] PAUSE 100 DIRS = %0000000000000001 volume = 0 LOW 7 PAUSE 10 SHIFTOUT 6, 5, MSBFIRST, [volume8,volume8] PAUSE 10 HIGH 7 power = 0 RETURN
S17: tapemon = tapemon + 1 IF tapemon = 2 THEN tapemon_off 'debug "Tapemon - On", cr SEROUT lcd,baud,[i,line2,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] SEROUT lcd,baud,[i,192,"Tape Monitor"] HIGH 9 GOTO complete tapemon_off: 'debug "Tapemon - Off",cr tapemon = 0 SEROUT lcd,baud,[i,line2,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] SEROUT lcd,baud,[i,192, "Volume"] SEROUT lcd,baud,[i,201, "-", DEC setting,".",DEC1 setting,"dB"] LOW 9 GOTO complete
S18: GOTO complete
complete:
RETURN END
|