Quote from: JonnyMac on September 07, 2009, 12:26:09 AM
That said, I did write a program for Disneyland last year that uses the Prop-SX to do shimmering stars. It has 16 PWM channels (one for each output) and a master PWM control of the overall brightness (allows the stars to ramp on -- they loved the effect). If you request it I will post that code in the Prop-SX forum (posting it here will cause confusion).
Jon,
I just bought an SX and an SX-key to start playing with. Would you be willing share the code you mentioned in the Prop-1 forum to do PWM control for the twinkling stars? Thanks again for all of your help!
This is advanced code; I'll share it, but don't have the patience to explain it. ;)
' =========================================================================
'
' File...... Shimmer__with_ramp.SXB
' Purpose...
' Author.... Jon Williams, EFX-TEK
' Copyright (c) 2008-2009 EFX-TEK
' Some Rights Reserved
' -- see http://creativecommons.org/licenses/by/3.0/
' E-mail.... jwilliams@efx-tek.com
' Started...
' Updated... 06 SEP 2009
'
' =========================================================================
' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
' -------------------------------------------------------------------------
' Conditional Compilation Symbols
' -------------------------------------------------------------------------
' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------
ID "Shimmer"
DEVICE SX28, OSCHS2, BOR42
FREQ 50_000_000
' -------------------------------------------------------------------------
' I/O Pins
' -------------------------------------------------------------------------
PwmHi PIN RC OUTPUT
Out16 PIN RC.7
Out15 PIN RC.6
Out14 PIN RC.5
Out13 PIN RC.4
Out12 PIN RC.3
Out11 PIN RC.2
Out10 PIN RC.1
Out9 PIN RC.0
PwmLo PIN RB OUTPUT
Out8 PIN RB.7
Out7 PIN RB.6
Out6 PIN RB.5
Out5 PIN RB.4
Out4 PIN RB.3
Out3 PIN RB.2
Out2 PIN RB.1
Out1 PIN RB.0
' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------
IsOn CON 1
IsOff CON 0
MIN_LEVEL CON 51 ' 20%
MAX_LEVEL CON 255 ' 100%
MIN_TIME CON 50 ' milliseconds
MAX_TIME CON 150
TMR_SPAN CON MAX_TIME - MIN_TIME + 1
' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------
flags VAR Byte
isrFlag VAR flags.0
pwmTemp VAR Byte
global3 VAR Byte
' -------------------------------------------------------------------------
brightness VAR Byte ' overall brightness
brAcc VAR Byte ' brightness accumulator
brIdx VAR Byte ' index for log curve
msTimer VAR Byte ' timer for 1 ms
rampTimer VAR Byte ' timer for brightness ramp
lvlTimer VAR Byte ' timer for level delay
lvlDelay VAR Byte ' level delay in ms
seed VAR Byte ' random value
channel VAR Byte ' channel pointer
level VAR Byte ' new level for channel
tmpB1 VAR Byte ' for subs/funcs
tmpB2 VAR Byte
tmpB3 VAR Byte
' -------------------------------------------------------------------------
pwmGrpLo VAR Byte (16)
level1 VAR pwmGrpLo(0)
level2 VAR pwmGrpLo(1)
level3 VAR pwmGrpLo(2)
level4 VAR pwmGrpLo(3)
level5 VAR pwmGrpLo(4)
level6 VAR pwmGrpLo(5)
level7 VAR pwmGrpLo(6)
level8 VAR pwmGrpLo(7)
acc1 VAR pwmGrpLo(8)
acc2 VAR pwmGrpLo(9)
acc3 VAR pwmGrpLo(10)
acc4 VAR pwmGrpLo(11)
acc5 VAR pwmGrpLo(12)
acc6 VAR pwmGrpLo(13)
acc7 VAR pwmGrpLo(14)
acc8 VAR pwmGrpLo(15)
pwmGrpHi VAR Byte (16)
level9 VAR pwmGrpHi(0)
level10 VAR pwmGrpHi(1)
level11 VAR pwmGrpHi(2)
level12 VAR pwmGrpHi(3)
level13 VAR pwmGrpHi(4)
level14 VAR pwmGrpHi(5)
level15 VAR pwmGrpHi(6)
level16 VAR pwmGrpHi(7)
acc9 VAR pwmGrpHi(8)
acc10 VAR pwmGrpHi(9)
acc11 VAR pwmGrpHi(10)
acc12 VAR pwmGrpHi(11)
acc13 VAR pwmGrpHi(12)
acc14 VAR pwmGrpHi(13)
acc15 VAR pwmGrpHi(14)
acc16 VAR pwmGrpHi(15)
' =========================================================================
INTERRUPT NOPRESERVE 200_000 ' (3) 5 uS
' =========================================================================
Mark_ISR:
\ SETB isrFlag ' (1)
' ----------------------------
' Master brightness controller
' ----------------------------
'
Brightness_Control:
ASM
CJB brAcc, brightness, Update_BrAcc ' (4/6)
MODE $0F ' (1)
MOV !RB, #%1111_1111 ' (2)
MOV !RC, #%1111_1111 ' (2)
Update_BrAcc:
INC brAcc ' (1)
MOV W, ++brAcc ' (1)
JNZ Bright_Exit ' (2/4)
CLR brAcc ' (1)
TEST brightness ' (1)
JZ Bright_Exit ' (3)
MODE $0F ' (1)
MOV !RB, #%0000_0000 ' (2)
MOV !RC, #%0000_0000 ' (2)
Bright_Exit:
ENDASM
' ---------------
' PWM Controllers
' ---------------
'
Pwm_Group_Lo:
ASM
BANK pwmGrpLo ' (1)
ADD acc1, level1 ' (2)
RR pwmTemp ' (1)
ADD acc2, level2 ' (2)
RR pwmTemp ' (1)
ADD acc3, level3 ' (2)
RR pwmTemp ' (1)
ADD acc4, level4 ' (2)
RR pwmTemp ' (1)
ADD acc5, level5 ' (2)
RR pwmTemp ' (1)
ADD acc6, level6 ' (2)
RR pwmTemp ' (1)
ADD acc7, level7 ' (2)
RR pwmTemp ' (1)
ADD acc8, level8 ' (2)
RR pwmTemp ' (1)
MOV PwmLo, pwmTemp ' (2)
ENDASM
Pwm_Group_Hi:
ASM
BANK pwmGrpHi ' (1)
ADD acc9, level9 ' (2)
RR pwmTemp ' (1)
ADD acc10, level10 ' (2)
RR pwmTemp ' (1)
ADD acc11, level11 ' (2)
RR pwmTemp ' (1)
ADD acc12, level12 ' (2)
RR pwmTemp ' (1)
ADD acc13, level13 ' (2)
RR pwmTemp ' (1)
ADD acc14, level14 ' (2)
RR pwmTemp ' (1)
ADD acc15, level15 ' (2)
RR pwmTemp ' (1)
ADD acc16, level16 ' (2)
RR pwmTemp ' (1)
MOV PwmHi, pwmTemp ' (2)
ENDASM
ISR_Exit:
RETURNINT ' (4)
' -------------------------------------------------------------------------
' Subroutine / Function Declarations
' -------------------------------------------------------------------------
RANDOMIZE FUNC 1, 1, 1, Byte, Byte, Byte
LIMIT FUNC 1, 3, 3, Byte, Byte, Byte
' =========================================================================
PROGRAM Start
' =========================================================================
Start:
PLP_A = %0000 ' pull-ups on unused pins
seed = 25 ' setup random #
brightness = 0 ' min brightness
isrFlag = 0 ' wait for next
Main:
IF isrFlag = 0 THEN Main ' wait for isr tick
isrFlag = 0 ' reset for next one
Update_MS_Timer:
INC msTimer ' update ms timer
IF msTimer < 200 THEN Main ' wait for 1 millsecond
msTimer = 0 ' reset for next
Update_Ramp:
IF brightness < 255 THEN
INC rampTimer
IF rampTimer = 20 THEN ' 20 ms per step = ~5.1 seconds
INC brIdx
READ Log_Curve + brIdx, brightness ' non-linear brightness curve
rampTimer = 0
ENDIF
ENDIF
Shimmer:
INC lvlTimer ' update the level timer
IF lvlTimer = lvlDelay THEN ' reached delay time?
FOR channel = 0 TO 7
seed = RANDOMIZE seed
pwmGrpLo(channel) = LIMIT seed, MIN_LEVEL, MAX_LEVEL
seed = RANDOMIZE seed
pwmGrpHi(channel) = LIMIT seed, MIN_LEVEL, MAX_LEVEL
NEXT
seed = RANDOMIZE seed
lvlDelay = seed // TMR_SPAN
lvlDelay = lvlDelay + MIN_TIME
lvlTimer = 0
ENDIF
GOTO Main
' -------------------------------------------------------------------------
' Subroutine / Function Code
' -------------------------------------------------------------------------
' Use: result = RANDOMIZE seed
'
FUNC RANDOMIZE
ASM
MOV __PARAM2, #3 ' run 3x
RND_Loop:
MOV W, __PARAM1 ' RANDOM __PARAM1
ADD __PARAM1, W
ADD __PARAM1, W
ADD __PARAM1, W
ADD __PARAM1, W
ADD __PARAM1, #123
DJNZ __PARAM2, @RND_Loop
ENDASM
ENDFUNC
' -------------------------------------------------------------------------
' Use: result = LIMIT value, min, max
'
FUNC LIMIT
ASM
Check_Lo:
CJAE __PARAM1, __PARAM2, @Check_Hi ' abort if >= min
MOV __PARAM1, __PARAM2 ' else __PARAM1 = min
JMP @Limit_Exit
Check_Hi:
CJBE __PARAM1, __PARAM3, @Limit_Exit ' abort if <= max
MOV __PARAM1, __PARAM3 ' else __PARAM1 = max
Limit_Exit:
ENDASM
ENDFUNC
' -------------------------------------------------------------------------
' User Data
' -------------------------------------------------------------------------
Log_Curve:
DATA 000, 000, 000, 000, 000, 000, 000, 000
DATA 000, 000, 000, 000, 000, 000, 000, 000
DATA 001, 001, 001, 001, 001, 001, 001, 002
DATA 002, 002, 002, 002, 003, 003, 003, 003
DATA 004, 004, 004, 004, 005, 005, 005, 005
DATA 006, 006, 006, 007, 007, 007, 008, 008
DATA 009, 009, 009, 010, 010, 011, 011, 011
DATA 012, 012, 013, 013, 014, 014, 015, 015
DATA 016, 016, 017, 017, 018, 018, 019, 019
DATA 020, 020, 021, 022, 022, 023, 023, 024
DATA 025, 025, 026, 027, 027, 028, 029, 029
DATA 030, 031, 031, 032, 033, 033, 034, 035
DATA 036, 036, 037, 038, 039, 040, 040, 041
DATA 042, 043, 044, 044, 045, 046, 047, 048
DATA 049, 050, 050, 051, 052, 053, 054, 055
DATA 056, 057, 058, 059, 060, 061, 062, 063
DATA 064, 065, 066, 067, 068, 069, 070, 071
DATA 072, 073, 074, 075, 076, 077, 079, 080
DATA 081, 082, 083, 084, 085, 087, 088, 089
DATA 090, 091, 093, 094, 095, 096, 097, 099
DATA 100, 101, 102, 104, 105, 106, 108, 109
DATA 110, 112, 113, 114, 116, 117, 118, 120
DATA 121, 122, 124, 125, 127, 128, 129, 131
DATA 132, 134, 135, 137, 138, 140, 141, 143
DATA 144, 146, 147, 149, 150, 152, 153, 155
DATA 156, 158, 160, 161, 163, 164, 166, 168
DATA 169, 171, 172, 174, 176, 177, 179, 181
DATA 182, 184, 186, 188, 189, 191, 193, 195
DATA 196, 198, 200, 202, 203, 205, 207, 209
DATA 211, 212, 214, 216, 218, 220, 222, 224
DATA 225, 227, 229, 231, 233, 235, 237, 239
DATA 241, 243, 245, 247, 249, 251, 253, 255
No worries... I think I can figure it out. :) Thanks!