<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=CS><div class=WordSection1><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Dobrý den všem,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>UZ dálkoměr produkuje dost hrozná data, často to lítá o skoro 10 %. Je to takovéto klasické čidlo se dvěma UZ měniči HC-SH04. Mám tam někde nějakou chybu, nebo je to normální chování tohoto typu měření?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Měří se s pomocí TCA0 a přerušení od pinu:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>volatile long timeRet=0;</p><p class=MsoNormal>volatile char portIntSync=1;</p><p class=MsoNormal>long  timeResult=0;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>interrupt [PORTA_PORT_vect] void porta_int_isr(void) { // ----</p><p class=MsoNormal>                if (portIntSync==0) {</p><p class=MsoNormal>                               if (PIN_echo==1) {           // vzestupna - zacatek mereni</p><p class=MsoNormal>                                               TCA0.SINGLE.CNT = 0;</p><p class=MsoNormal>                                               TCA0_SINGLE_INTFLAGS = 1;</p><p class=MsoNormal>                                               timeRet=0;</p><p class=MsoNormal>                               } else {                                  // sestupna - konec mereni</p><p class=MsoNormal>                                               timeRet=(long)TCA0.SINGLE.CNT;</p><p class=MsoNormal>                                               portIntSync=1;</p><p class=MsoNormal>                               }</p><p class=MsoNormal>                }</p><p class=MsoNormal>                PORTA.INTFLAGS=255;</p><p class=MsoNormal><span lang=EN-US>}</span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Program ve volném čase mj. dělá:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                if (portIntSync==1) {</p><p class=MsoNormal>                               #asm("cli")</p><p class=MsoNormal>                               timeResult=timeRet; </p><p class=MsoNormal>                               #asm("sei")</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                               #asm("cli")</p><p class=MsoNormal>                               PIN_trig(1);</p><p class=MsoNormal>                               delay_us(10);</p><p class=MsoNormal>                               PIN_trig(0);</p><p class=MsoNormal>                               portIntSync=0;</p><p class=MsoNormal>                               TCA0.SINGLE.CNT = 0;</p><p class=MsoNormal>                               #asm("sei")</p><p class=MsoNormal>                }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Zobrazování výsledků vypadá takto (zobrazí raw hodnotu a pak přepočet na mm):</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                PIN_led(1);</p><p class=MsoNormal>                printN(timeResult, 9);</p><p class=MsoNormal>                putchar(' ');</p><p class=MsoNormal>                printN((timeResult*345*8+1)/40000, 5);</p><p class=MsoNormal>                putchar('\n');</p><p class=MsoNormal>                delay_ms(100);</p><p class=MsoNormal>                PIN_led(0);</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>printN zobrazuje long číslo (parametr 1) na počet míst (par. 2).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#define PIN_led(d) EQUBIT(PORTA.OUT,3,(d))</p><p class=MsoNormal>#define PIN_trig(d) EQUBIT(PORTA.OUT,5,(d))</p><p class=MsoNormal>#define PIN_echo TSTBIT(PORTA_IN,6)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Jsem zvědav, zda se formátování odesláním rozbije, nebo ne:-)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Díky,</p><p class=MsoNormal>PH</p></div></body></html>