Ziel dieser Demo ist es, ein PWM Signal an einem RC-Glied in Gang zu setzen.

P2.5 -- R --x-- C -- GND

Das Forthwort TEST zeigt wie der Pegel an x im RC_Glied rauf und runter gestellt werden kann.

Interaktiv geht es auch. Das Forthwort GO nimmt zwei Werte vom Stack, Periodendauer und Pulsweite. Ein so gestartetes PWM Signal kann dann manuell in der Pulsweite verändert werden, indem man einen anderen Wert in das Register TA1CCR2 schreibt. Versuche einige:

100 50 GO
80 TA1CCR2 !
10 TA1CCR2 !
\ PWM an RC-Glied mk10112012
\ based on:
\ PWM   DB 2012-0704 1:30AM 
\ Thanks to Dirk for figuring out how PWM works at pin P2.2 or P2.5

\ some labels
HEX
 20 CONSTANT BIT5 
 30 CONSTANT MC_3     \ Timer A mode control: 3 - Up/Down 
 C0 CONSTANT OUTMOD_6 \ toggle-set
192 CONSTANT TA1CCR0
196 CONSTANT TA1CCR2
186 CONSTANT TA1CCTL2
180 CONSTANT TA1CTL
  6 CONSTANT TACLR
200 CONSTANT TASSEL_2
 2A CONSTANT P2DIR
 2E CONSTANT P2SEL

\ handle timer A1
  DECIMAL  
: TA1HALT  0 TA1CTL !  ;             \ timer anhalten
: SETTA1 ( n1 n2 -- ) 
    ta1halt
    TA1CCR2 !                        \ set pulsewidth
    TA1CCR0 !                        \ set time of period
    OUTMOD_6 TA1CCTL2 !              \ CCR2 reset/set
    TASSEL_2 MC_3 + TACLR + TA1CTL ! \ SMCLK, up mode, clear TAR
    ;

\ init portpin P2.5 as PWM output
: PWMOUT   BIT5 P2DIR  CSET   BIT5 P2SEL  CSET ;

: go ( n1 n2 -- ) pwmout setta1 ; \ Tastverhältnis angeben.
: stop   ta1halt  BIT5 P2DIR CCLR ;

: runter  ( von bis -- ) swap DO i ta1ccr2 !  10 ms     LOOP ;  
: rauf    ( von bis -- )      DO i ta1ccr2 !  10 ms -1 +LOOP ;
: test    200 100 go  begin 10 180 runter  10 180 rauf  key? until stop ; 

( finis )