Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMEGA 16][C] - Timer1 odczytywanie częstotliwości

14 Mar 2014 09:51 1509 9
  • Użytkownik usunął konto  
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Specjalista - Mikrokontrolery
    A co to ma być?
    ultoa(0000000000,pomiar,10);

    Co odczytujesz z ICR1?

    To też jest źle, a nawet podwójnie źle:
    c = a*65535;

    najpierw mnożysz przey błędną wartość, wynik mnożenia jest obcinany do 16 bitów, a następnie podstawiany na zmienną c.

    Powinno być:

    c = (uint32_t) a << 16;
  • Użytkownik usunął konto  
  • Poziom 25  
    2^16 to 65536 a nie 65535
  • Użytkownik usunął konto  
  • Specjalista - Mikrokontrolery
    saturator napisał:
    Tak jak najbardziej 2^16 to 65536 tyle że największa liczbajaką możesz zapisac to 65535 ponieważ 0 też jest stanem 0x0000;


    I co z tego wynika? Jaki to ma związek z tym, że mnożysz przez błędną wartość? Przecież licznik "przewija się" co 2^16, a nie co 2^16 -1.
  • Użytkownik usunął konto  
  • Poziom 25  
    Nie obraź się ale Twoja metoda pomiaru częstotliwości jest "trochę" zagmatwana :)
    Korzystasz z timera w dziwaczny sposób a funkcje typu Delay() w połączeniu z przerwaniami nie działają poprawnie i nadają się co najwyżej do migania diodą.
    Natomiast pomiar częstotliwości można zrealizować np. tak:

    1. Ustaw timer aby generował przerwanie w stałych odstępach czasu.
    2. Ustaw przerwanie zewnętrzne.
    3. W przerwaniu zewnętrznym zliczaj impulsy.
    4. W przerwaniu timera przelicz impulsy na częstotliwość.
    5. W pętli głównej wyślij wynik na wyświetlacz.
  • Specjalista - Mikrokontrolery
    Pomyśl, jaką wartość będzie miał licznik po zliczeniu 65536 impulsów? Z jakiego powodu uważasz, że Twój program powinien wtedy uznać, że impulsów było 65535?

    Wydawało mi się, że pomoc, jakiej oczekujesz - to wskazanie błędów w programie. Tymczasem Ty sprzeczasz się, sugerując, że ewidentny błąd, który popełniłeś, błędem nie jest.

    Nie pokazałeś wersji programu, którą uważasz za działającą, a oczekujesz że ktoś pokaże Ci, co poprawiłeś - też ciekawostka.

    Cały program wygląda dziwnie i wątpię, że działa zgodnie z oczekiwaniami. Wytłumacz najpierw, w jaki sposób chcesz mierzyć tę częstotliwość?

    W zasadzie sposoby są dwa:
    - zliczanie impulsów w jednym timerze przez czas odmierzany przez drugi timer
    - pomiar czasu pomiędzy zboczami na wejściu przy użyciu jednego timera i przeliczenie okresu na częstotliwość.

    Który z tych sposobów zastosowałeś?
    Obawiam się, że nie wiesz, jak działa i jak ma działać Twój program.
  • Moderator Mikrokontrolery Projektowanie
    saturator napisał:
    Ale nie o to mi chodziło ;/ to zawsze mój problem dla którego na elektrode udaje się jak już naprawdę wyrwę wszystkie włosy z głowy, będziemy sie sprzeczać o 65535 ale nikt nie był w stanie mi pomóc...a wszyscy tacy mądrzy

    Bo my nie dajemy ryby tylko wędkę, a koledzy wiele już Ci wędek dali :)
    Dorzucę więc i ja kolejną tym razem wraz z rybą - pomiar za pomocą Input Capture Unit: http://mikrokontrolery.blogspot.com/2011/04/obrotomierz-diy.html