Measure PWM
I'm trying to measure the peak time of a few pulses. I'm using the MonitorPWM.spin file demonstrated in the 'Counters' lab, (which I believe is lab 5, and is shown below). I can measure one pulse just fine, but when I try to run the object twice, passing different variable addresses, it fails. Anyone have any thoughts?
My code
Object I'm using
Thanks in advance.
My code
'PWM Monitoring
PWM_MonitorPin_x = 2
PWM_MonitorPin_y = 1
'LCD
LCD_Pin = 0 ' I/O Pin For LCD
LCD_Baud = 19_200 ' LCD Baud Rate
LCD_Lines = 4
VAR
long tHprobex, tLprobex, pulseCntx, tHprobey, tLprobey, pulseCnty
long angle
OBJ
probe : "MonitorPWM.spin"
LCD : "debug_lcd.spin"
math : "Float32.spin"
PUB main
probe.start(PWM_MonitorPin_x, @tHprobex, @tLprobex, @pulseCntx)
'probe.start(PWM_MonitorPin_y, @tHprobey, @tLprobey, @pulseCnty) Launching this second line causes the problem, if I only launch the first, it's fine.
InitializeLCD
repeat 25
LCD.gotoxy(0,0)
LCD.str(string("yo"))
LCD.decf(tHprobe, 8)
LCD.gotoxy(0,5)
LCD.decf(tLprobe, 8)
LCD.gotoxy(0,1)
LCD.decf(((tHprobe + tLprobex)/1000/80), 8)
waitcnt(clkfreq + cnt)
PUB InitializeLCD
LCD.init(LCD_Pin, LCD_Baud, LCD_Lines)
LCD.backlight(false)
LCD.cursor(0)
LCD.cls
Object I'm using
VAR
long cog, stack[noparse][[/noparse]20] ' Tip 1, global variables for cog and stack.
long apin, thaddr, tladdr, pcntaddr ' Tip 1, global variables for the process.
PUB start(pin, tHighAddr, tLowaddr, pulseCntAddr) : okay
'' Starts the object and launches PWM monitoring process into a new cog.
'' All time measurements are in terms of system clock ticks.
''
'' pin - I/O pin number
'' tHighAddr - address of long that receives the current signal high time measurement.
'' tLowAddr - address of long that receives the current signal low time measurement.
'' pulseCntAddr - address of long that receives the current count of pulses that have
'' been measured.
' Copy method's local variables to object's global variables
apin := pin ' Tip 2, copy parameters to global variables
thaddr := tHighAddr ' that the process will use.
tladdr := tLowAddr
pcntaddr := pulseCntAddr
' Launch the new cog.
okay := cog := cognew(PwmMonitor, @stack) + 1
PUB stop
'' Stop the PWM monitoring process and free a cog.
if cog
cogstop(cog~ - 1)
PRI PwmMonitor
' Tip 3, set up counter modules and I/O pin configurations(from within the new cog!)
ctra[noparse][[/noparse]30..26] := %01000 ' POS detector
ctra[noparse][[/noparse]5..0] := apin ' I/O pin
frqa := 1
ctrb[noparse][[/noparse]30..26] := %01100 ' NEG detector
ctrb[noparse][[/noparse]5..0] := apin ' I/O pin
frqb := 1
phsa~ ' Clear counts
phsb~
' Set up I/O pin directions and states.
dira[noparse][[/noparse]apin]~ ' Make apin an input
' PWM monitoring loop.
repeat ' Main loop for pulse
' monitoring cog.
waitpeq(|<apin, |<apin, 0) ' Wait for apin to go high.
long[noparse][[/noparse]tladdr] := phsb ' Save tlow, then clear.
phsb~
waitpeq(0, |<apin,0) ' Wait for apin to go low.
long[noparse][[/noparse]thaddr] := phsa ' Save thigh then clear.
phsa~
long[noparse][[/noparse]pcntaddr]++ ' Increment pulse count.
Thanks in advance.

Comments
individually. This keeps their data that is stored in VAR blocks separate
Check out the Blink2 tutorial (page 136) and the Output object that it references in the prop manual
Cheers!
Paul Rowntree