logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

HC-SR04 - Czujnik odległości wskazuje 0, kod AVR, TIMER1_CAPT_vect

joker1309 16 Maj 2016 14:03 786 2
REKLAMA
  • #1 15677602
    joker1309
    Poziom 11  
    Witam,
    mam problem z czujnikiem odległości HC-SR04, cały czas na wyświetlaczu mam wartość 0. kod jest następujący:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod powstał w oparciu o poradniki, jako że wartość wyświetlana się nie zmienia wydaje mi się że coś jest nie tak z przerwaniem :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    mógły ktoś wytłumaczyć jak działa takie przerwanie? po pojawieniu się sygnału na ICP1 (PB0 - atmega 328) zaczyna być zliczana wartość w rejsetrze ICR1, a po pojawieniu się stanu niskiego :
    if( !(TCCR1B & (1<<ICES1)) )

    ustawia odpowiednią wartość PulseWidth ( dlaczego nie ma nigdzie w przerwaniu return?, kiedy ono się skończy? )

    i dlaczego w ostatniej linijce :
    TCCR1B ^= (1<<ICES1); //zmiana zbocza
    jest zmiana zbocza

    to przerwanie działa w pętli tak długo jak na odpowiednim pinie jest stan wysoki ? Dużo pytań ale pierwszy mam doczynienia z tego typu sygnałem, nie wiem jak to "liznąć" i skorzystałem na początek z gotowca, który nie działa : d (albo działa ale ja coś źle robię).
    Jeszcze mam pytanie o wyzwalanie tego czujnika, jaki czas po wyzwoleniu czekać na dane? Chodz mi o tą część:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    nie powinienem mieć tak jakiejś funkcji która będzie sprawdzała czy jest już wynik ? ( typu pętla while (nie ma wyniku (1)){} a jak się pojawi wynik to wyjdzie program z pętli ? )

    wiem dużo pytań ( może nie które bez sensu : ) ), mam nadzieje że ktoś odważy się na nie odpowiedzieć.
    Z góry dziękuję za pomoc : D

    Dodano po 21 [minuty]:

    Dobra chyba wiem po co zmiana zbocza na końcu przerwania, po prostu czekamy na zobocze opadające aby ponownie wejść w przerwanie i odczytać wyniki, program nadal nie działa ale już wiem jak powinien działać chociaż : )
  • REKLAMA
  • #2 15677782
    BlueDraco
    Specjalista - Mikrokontrolery
    Spora część pytań, które zadajesz, dotyczy głównie podstaw programowania i podstaw języka C i nie mają wiele wspólnego z mikrokontrolerami.

    Jeśli HC-SR04 nie odpowie impulsem echo, należy go "skasować" podając na linię ECHO poziom niski. Inaczej zawiśnie na wieki.
  • #3 15678839
    joker1309
    Poziom 11  
    Zrozumiałem w jaki sposób program na działać, jednak nadal nie działa (mimo że nie widzę żadnych błędów), nie mam takiego sprzętu pomiarowego żeby sprawdzić czy jest sygnał o długości 10us.

    Dodano po 18 [minuty]:

    Co ciekawe przerwanie się wykonuje bo gdy w przerwaniu zrobię tak:

    } else {
    //PulseWidth = ICR1 - LastCapture; //Jeśli zbocze opadajace oblicz PW
    PulseWidth=200;
    }

    to na wyświetlaczu pojawi mi się 200.

    Dodano po 22 [minuty]:

    Dobra mam błąd, chodziło o to że nie używam prescalera ale muszę go ustawić na 1 bo jak zostawię go nie ustawionego to timer nie liczy : )

    Dodano po 9 [minuty]:

    To teraz pytanie, jak sprawdzić kiedy jest błędny odczyt ( <2cm i >200cm bo czasami np 1cm odczyta jako 6 cm lub 127cm i są to wartość z zakresu(gdyby były poza to by nie było problemu), ale czy da się jakoś programowo zrobić aby zwracał błąd przy takich pomiarach ? : )
REKLAMA