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

[XMEGA][C] ADC - przerwanie od ADC

ukas 07 Sie 2011 11:25 2941 8
REKLAMA
  • #1 9799481
    ukas
    Poziom 12  
    Pisze program na atXmega 16A4 w C (AVR Studio 5).
    Skonfigurowałem ADC w ten sposób:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Do sprawdzenia czy zadziałało przerwanie używam wyjścia na diodę led (pin3 portD):
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Niestety przy tak napisanym programie nie zostaje wywołane przerwanie.

    Przetwornik na pewno działa i wejście jest skonfigurowane poprawnie bo jak w pętli głównej napiszę tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod



    to na diodzie led dostaję sygnał prostokątny o wypełnieniu zależnym od ustawionego warunku na wartość zmiennej analog.

    Co w konfiguracji jest żle że nie działa mi obsługa przerwania?

    Docelowo chciałbym zmienną analog aktualizować w obsłudze przerwania a w pętli programu tylko ją porównywać itd.
  • REKLAMA
  • REKLAMA
  • #3 9800423
    ukas
    Poziom 12  
    Włączony tryb FREERUN w konfiguracji przetwornika pozostał mi z prób jakie robiłem aby sprawdzić czy przetwornik w ogóle działa. Opisywałem tą próbę w drugiej części mojego postu gdzie w pętli głównej programu odczytywałem wyniki z rejestru ADCA_CH0_RES.
    Wyłączenie trybu FREERUN i tak nie powoduje wyzwalania przerwania.

    Konfiguracja ADC przy której spodziewam się działania przerwania jest następująca:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 9800889
    drzasiek
    Specjalista CNC
    A włączasz obsługę przerwań?
    Używaj wektora ISR zamiast SIGNAL.
    Jakbyś pokazał cały kod to by łatwiej było Ci pomóc, tak to widać tylko to co chciałeś pokazać a nie to co jest w rzeczywistości.
    pozdrawiam
  • #5 9801047
    ukas
    Poziom 12  
    Mój cały kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod




    Włączam globalne zezwolenie na przerwanie:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    i jeszcze przerwanie od zakończenia przetwarzania w CH0:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Coś jeszcze powinienem włączać?
  • REKLAMA
  • REKLAMA
  • #7 9801089
    ukas
    Poziom 12  
    Niestety, dodanie sei(); przed while nie pomaga.
    A sei(); to nie to samo co ustawienie bitu I w rejestrze SREG?
  • Pomocny post
    #8 9801245
    Aro_
    Poziom 15  
    Jest jeszcze coś takiego jak kontroler przerwań, więc należałoby włączyć obsługę przerwań dla jednego z poniższych poziomów, które wybrałeś (nie wiem czemu masz zaznaczone dwa poziomy).
    ADCA_CH0_INTCTRL |= _BV(0);//ADC_CH_INTLVL0_bm; //włączenie przerwania 
    	ADCA_CH0_INTCTRL |= _BV(1);//ADC_CH_INTLVL1_bm; //włączenie przerwania

    Do tego celu służy rejestr PMIC.
    Np. PMIC.CTRL |= PMIC_MEDLVLEN_bm; dla średniego priorytetu.
  • #9 9801397
    ukas
    Poziom 12  
    Ja nie włączyłem dwóch poziomów tylko wybrałem najwyższy priorytet dla mojego przerwania zgodnie z tabelą z noty katalogowej:

    [XMEGA][C] ADC - przerwanie od ADC

    Ale wielkie dzięki za pomoc bo nie wiedziałem o tym że w PMIC trzeba aktywować przerwania o określonym poziomie a domyślnie nie są one aktywne.
    Aktywowałem przerwania o najwyższym poziomie:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    I wygląda na to że wszystko działa.

    P.S. Klikam oczywiście przycisk "Pomógł" ;)
REKLAMA