Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega16 + Sonar HC-SR04 - Inkrementacja zmiennej w timerze co dokładnie 1uS

Majk888 07 Dec 2012 22:30 2643 6
  • #1
    Majk888
    Level 2  
    Witam serdecznie wszystkich, jestem stosunkowo nowy w dziedzinie mikrokontrolerów, ale postaram się przybliżyć problem najprościej jak się da. Sama idea jest taka, aby wykorzystać Sonar HC-SR04 od Arduino i przy pomocy atmegi16 wyliczyć odległość i wyświetlić to na ekranie. Jest użyty kwarc 16MHz i fusebity poprawnie ustawione. Problem polega na tym, że nie jestem w stanie uzyskać przerwania dokładnie co 1uS aby dzięki temu móc wyliczyć odległość. Przerwanie timera uzyskuję poprzez podanie przez sonar sygnału na INT1. Inkrementuje się zmienna 'duration' i gdy nastąpi koniec przerwania ma być ona wyświetlona na ekranie. Problem w tym że nie jest ona liczona w uS. Przeszabrowałem internet w poszukiwaniu informacji na temat opóźnienia timerów, dodatkowe cykle poświęcone na realizację przerwań itd. Moja wiedza niestety jest jeszcze zbyt mała w tej dziedzinie. Prosiłbym o pomoc jak mogę rozwiązać mój problem w najprostszy możliwy sposób.

    Code: c
    Log in, to see the code
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    szulat
    Level 23  
    no chyba żartujesz z tym wywoływanie przerwania milion razy na sekundę.
    słowo kluczowe którym powinieneś sie zainteresować to "Input Capture"
  • #3
    Majk888
    Level 2  
    Aj, aj, źle sformułowałem temat - już poprawilem ;) Częstość przerwań nie ma tu znaczenia dla mnie, jeśli trzeba pomiar może być robiony co sekundę, chodzi o to, aby inkrementacja zmiennej w przerwaniu była wykonywana co 1uS. Co do 'Input Capture' to zajmę się tym jutro.
  • #4
    tmf
    Moderator of Microcontroller designs
    To by właśnie wymagało miliona przerwań na sekundę, co na M16 (i nie tylko) jest nieporozumieniem). Powinieneś taktować licznik z częstotliwością 1 MHz lub wyżej (preskaler się kłania) i skorzystać właśnie z ICR - zdarzenie z "sonaru" zamrozi wartość licznika, który wprost będzie wskazywał na czas czyli odległość.
  • #5
    Majk888
    Level 2  
    Niestety nie udało mi się odnaleźć w internecie wszystkich informacji, które rozjaśniłyby mi problem, stąd mam parę pytań, które mnie nurtują:

    1. Z tego co zrozumiałem to aby użyć ICR to trzeba podać sygnał na wejście ICP1, następnie przenieść wartość z ICR do zmiennej i to będzie mój wynik z racji tego, że zeruję sobie wcześniej licznik, tak?

    2. Jeśli tak to prosiłbym o przykładowy kod programu jak mogłoby to wyglądać. Same komendy dotyczące pętli przerwania ICR, przepisywania do zmiennej i zerowania licznika powinny wystarczyć, nie proszę tutaj w żadnym razie o gotowca całego programu ;)

    3. Co jest w tym przypadku przez Was określane jako licznik?

    4. Przeglądając różne strony spotkałem sie z programami, w których wartość ICR była 'zamrażana' dwukrotnie i potem była obliczana różnica między nimi. Co się dzieje, gdy licznik się przepełni, jak wtedy jest to obliczane?
  • #6
    tmf
    Moderator of Microcontroller designs
    Przykądowy kod masz w darmowych przykładach do mojej książki. Jego analiza odpowie ci na powyższe pytania.
  • #7
    szulat
    Level 23  
    gdyby ten wątek czytał ktoś kto akurat przypadkiem nie ma właściwej książki ;) to przykłady zastosowania input capture na atmedze można często znaleźć w projektach gdzie odbierane są sygnały z pilota na podczerwień bo tam właśnie mierzy się czasy impulsów i przerw między nimi

    hm, właściwie to odpowiedzi są banalne:
    1. tak
    2. no przecież to proste skoro już znasz koncepcję i czytasz dokumentację :)
    3. licznikiem jest timer
    4. masz sonar więc nie chcesz żeby licznik się przepełnił - ustaw jego górną granicę na jakies sensowne maksimum (najdłuższy możliwy czas echa) i w przerwaniu przepełnienia możesz już wyłączyć input capture i zapisac informację że echa nie było. w innych zastosowaniach przepełnienie może nie przeszkadzać. odjęcie dwóch stanów timera zawsze da w wyniku jakiś odstęp czasowy i jeżeli odstęp jest mniejszy niż zakres zmiennej to o dziwo wynik unsigned będzie prawidłowy nawet jeżeli timer po drodze minął zero (taka to już właściwość arytmetyki modulo N).