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

Attiny25 - problem z multipleksowaniem ADC w przerwaniu, zmienne kanały

felo188 12 Mar 2012 22:09 2163 17
REKLAMA
  • #1 10669703
    felo188
    Poziom 10  
    Witam.
    Odczytuje dwie wartości napięć. Nie wiem czemu nie działa multipleksowanie wejść ADC w przerwaniu. Jak zostawię zmienną kanal stałą, tzn albo 1 albo 2 to odpowiednie ADC działa. Niestety jak próbuje zmieniać kanal w przerwaniu to nie działa żadne z nich.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10669810
    Konto nie istnieje
    Poziom 1  
  • #3 10669949
    tmf
    VIP Zasłużony dla elektroda
    Dlatego nie ma większego sensu stosować free running, przerwań i multipleksowania kanałów. Robi się normalnie single conversion i w przerwaniu startuje się kolejną po wcześniejszej zmianie kanału.
  • #4 10670501
    felo188
    Poziom 10  
    Dziękuje za podpowiedzi ;) Sprawdzę popołudniu.
  • REKLAMA
  • #5 10672351
    felo188
    Poziom 10  
    Próbuje uruchomić tryb single ale coś idzie opornie.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A tak inicjuję ADC:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Teraz nawet pojedynczy kanał nie działa, tzn jak zostawię na sztywno np kanal=1 bez inkrementacji kanal w przerwaniu.
    Może zmienić i po prostu wywoływać pomiar ADC w timerze?
    Edit:
    No tak czytam ADC w przerwaniu a przecież nie wywołuję tego przerwania bo nie mam żadnego handlera do niego. Chyba w tym tkwi błąd.
  • #6 10673512
    Konto nie istnieje
    Poziom 1  
  • #7 10673632
    snnaap
    Poziom 25  
    Najgorzej jest jak ktoś pokazuje fragmenty kodu, pokaż cały kod może tam tkwi błąd.

    PS jak ty chcesz wywołać to przerwanie?

    Przerwanie wywołuje się wtedy gdy zakończy się konwersja, Ty natomiast startujesz konwersję w tym przerwaniu.

    To jest wywołanie przerwania w przerwaniu. Z tym że pierwsze przerwanie się nie wywoła bo nie masz poza przerwaniem startu konwersji :d

    Troszkę zawile to napisałem ale mam nadziej że zrozumiesz.

    Pozdrawiam
  • #8 10673779
    felo188
    Poziom 10  
    Przepraszam za zamieszanie.
    atom1477 No tak ;)
    snnaap zgadza się. Już zmieniłem to podczas inicjalizacji ADC.
    Wklejam cały kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 10673809
    snnaap
    Poziom 25  
    felo188 napisał:
    Przepraszam za zamieszanie.
    atom1477 No tak ;)
    snnaap zgadza się. Już zmieniłem to podczas inicjalizacji ADC.
    Wklejam cały kod:

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



    To dalej nie ma prawa działać, jeżeli chcesz tak zrobić to musisz się zdecydować czy korzystasz z przerwania czy używasz instrukcji :

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Instrukcja ta czeka na zakończenie konwersji czyli zgłoszenie przerwania. Umieszczenie jej w przerwaniu zapętla przerwanie i prowadzi do nieuchronnego przepełnienia stosu a następnie resetu uK (wyszła rekurencja ;)).


    Jeżeli chcesz zostać przy powyższej instrukcji to cały kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Musisz przerzucić do głównego maina i zapomnieć o przerwaniach.
  • REKLAMA
  • #11 10673825
    felo188
    Poziom 10  
    snnaap no dobrze, rozumiem. A jakbym chciał zostać przy przerwaniu i pojedynczym trybie pomiaru to wtedy co musiałbym zmienić?
    dondu napisał:
    Ten fragment kodu to tzw. koszmarek programistyczny :)
    ;)
  • REKLAMA
  • #14 10673901
    felo188
    Poziom 10  
    ^^ Wyjaśnij mi proszę czemu ustawiasz odpowiednie wejście ADC dopiero po odczycie wartości?
  • Pomocny post
    #15 10674008
    snnaap
    Poziom 25  
    Tak, tu popełniłem mały błąd chyba z rozpędu, przy takiej konfiguracji odczytujesz poprzedni kanał.

    Zamień:

    ADMUX = _BV(MUX0) | _BV(MUX1);// kanał ADC3

    z

    ADMUX = _BV(MUX0); // Kanał ADC1

    i wszystko powinno być ok.

    Czyli przy inicjalizacji startujesz adc z kanałem 1, dgy konwersja kończy się masz wynik w ADC jeżeli kanał = 1 to wartość z ADC trafia do zmiennej adc1 i sprawdzany jest ten "długi" warunek następnie zmieniasz kanał z 1 na 2 i startujesz ponownie konwersje:D

    Pozdrawiam


    PS

    nie

    if (kanal <= 3) kanal++;
    else kanal=1;

    tylko

    if (kanal < 3) kanal++;
    else kanal=1;

    bo przy (kanal <= 3)
    masz trzy wartości ... 1, 2, 3...
    a powinny być tylko 1 i 2
  • #16 10674837
    felo188
    Poziom 10  
    ^^ Ok. Postaram się dziś poprawić kod ;) Dziękuje
  • #18 10680796
    felo188
    Poziom 10  
    ^^ Tak ;) Dziękuje raz jeszcze.
REKLAMA