Deutsch English Français Italiano |
<uu6g64$a7t1$3@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder6.news.weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: The Natural Philosopher <tnp@invalid.invalid> Newsgroups: comp.sys.raspberry-pi Subject: Re: Need help with PI PICO... Date: Fri, 29 Mar 2024 13:37:08 +0000 Organization: A little, after lunch Lines: 184 Message-ID: <uu6g64$a7t1$3@dont-email.me> References: <utn4f2$3p985$1@dont-email.me> <20240323183723.b2902fb94d75422b924c1bc7@eircom.net> <utnkjj$3t5m0$1@dont-email.me> <20240324072346.81064ff46570e669982a1f4e@eircom.net> <utp1sm$acjh$1@dont-email.me> <utrna6$113rn$3@dont-email.me> <uts6t5$163q2$1@dont-email.me> <utvgdi$2cg59$1@dont-email.me> <uu0rh5$2pcls$1@dont-email.me> <uu53c6$3tc51$1@dont-email.me> <uu66b9$83pi$3@dont-email.me> <uu6eqv$714f$2@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Fri, 29 Mar 2024 13:37:09 +0100 (CET) Injection-Info: dont-email.me; posting-host="26cac3dc2e2ba3d6cb23b9feb54ec975"; logging-data="335777"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX187+1QlNPAvmCRKr+12fX+wcRXKN4DrotM=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:MeR8Q7GWOitf59tFHrpcDYFI45E= In-Reply-To: <uu6eqv$714f$2@dont-email.me> Content-Language: en-GB Bytes: 8550 On 29/03/2024 13:14, Pancho wrote: > On 29/03/2024 10:49, The Natural Philosopher wrote: >> On 29/03/2024 00:52, Pancho wrote: >>> On 27/03/2024 10:13, The Natural Philosopher wrote: >>>> On 26/03/2024 21:58, Pancho wrote: >>>>> On 25/03/2024 15:57, The Natural Philosopher wrote: >>>>>> On 25/03/2024 11:31, Pancho wrote: >>>>>>> On 24/03/2024 11:13, The Natural Philosopher wrote: >>>>>>> >>>>>>>> However on trawling the internet I discovered a conversation >>>>>>>> with someone else *on here* (c.s.r-pi) last year, who was >>>>>>>> finding that *sleep_us(x)* was highly inconsistent for certain >>>>>>>> (small) values of x. Sometimes taking a day to end. >>>>>>>> >>>>>>>> Further investigation reveals that in fact it really is a >>>>>>>> 'sleep' with the processor being put in low power mode and >>>>>>>> requiring an interrupt to 'wake it up'. >>>>>>>> >>>>>>> >>>>>>> Why not use threads/timers, wait on a lock/semaphore rather than >>>>>>> sleep. >>>>>>> >>>>>> Good point Pancho, but I was really looking for the simplest code >>>>>> possible. Interrupts can be tricky things on a platform whose >>>>>> architecture you do not understand completely. In any case it was >>>>>> a learnning curve I preferred not to negotiate if i didnt need to >>>>>> >>>>> >>>>> A timer isn't complicated, just a call back routine, and a >>>>> semaphore. Interrupts are something an OS does, not me :o). I hate >>>>> multithread code, but async handling of an external resource is one >>>>> of the two main places I would use another thread. >>>>> >>>>> I had a look at your code, it looks extraordinarily like a python >>>>> example on Tom's hardware. >>>>> >>>> Oh. The manufacturers sample code is the source of ALL the >>>> 'examples' that other people publish as their own., I am just being >>>> honest :-) >>>> >>>>> I'm not clear how many times it is succeeding vs failing, but I >>>>> suspect you really need to bite the bullet and introduce >>>>> timeouts/error handling, if it fails try again, average out >>>>> multiple results. i.e. accept it as flawed and that results are >>>>> statistical, like GPS. >>>>> >>>> Well the averaging out will happen anyway at the server side. I make >>>> the clients as simple as possible for resilience. In practice oil >>>> levels only change quickly if you have had the oil stolen overnight >>>> or if a supplier has filled the tank up, so gross deviations can >>>> have code exceptions, the rest would be the running average of maybe >>>> 20 samples. >>>> BUT it isn't inaccuracy that worries me per se, it's that it may be >>>> an indication of underlying timing issues. >>>> >>>>> In many ways the resilience code will be simple, because it is just >>>>> normal code, rather than cargo culting a novel ultrasonic device. >>>>> >>>> In fact the code in either case is simple. >>>> >>> >>> >>> I understood the idea of a ping delay time. It is just my experience >>> that things rarely work exactly as I expect them to. >>> >>> FWIW, I'd also massively underestimated the difficulty of coding the >>> PICO, I'd assumed it was running a multitasking OS, like busybox, but >>> I see it isn't. I guess there are a whole bunch of gotchas there too. >>> >>>> It is: send a 10µs pulse to the unit, wait for the echo pulse start >>>> , get the time, wait for the echo pulse end, get the time, subtract >>>> the difference. >>>> >>> >>> I'm unclear on terms, but that sounds like the length of the pulse, >>> 10µs. Not the distance travelled by the pulse. Surely, you should be >>> measuring the time between sending the pulse and receiving the pulse. >>> I've probably misunderstood something, if the code is giving a >>> sensible distance. >>> >> No. >> Maybe ascii art will help >> >> CONTROL=10µs >> ____| |________ >> >> RETURN = wahatever >> _____|^^^^^^^^^^^^|____________ >> > > Yeah, I know what a ping is supposed to do. It is the time interval > between sending a ping and receiving the echo, simples. But... that > isn't what your code looks like. > > You have: > > while(!gpio_get(ULTRASONIC_IN)); > //read clock and store > start=get_absolute_time (); > > Which is presumably waiting for silence, no echo, it might work if that > is the default start state, i.e. if it does nothing, but it is > redundant. You should start the time interval when the ping is sent. > That is what the code does. You send a trigger pulse,. The board farts around, waits, sets its output high to mark the pulse start, and then low when it ends That code is waiting for the pulse to *start* > A short pulse always fails? I wasn't clear if it just made it more > vulnerable to failure. Failure caused by something else? Maybe > wavelength? Interference. I really don't know. I don't know how you can > rule stuff out. Apart from empirically, test reliability, in which case > you need to record failure stats as well as success. > The shorter pulses failed *sometimes*, the longer ones never did. New code is in and it hasn't failed yet... static float get_distance() { int i; absolute_time_t start; absolute_time_t end; static int64_t us_delay; //set output pin high gpio_put(ULTRASONIC_OUT,1); busy_wait_us(10); //sleep_us() possibly unreliable here gpio_put(ULTRASONIC_OUT,0); //reset the input // wait for echo pulse start for (i=0;i<100000;i++) { if(gpio_get(ULTRASONIC_IN)) //pulse start { //read clock and store start=get_absolute_time (); //wait for echo pin to go low; while(gpio_get(ULTRASONIC_IN)) ; end=get_absolute_time (); //get clock difference us_delay=absolute_time_diff_us(start,end); //convert to float and return it as cm return (((float)(us_delay))*0.034/2); } } //we ran out of time here. return(0.0); } >> You can get some sort of Free BSD RTOS port to a Pico, but in fact >> mostly what you tend to be doing is just one thing at a time and so >> linear code with callbacks works pretty well >> > > Yeah, you say that, but virtually all my experience is based upon a > multitasking OS: VMS, Unix, Windows NT, Linux. I can't remember stuff I > did in the early 1980s. I have a huge store of experience, intuition, in > the multitasking Posix like world, none in single process. > Well I cut my teeth on assembler on Z80s and 8080s and bare metal programming LONG before Unix was part of my knowledge > I'm a little paranoid, pessimistic, I think the world is out to mess me > up. If things can go wrong, they will go wrong, which is why I'm > unwilling to step into such a different paradigm. > It's like going back to the days spent messing around in BASIC on 6800 kits my friend had built. ========== REMAINDER OF ARTICLE TRUNCATED ==========