Trouble with a PING Ultra Sonic Distance sensor
Copper
Posts: 48
Preface: I have no Idea what I'm doing.
Now that we got that out of the way...
I picked up one of parallax's PING sensors just to fool around with while my other projects stew a little, but immediatly ran into trouble (inter-cog communication failure is my guess).
First I wrote a simple bit of code to use the driver provided here
which worked, so I know my PING sensor is functional and properly connected
Then I decided to try and integrate the PING sensor into a silly little synth object I had been fussing with earlier. Originally it used two Potentiometers to control the frequency, now I'm trying to use the PING sensor (for absolutely no reason other than to go through the exercise).
Unfortunately I've broken the PING sensor method such that it only returns one value (00000000000000000000010110010000), and I cannot for the life of me figure out what's wrong. I would very much appreciate whatever theories you may have, so that I can avoid creating the same problem in the future.
as always, thank you very much for your time.
Now that we got that out of the way...
I picked up one of parallax's PING sensors just to fool around with while my other projects stew a little, but immediatly ran into trouble (inter-cog communication failure is my guess).
First I wrote a simple bit of code to use the driver provided here
which worked, so I know my PING sensor is functional and properly connected
Then I decided to try and integrate the PING sensor into a silly little synth object I had been fussing with earlier. Originally it used two Potentiometers to control the frequency, now I'm trying to use the PING sensor (for absolutely no reason other than to go through the exercise).
Unfortunately I've broken the PING sensor method such that it only returns one value (00000000000000000000010110010000), and I cannot for the life of me figure out what's wrong. I would very much appreciate whatever theories you may have, so that I can avoid creating the same problem in the future.
CON _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 Ping_Pin = 15 OBJ pst : "Parallax Serial Terminal" VAR long ping_stack[30] long debug_stack[30] DAT time long 0 distance long 0 frequency long 0 x long 0 ping_cog byte 0 debug_cog byte 0 PUB Main debug_cog:=cognew(debug, @debug_stack[0]) ping_cog:= cognew(ticks(Ping_Pin), @ping_stack[0]) repeat x|=(distance) frequency:=x 'Synth("A", 4, frequency) 'Synth({Counter"A" or Counter"B"},Pin, Freq) PUB Synth(CTR_AB, Pin, Freq) | s, d, ctr, frq Freq := Freq #> 0 <# 128_000_000 'limit frequency range if Freq < 500_000 'if 0 to 499_999 Hz, ctr := constant(100 << 26) 'set NCO mode ( desired mode 100 shifted 26bits left into ctr-mode register [30..26] ) s := 1 '..shift = 1 else 'if 500_000 to 128_000_000 Hz, ctr := constant(010 << 26) '..set PLL mode d := >|((Freq - 1) / 1_000_000) 'determine PLLDIV s := 4 - d 'determine shift ctr |= d << 23 'set PLLDIV frq := frqfraction(Freq, CLKFREQ, s) 'Compute FRQA/FRQB value ctr |= Pin 'set PINA to complete CTRA/CTRB value if CTR_AB == "A" CTRA := ctr 'set CTRA FRQA := frq 'set FRQA DIRA[Pin]~~ 'make pin output if CTR_AB == "B" CTRB := ctr 'set CTRB FRQB := frq 'set FRQB DIRA[Pin]~~ 'make pin output PUB frqfraction(a, b, shift) : f if shift > 0 'if shift, pre-shift a or b left a <<= shift 'to maintain significant bits while if shift < 0 'insuring proper result b <<= -shift repeat 32 'perform long division of a/b f <<= 1 if a => b a -= b f++ a <<= 1 PUB Ticks(Pin) | cnt1, cnt2 ''Return Ping)))'s one-way ultrasonic travel time in microseconds repeat outa[Pin]~ ' clear I/O Pin dira[Pin]~~ ' make Pin Output outa[Pin]~~ ' set I/O Pin outa[Pin]~ ' clear I/O Pin (> 2 microsecond pulse) dira[Pin]~ ' make I/O Pin Input waitpne(0, |< Pin, 0) ' wait For Pin To Go HIGH cnt1 := cnt ' store Current Counter Value waitpeq(0, |< Pin, 0) ' wait For Pin To Go LOW cnt2 := cnt ' store New Counter Value time := ((||(cnt1 - cnt2) / (clkfreq / 1_000_000)) >> 1) ' store Time in microseconds distance := (time * 10_000) / 29_034 ' store distance in (millimeters) PUB Debug pst.Start(57600) waitcnt(clkfreq+cnt) repeat pst.str(string(13)) pst.bin(distance, 32) waitcnt(clkfreq/4+cnt)
as always, thank you very much for your time.