\ Stroboskop
\ based on:
\ PWM mk18082012
\ PWM   DB 2012-0704 1:30AM \ adapted to 2kHz DB 2012-0722
\ Thanks to Dirk for figuring out how PWM works at pin P2.2
\ MSP430G2553 LaunchPad.

\ some labels
BIN  
( FEDCBA9876543210 ruler )
            100000 CONSTANT BIT5 
            110000 CONSTANT MC_3   \ Timer A mode control: 3 - Up/Down 
          11000000 CONSTANT OUTMOD_6 \ toggle-set
               110 CONSTANT TACLR  \ TA an, IE an.
        1000000000 CONSTANT SMCLK  \ clock source
          11000000 CONSTANT ID/8   \ clock input divider
HEX
192 CONSTANT TA1CCR0
196 CONSTANT TA1CCR2
186 CONSTANT TA1CCTL2
180 CONSTANT TA1CTL

 2A CONSTANT P2DIR
 2E CONSTANT P2SEL

\ handle timer A1, ID/8 --> long periods
: TA1HALT  0 TA1CTL !  ; 
: TA1SET ( n1 n2 -- ) \ puls width, period
    ta1halt  TA1CCR2 !  TA1CCR0 !
    OUTMOD_6 TA1CCTL2 ! 
    SMCLK MC_3 + TACLR + ID/8 +  TA1CTL ! ;

\ PWM at P2.5
: AN    bit5 p2dir cset  bit5 p2sel cset ;
: AUS   bit5 p2dir cclr ;
: +PWM  ( n1 n2 -- ) an  ta1set ;
: -PWM  ta1halt  aus ;

DECIMAL
 4750 dup 1 rshift 2CONSTANT  100HZ
47500 dup 1 rshift 2CONSTANT  10HZ

: hoeher  
  TA1CCR0 @ 100 -
  dup 0= IF DROP 10hz +pwm exit THEN 
  dup 1 rshift TA1CCR2 ! TA1CCR0 ! ;  
: sweep  10hz +pwm begin 50 ms hoeher key? until  ;

( finis )

Hinweis: 4e4th basiert auf CamelForth und hat eine 16Bit zweier Komplement Rechnung. Daher klappt 2/ bei Zahlen ab $8000 nicht mehr. Aber mit einem Rechtsshift kann man ja auch durch 2 teilen.