Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMEGA32-16PU jak sprawdzić prawidłowe odmierzanie czasu impulsów ICR1 ?

andrewsek 14 Kwi 2011 10:25 6811 12
  • #1 14 Kwi 2011 10:25
    andrewsek
    Poziom 10  

    Witam

    Jestem tu nowy więc proszę o wyrozumiałość.

    Od pewnego czasu próbuję zdekodować pilot(y) IR. O ile dużo jest wątków poświęconych dekodowaniu RC5 i innych to jednak nigdzie nie mogę się doszukać jak sprawdzić czas impulsu.

    Wykorzystuję timer i przerwanie zboczem narastającym ICR1. W przerwaniu zmieniam na zbocze opadające a następnie dokonuję obliczenia czasu pomiędzy przerwaniami. Wszystko niby OK, kod pochodzi z książki Pana mirkka36.
    Jednak prawdopodobnie nie mam stosownego pilota do tego kodu.

    Pytanie: Jak sprawdzić czy pomiar jest prawidłowy? Taktowanie mam na 8MHz.

    Sprawdzałem funkcją _delay_ms ustawiając na 10 sekund - z zegarkiem w reku migał diodą co około 8 sekund - jednak dokładności tej funkcji nie ufam.

  • #3 14 Kwi 2011 11:34
    andrewsek
    Poziom 10  

    hmm... a istnieje jakaś inna możliwość, z LPT będzie problem bo go nie posiadam?
    Ale dziękuję za linka, ściągłem i też postaram się gdzieś dorwać LPT.

    Próbowałem wysyłać dane na wyświetlacz LCD ale to dawało mi nie znaczącą liczbę odczytaną jako liczba z liczników w dwóch kolejnych przerwaniach. Ale skąd mam wiedzieć że licznik dobrze zlicza tzn co 1 mikrosekundę? Skąd mam wiedzieć że udało mi się na podstawie taktowania procesora wyliczyć dokładnie jedną mikrosekundę?

    Testuje to na płytce ATB poprzez USB/FT232RL (zestaw do ksiazki Pana Mirka).
    Eclipse, język C.

  • Pomocny post
    #4 14 Kwi 2011 11:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    andrewsek napisał:
    Ale skąd mam wiedzieć że licznik dobrze zlicza tzn co 1 mikrosekundę? Skąd mam wiedzieć że udało mi się na podstawie taktowania procesora wyliczyć dokładnie jedną mikrosekundę?

    Zaletą mikrokontrolerów jest to, że wystarczy być pewnym ustawień rejestrów i zegara, i musi odliczać prawidłowo. Pokaż program. Oczywiście kontrola jest wskazana :)

  • #5 14 Kwi 2011 11:58
    andrewsek
    Poziom 10  

    Z programem będzie problem (mam go w domu). Musiałbym go zgrać i przynieść ;)
    W domku nie mam netu - korzystam w pracy.

    A jak odczytać taktowanie procesora, może odczyt F_CPU? W MKCalculator odczytuję i mam moje ustawione np 8MHz. W eclipse ustawiam AVRDude Hardwere na 8000000.

  • Pomocny post
    #6 14 Kwi 2011 12:01
    dondu
    Moderator Mikrokontrolery Projektowanie

    Brak neta to znaczne utrudnienie.
    Bez programu trudno będzie mi pomóc Tobie sprawdzić ustawienie timera.
    Ale test z zegarkiem raczej potwierdza prawidłowe ustawienie.
    Możesz wydłużyć czas pomiaru do kilku minut, by zmniejszyć jego błąd.

  • #7 14 Kwi 2011 14:31
    andrewsek
    Poziom 10  

    Myślę że ustawienia programowe powinny być OK ponieważ bazuję na bibliotece z książki. Jednakże przy obliczeniu mikrosekundy pojawia się:

    ir_micro_s(num) ((num)*(F_CPU/1000000/PRESCALER))

    gdzie PRESCALER ustawiony na 8 (zdefiniowane sa stosowne rejestry w zaleznosci od wyboru prescalera)

    Pytanie czy odczyt F_CPU jest prawidłowy (z tego co pojmuję to pochodzi on z ustawień w Eclipse jako 8000000) ??? No bo może to taktowanie nie jest do końca takie jak ustawiam w MKCalculator.

    Chcę zdekodować następujący pilot:
    philips/RC19420002_01
    http://lirc.sourceforge.net/remotes/philips/RC19420002_01

    Mogę prosić o krótkie wyjaśnienie tych czasów - nie wiem czy je dobrze interpretuję:

    name SmallRemote
    bits 13
    flags RC5|CONST_LENGTH
    eps 30
    aeps 100

    one 972 797
    zero 972 797
    plead 1144
    gap 113668
    toggle_bit 2

    Dodano po 19 [minuty]:

    Przepraszam że tak wypytuję jednakże nie szukam tu gotowego rozwiązania.. lubię sam dochodzić do rozwiązań. Problem w tym że gdzieś robię jakiś błąd i dlatego chce się upewnić.

  • #8 14 Kwi 2011 14:54
    dondu
    Moderator Mikrokontrolery Projektowanie

    andrewsek napisał:
    Przepraszam że tak wypytuję jednakże nie szukam tu gotowego rozwiązania.. lubię sam dochodzić do rozwiązań.


    Nie ma za co przepraszać, widać że dokładasz starań a nie czekasz na gotowiec.
    Niestety jak już pisałem wcześniej bez programu ja nie mogę Ci pomóc tym bardziej, że w Eclipse dawno nic nie robiłem.

  • #9 15 Kwi 2011 16:56
    andrewsek
    Poziom 10  

    W weekend troszkę popracuje nad tematem i dam znać jak sprawa się toczy :)

  • Pomocny post
    #10 15 Kwi 2011 20:49
    mirekk36
    Poziom 42  

    andrewsek napisał:

    Pytanie czy odczyt F_CPU jest prawidłowy (z tego co pojmuję to pochodzi on z ustawień w Eclipse jako 8000000) ??? No bo może to taktowanie nie jest do końca takie jak ustawiam w MKCalculator..


    Zdaje się, że poświęciłem kilka zdań w książce skąd bierze się F_CPU, a bierze się z pliku "makefile" który to z kolei jest automatycznie generowany przez ECLIPSE. Przecież jak robisz build to nawet wyświetla ci się w oknie konsoli między wieloma innymi parametr

    -DF_CPU 8000000

    A jeśli fuski ustawiłeś na wewn. oscylaor 8MHz to znaczy że wszystko jest dobrze i masz 1us bo przecież nie może być inaczej przy preskalerze = 8.

    Wiem, wiem , jak coś nie działa to zaraz doszukujemy się winy wszędzie tylko zwykle nie tam gdzie trzeba. Niektórzy zaraz pewnie powiedzą, że wewn. Oscylaor 8MHz może być niezbyt dokładny i dlatego masz odchyłkę (to prawda potwierdzam - tyle że to nie ma ŻADNEGO znaczenia w tym przypadku). Więc gdyby ktoś podpowiadał że do takich rozwiązań zaraz potrzebny jest kwarc 8MHz bo będzie dokładniej - to się myli.

    Ale ok przejdźmy dalej .... bardzo dobrze że doszedłeś już do stronki na której widać twojego pilota. Wiem że gdy się początkuje w tych tematach to trudno o praktykę, ale jednak standardowa długość połówki bitu w większości pilotów RC5 jest ok 868us a nie jak w przypadku twojego pilota:

    972 797

    w tym konkretnym wypadku to w ogóle jest mocno inaczej ;) bo nawet każda połówka ma inny czas i dla takiego pilota trzeba byłoby dość znacząco zmodyfikować kod programu.

    Gdybyś np miał pilota z czasami powiedzmy:

    927 927

    to prawdopodobnie w pliku konfiguracyjnym wystarczyłoby zmienić tylko co nieco parametr odpowiedzialny za tolerancję (zwiększyć go trochę)

    Ale patrząc na dalsze parametry tego pilota to i parametr GAP jest różny od standardowych - więc reasumując - to nie jest tpowy pilot RC5.

    Możesz sobie zrobić przecież prosty test. Napisz kilku linijkowy kod np w Bascomie albo jakiegoś gotowca odpal do RC5 i zobacz czy ci będzie ten pilot działał? Podejrzewam , że nie.

    Więc pewnie tak jak większość początkująych zamiast poszukać typowego pilota RC5 będziesz wiercił dziurę w brzuchu kodu ;) ....

    Tymczasem też widać, że być może nie do końca jeszcze nawet zrozumiałeś jak on działa - bo po jego dogłębnym zrozumieniu można go w przysłowiowe 5 sekund przerobić aby działał nie tylko z tymi parametrami jakie są w twoim pilocie, ale w ogóle można to przerobić i do obsługi pilotów nadających w standardach SONY, JVC (czyli space lub pulse)

  • #11 16 Kwi 2011 09:43
    andrewsek
    Poziom 10  

    Widzę że mam już odpowiedź od samego autora kodu :) Sprawę rozwiązałem i muszę się pochwalić że pilot mi działa :D Ale muszę się wytłumaczyć: Najpierw miałem typowy pilot Philipsa z czasami odpowiednimi dla RC5 – rzecz w tym że nawet on mi nie działał. Po usilnych próbach udało mi się go uruchomić no i przyznaję że nie wiem gdzie miałem błąd! Po raz kolejny posprawdzałem wszystko (no chyba 10 razy wgrywałem stosowne fusebity) i nagle EUREKA! Działa!

    Następnym krokiem był mój śmieszny pilot. Wiem że czasy były tam nietypowe jak dla RC5. Ale ja się uparłem i postawiłem na swoim. Pilot po prostu mi się podoba bo jest elegancki i mieści się w dłoni :) Zrobiłem małego debugera w postaci zapalanej diody na każdym etapie działania programu. I widziałem gdzie odrzuca mi całą ramkę.

    Po zmianie biblioteczki, wyrzuciłem COMMAND i ADDRESS na wyświetlacz LCD i okazało się że wszystko działa (wraz z bit TOGGLE).

    Może i czasy są niestosowne do gotowej biblioteki RC5 ale jest tego Plus!! Przez duże P! Inne piloty w pokoju nie będą zakłócać mi pracy programu.

    Wiem że sam sobie komplikuje życie tak jak wielu początkujących ale właśnie o to chodzi. Bawiąc się innym pilotem nauczyłem się troszeczkę o dekodowaniu ich :) Korzystanie z gotowej biblioteki to byłaby łatwizna bez nauki młodego adepta ;) A tak zbudowałem sobie sam bibliotekę wzorując się na gotowej :)


    Skoro już Pan Mirek mnie tu odnalazł to mogę pochwalić na forum książkę Pana Mirka!
    W sumie mam już za sobą 98% całej pozycji. Do pilota wróciłem z samego końca książki ponieważ miałem (jak już wspominałem) problemy. Zakup tej książki grozi zrujnowaniem życia prywatnego i porzuceniem przez swoją drugą połówkę ;) Nie wspomnę już o zaniedbywaniu się i piciu dużej ilości kawy ;) Siedzę w każdej wolnej chwili i wertuję kartki, podłączam kabelki a budżet domowy zostaje zrujnowany poprzez zakup coraz to ciekawszych sprzętów do mojego laboratorium :P

    POLECAM POLECAM !!

    Okazuje się że taki „żółtodziób” jak ja może zrobić ciekawe rzeczy :D Książka naprawdę odpowiada na pytania które się pojawiają w trakcie studiowania strona po stronie.
    Cieszę się że Pan Mirek dołożył starań i odkrył wiele tajników dotyczących AVR – jak widać Polacy nie gęsie i swój rozum mają. Ponadto Pan Mirek chętnie udziela pomocy. Gdyby wszyscy tak podchodzili do sprawy to nie bylibyśmy krajem hmmm... czwartego świata :(

    Pozdrawiam i Dziękuję za POMOC!

    PS Dalej nie wiem jak w prosty sposób sprawdzić poprawność odmierzania 1 mikrosekundy (już tak teoretycznie)

  • #12 16 Kwi 2011 10:20
    mirekk36
    Poziom 42  

    Ależ to właśnie dobrze, że kolega zaczął próby z innym pilotem. Bardzo mi zależało na tym, aby właśnie np nie traktować tych kodów jako gotowych bibliotek a po prostu zrozumieć ich działanie i zobaczyć, że przerobienie tego pod inne piloty wcale nie jest takie trudne ;) .. tutaj się właśnie to udało i nie ukrywam, że BARDZO MNIE TO CIESZY ;)

    odnośnie dokładnego sprawdzenia czy odmierzana jest 1 us

    to najpierw trzeba się zastanowić o jaką dokładność sprawdzania chodzi ? np w nanosekundach ? i do czego to ma być?

    Jeśli tylko tak teoretycznie - to po pierwsze warto poczytać w nocie PDF szczegóły odnośnie samego oscylatora wewnętrznego i jakie on może mieć odchyłki oraz od czego one zależą. Warto też przy tej okazji jeszcze raz zaprzyjaźnić się z rejestrem OSCCAL, kórym można jeszcze go dokalibrować.

    Zakładając jednak, że jest to w miarę równe 8MH to powinna być 1us po podziale przez 8 prawda ?

    Żeby być pewniejszym można rzeczywiście zastosować zewn. rezonator kwarcowy np 8MHz. Ale przecież i tutaj będziesz miał odchyłki od 1us tyle że może mniejsze - jednak będą - nieprawdaż ??? więc znowu pytanie na jakiej dokładności ci zależy?

    Można zatem aby to zbadać użyć jakiegoś zewnętrznego miernika częstotliwości czy innego precyzyjnego narzędzia, oscyloskopu cyfrowego itp.

    Można też próbować jeszcze to określić programowo za pomocą innego timera tylko tu już trzeba zwrócić uwagę na czas wykonywania się operacji sprawdzająych bo wchodzimy przecież w "matrixa" czasy rzędu nanosekund przy kwarcu 8MHz to już prędzej warto byłoby sięgnąć być może po jakąś krótką wstawkę w asemblerze żeby to posprawdzać.

  • #13 16 Kwi 2011 12:57
    andrewsek
    Poziom 10  

    No ja już tu raczej zadaje czysto hipotetyczne pytania bo faktycznie do niczego mi to :) Ale ja to lubię zawsze wiedzieć.

    Oscyloskop mnie bardzo kusi ostatnimi czasy... chciałem zakupić do diagnostyki pojazdów, szczególnie wtrysków. Teraz mam drugi powód.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME