Ultrazvukovy dalkomer + ATtiny214
Pavel Hudecek
edizon na seznam.cz
Úterý Březen 31 15:47:03 CEST 2020
Ne. int. dělá jen ten jeden. A na volných pinech jsou pro jistotu pullupy.
Vypadá to, že se jedná o inherentní vlastnost tohoto typu dálkoměru, navíc posílenou členitostí věcí okolo místa testů. Např. při namíření na strop občas chytá i poličku, která je o 30° vedle a o 2 m blíž.
U krátkých vzdáleností chování začalo dávat smysl, když jsem si uvědomil, že „osvětlení“ před čidlem vypadá asi jako flek od laserové diody, tedy včetně intrferenčních proužků všude možně. Když se k tomu přidá geometrie, kdy si signál může vybrat z několika různých trojúhelníků, je to jasný:-)
PH
Od: Miroslav Šinko
Ako mate inicializovane ostatne piny PORTA? Nemozu vyvolavat
prerusenie, v tomto programe neziaduce?
miro
po 30. 3. 2020 o 18:39 Pavel Hudecek <edizon na seznam.cz> napísal(a):
> 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í?
>
>
>
> Měří se s pomocí TCA0 a přerušení od pinu:
>
>
>
> volatile long timeRet=0;
>
> volatile char portIntSync=1;
>
> long timeResult=0;
>
>
>
> interrupt [PORTA_PORT_vect] void porta_int_isr(void) { // ----
>
> if (portIntSync==0) {
>
> if (PIN_echo==1) { // vzestupna - zacatek mereni
>
> TCA0.SINGLE.CNT = 0;
>
> TCA0_SINGLE_INTFLAGS = 1;
>
> timeRet=0;
>
> } else { // sestupna - konec mereni
>
> timeRet=(long)TCA0.SINGLE.CNT;
>
> portIntSync=1;
>
> }
>
> }
>
> PORTA.INTFLAGS=255;
>
> }
>
>
>
> Program ve volném čase mj. dělá:
>
>
>
> if (portIntSync==1) {
>
> #asm("cli")
>
> timeResult=timeRet;
>
> #asm("sei")
>
>
>
> #asm("cli")
>
> PIN_trig(1);
>
> delay_us(10);
>
> PIN_trig(0);
>
> portIntSync=0;
>
> TCA0.SINGLE.CNT = 0;
>
> #asm("sei")
>
> }
>
>
>
> Zobrazování výsledků vypadá takto (zobrazí raw hodnotu a pak přepočet na mm):
>
>
>
> PIN_led(1);
>
> printN(timeResult, 9);
>
> putchar(' ');
>
> printN((timeResult*345*8+1)/40000, 5);
>
> putchar('\n');
>
> delay_ms(100);
>
> PIN_led(0);
>
>
>
> printN zobrazuje long číslo (parametr 1) na počet míst (par. 2).
>
>
>
> #define PIN_led(d) EQUBIT(PORTA.OUT,3,(d))
>
> #define PIN_trig(d) EQUBIT(PORTA.OUT,5,(d))
>
> #define PIN_echo TSTBIT(PORTA_IN,6)
>
>
>
> Jsem zvědav, zda se formátování odesláním rozbije, nebo ne:-)
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20200331/c56694f8/attachment.html>
Další informace o konferenci Hw-list