November 27, 2024, 09:57:42 AM

News:

Got VSA?  Want to use your Prop-SX?  Now you can!  See the VSA section of the Library forum for Prop-SX code that works with VSA.


Twinkling Stars

Started by id0, September 23, 2009, 10:29:13 PM

Previous topic - Next topic

id0

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!

JonnyMac

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
Jon McPhalen
EFX-TEK Hollywood Office

id0

No worries... I think I can figure it out.  :)  Thanks!