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

AVR ATMEGA32 ADC - identyczne wyniki z 3 kanałów, jak rozwiązać?

mnih123 30 Gru 2012 22:45 1824 2
REKLAMA
  • #1 11718776
    mnih123
    Poziom 11  
    Witam! Chcę zbierać pomiary z przetwornika ADC ATMEGA32 z trzech kanałów co określony czas (1,25ms) i wyświetlać je na LCD. Program napisany przeze mnie, niby działa poprawnie, ale pomiary z 3-kanałów są jednakowe, a przecież powinny być różne.
    Zaplanowałem, żeby zrobić to w następujący sposób:
    -ustawić ADC na generowanie przerwania w momencie zakończenia konwersji
    -ustawić timer_1 na generowanie przerwania co 1,25ms
    -w przerwaniu od timera_1 wybrać 1-szy kanał pomiarowy i wystartować ADC
    -w momencie zakonczenia konwesji z kanału_1, zapis wyniku w zmiennej A1, zmiana kanału na 2 i start ADC
    -w momencie zakonczenia konwesji z kanału_2, zapis wyniku w zmiennej A2, zmiana kanału na 3 i start ADC
    -w momencie zakonczenia konwesji z kanału_3, zapis wyniku w zmiennej A3
    -z moich obliczeń wynika, że wszystkie 3 pomiary zmieszczą się w czasie 1,25ms
    -po upływie 1,25ms timer_1 rozpocznie cały proces od początku
    Poniżej przedstawiam kod programu. Proszę o pomoc, nie mam już pojęcia gdzie popełniłem błąd. Środowisko to Studio4.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 11719430
    dondu
    Moderator na urlopie...
    Twój problem prawdopodobnie polega na tym, że stosujesz instrukcje:

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


    Przeanalizuj krok po kroku powyższy uproszczony Twój kod, gdy na początku wsk_kan = 1 i wykona się przerwanie ISR(ADC_vect).
    Dopiero po przeanalizowaniu czytaj dalej.



    Gdybyś użył else if():

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

    http://mikrokontrolery.blogspot.com/2011/02/if-warunkowa-instrukcja-sterujaca.html
    to nie było by tego problemu.

    Dobrą alternatywą jest także:

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

    http://mikrokontrolery.blogspot.com/2011/02/instrukcja-warunkowa-switch-case.html
  • #3 11719659
    mnih123
    Poziom 11  
    O nie!!! Jak mogłem popełnić taki głupi błąd. Najtrudniej znaleźć go w swoim kodzie.
    WIELKIE DZIĘKI DONDU! Oczywiście zmieniłem na else if i wszyściutko śmiga aż się oczy świecą. Pomiar indywidualny na każdym kanale. A już myślałem, że to może przez zakłócenia EMI i nie uda mi się tego obejść na płytce stykowej. Jeszcze raz dzięki i szczęśliwego Nowego Roku.
REKLAMA