Help, "PwmAddr" is "address of PWM variables in hub ram", please.
bteddy
Posts: 65
in Propeller 1
I found a piece of code and was reading thru it when I ran into something I didn't understand.
In the PUB section the parameters in the start call are pin, Freq and PwmAddr.
The code is commented stating that "PwmAddr" is "address of PWM variables in hub ram".
I could not find any reference to "PWM variables" in the forum.
Would someone explain this, or point me to documentation?
Thank You
In the PUB section the parameters in the start call are pin, Freq and PwmAddr.
The code is commented stating that "PwmAddr" is "address of PWM variables in hub ram".
I could not find any reference to "PWM variables" in the forum.
Would someone explain this, or point me to documentation?
Thank You
}} VAR long cog PUB start(pin,Freq,PwmAddr) : okay | pmask ' pin number (first of two adjacent pins), frequency in Hz, address of PWM variables in hub ram T_ := clkfreq/(Freq) pin_ := pin okay := cog := cognew(@entry, PwmAddr) + 1 ' Start cog PUB getT ' This is the period of the PWM which is also the resolution, lower PWM frequencies give more resolution. return T_ PUB stop if cog cogstop(cog~ - 1) DAT entry shl pmask_,pin_ or dira,pmask_ ' Set pins as outputs mov pwmaddr1_,par ' Set up pointers to duty data mov pwmaddr2_,pwmaddr1_ add pwmaddr2_,#4 mov t1, ctraval add t1, pin_ ' set up counter A mov frqa, #0 mov ctra, t1 ' nco mode on step pin mov t1, ctrbval add pin_, #1 add t1, pin_ ' set up counter B mov frqb, #0 mov ctrb, t1 ' nco mode on step pin mov frqa,#1 mov frqb,#1 mov time,cnt add time,T_ ' PWM loop :loop { Place other code here, as long as it takes less time than T_, roughly clkfreq/(4*(Freq)) instructions That's about 2000 instructions at 10khz PWM frequency :) } rdlong duty1_,pwmaddr1_ ' Read duty1 from hub ram rdlong duty2_,pwmaddr2_ ' Read duty2 from hub ram waitcnt time, T_ neg phsa, duty1_ neg phsb, duty2_ jmp #:loop time long 0 pmask_ long %11 ' Pin mask pin_ long 0 duty1_ long 0 duty2_ long 0 T_ long 0 ' Time period ctraval long %00100 << 26 ctrbval long %00100 << 26 t1 long 0 pwmaddr1_ long 0 pwmaddr2_ long 0 p long 0
Comments
instantiated more than once so its normal to pass in a pointer to working memory. I presume this memory
is live - ie can be written to to dynamically change the behaviour of the cog. Note the rdlong's into the duty1/2
variables.
The parameter would be @duty0 -- @ provides the run-time address of an object.
The code is taking advantage of the counters for dual PWM output. I've attached an object I wrote to do the same thing, though it may be easier to use because it's in Spin. Note, though, that using Spin to create the period timing for the desired frequency limits the upper end of the frequency to about 38kHz when running a standard 80MHz clock.
Unless you use fastspin, of course