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

[C][ATmega] Zegar widmowy, jak zlikwidować drganie obrazu

25737 31 Maj 2012 16:23 1668 14
REKLAMA
  • #1 10952679
    25737
    Poziom 10  
    Jak na załączonym obrazku, wskazówka i pozostałe elementy obrazu "migają", tak jakby nie zapalały się po każdym obrocie.

    http://youtu.be/SMU5YG3xl9k

    W czym tkwi problem? W kodzie prawie nic nie ma.
    Jeśli każę się zapalić wskazówce w przerwaniu to pięknie chodzi.


    PS: Wiem że zegar chodzi za szybko i w drugą stronę narazie tylko do testów :D.

    Przerwanie od fotoczujnika

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

    A w main.c siedzi:

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



    Wysyłanie za pomocą 3 rejestrów M74HC595 i funkcji "wyslij();", procesor ATmega324PA 20MHz, silnik z wentylatora ok. 1200 obr/min.
  • REKLAMA
  • #2 10953030
    LordBlick
    VIP Zasłużony dla elektroda
    Zrób tak, aby wyeliminować czasochłonne obliczenia, zwłaszcza dzielenia. Poza tym licznik ma własne wejście do pomiaru długości czasowej.
  • REKLAMA
  • #3 10953045
    stanleysts
    Poziom 27  
    Co zawiera zmienna: zawartosclicznika1?
  • REKLAMA
  • #4 10953057
    LordBlick
    VIP Zasłużony dla elektroda
    stanleysts napisał:
    Co zawiera zmienna: zawartosclicznika1?
    Jakby wynikało z przedstawionego kodu, jest to maksymalna wartość licznika podczas całego obrotu.
  • #5 10953122
    25737
    Poziom 10  
    LordBlick napisał:
    stanleysts napisał:
    Co zawiera zmienna: zawartosclicznika1?
    Jakby wynikało z przedstawionego kodu, jest to maksymalna wartość licznika podczas całego obrotu.


    Zgadza się, Timer 16bitowy, preskaler 64 więc liczy do ok. 16 000 (1 mln taktów).

    Dzięki za porady. Mój problem dotyczy tego, że nie ważne ile kodu zakomentuję, ile operacji dzielenia cały czas wyświetlane elementy wyraźnie "klatkują".

    Czy błąd nie tkwi gdzieś tutaj? Bo wyraźnie większość warunków if "nie wchodzi" tak jakby ta moja zmienna "pozycja" (de facto pozycja przeliczona na stopnie) nie spełniała warunków porównania.

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


    Na każdy stopień mam około 3 tys. taktów więc przy poprawnie działającym kodzie dany warunek if powinien się spokojnie spełnić co obrót i to nie raz.

    LordBlick napisał:
    Poza tym licznik ma własne wejście do pomiaru długości czasowej.


    Chodzi o ICP?
  • REKLAMA
  • #6 10953178
    LordBlick
    VIP Zasłużony dla elektroda
    Tak, miałem na myśli ICP np Mode 8, tylko na razie tu sobie piszemy o abstrakcyjnej , być może tajnej ATmedze, więc nawet nie wiem, który datasheet jest prawidłowy, no i kawałek schematu lub opis podłączenia, oraz jak wygląda inicjalizacja I/O, chętnie bym obejrzał...
  • #7 10953261
    25737
    Poziom 10  
    ATmega324PA jak napisałem w pierwszym poście. Schemat w załączniku.

    Inicjalizacja IO:

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


    Konfiguracja Timerów

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 10953370
    LordBlick
    VIP Zasłużony dla elektroda
    Chyba tutaj jest pogrzebane nadmiarowe wygaszanie z wzajemnością:
    25737 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Mielenie tego w pętli nie ma sensu, warto zaprząc tu przerwania od Timera (Jest jeszcze Timer3, gdyby z czymś kolidowało użycie Timer1), a pętla główna niech tylko oblicza odpowiednie wartości licznika.
  • #9 10953438
    25737
    Poziom 10  
    Niestety nawet zakomentowanie wszystkiego oprócz wskazówki sekund nie pomaga.
  • #10 10953503
    LordBlick
    VIP Zasłużony dla elektroda
    25737 napisał:
    Niestety nawet zakomentowanie wszystkiego oprócz wskazówki sekund nie pomaga.
    Nie rozumiem tego skrótu myślowego - naprawdę wszystko ? Najklarowniej byłoby pokazać kod po tej operacji... ;)
  • #11 10953527
    stanleysts
    Poziom 27  
    koledze chodzi chyba o to, że jego while wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 10953585
    LordBlick
    VIP Zasłużony dla elektroda
    stanleysts napisał:
    koledze chodzi chyba o to, że jego while wygląda tak:

    [...]
    Być może, aczkolwiek gdzie jest w takim razie jest wygaszanie ?
  • #13 10953617
    25737
    Poziom 10  
    Nieco zmodyfikowany kod, problem ten sam:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 10954403
    25737
    Poziom 10  
    Tak jak wspomniałeś na początku, odchudziłem trochę kod.

    M. in. wyrzuciłem przy odczycie 4 najmniej znaczące bity, dzięki czemu przeszedłem ze zmiennej 32 na 16 bitową, gdzie niegdzie zoptymalizowałem jeszcze trochę kod i zaczęło to wyglądać całkiem przyzwoicie :).

    Co do plików asemblera pamiętam, że kiedyś w eclipsie włączyłęm gdzieś opcję podglądu jak każda funkcja jest tłumaczona na assemblera ale teraz nie mogę znaleźć. Pamięta ktoś jak się wchodziło do takiego widoku?
REKLAMA