Ultrazvukovy dalkomer + ATtiny214
Miroslav Šinko
sinkomiro na gmail.com
Úterý Březen 31 00:46:27 CEST 2020
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):
>
>
>
> Dobrý den všem,
>
>
>
> 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:-)
>
>
>
> Díky,
>
> PH
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list