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

ATMega8 - Opóźnienie powodowane usypianiem procesora (TIMER, ADC)

warez 11 Lip 2014 23:11 906 4
  • #1 11 Lip 2014 23:11
    warez
    Poziom 8  

    W swoim programie wykorzystuję m. in. TIMER i przetworniki ADC.
    Timer działa w trybie CTC, dane z przetwornika pobieram funkcją adc_get():

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dane z przetwornika są pobierane w pętli głównej, a timer ma za zadanie liczyć realny czas. Problem w tym, że kiedy procesor wchodzi w stan uśpienia timer się zatrzymuje, co w efekcie powoduje spore opóźnienie (timer "gubi" kilka sekund na jednej minucie).
    Zastosowałem zewnętrzny kwarc 16MHz i po wykomentowaniu wywołania adc_get() odmierzanie czasu daje efekty, jak na moje potrzeby, bardzo zadowalające (18 minut testu bez zauważalnych opóźnień / przyspieszeń).

    Moje pytanie brzmi czy mogę pogodzić precyzyjny odczyt z ADC (z uśpieniem) i dokładny timer czy muszę wybrać albo precyzyjne ADC i niedokładny timer albo standardowy odczyt z ADC i dokładny timer?

    Czy wywołanie mojej funkcji adc_get() będzie zawsze zajmowało tyle samo czasu czy czas jej wykonania jest od czegoś zależny? Ewentualnie czy można w jakiś sposób taki czas obliczyć? Wtedy mógłbym wyskalować timer do zadowalającej precyzji poprzez wpisanie niższej wartości w rejestr OCR1A. Mogę to oczywiście robić eksperymentalnie, ale wymagałoby to sporo czasu.

    Z góry dziękuję za wszelką pomoc. Jeżeli taki temat był już gdzieś poruszany to proszę o link, ponieważ nie udało mi się znaleźć nic na ten temat.

    0 4
  • #2 11 Lip 2014 23:30
    excray
    Poziom 39  

    Atmega 8 ma 3 timery więc który timer Ty wykorzystujesz?

    0
  • #3 11 Lip 2014 23:32
    warez
    Poziom 8  

    Wykorzystuję TIMER1

    0
  • Pomocny post
    #4 12 Lip 2014 07:06
    emarcus
    Poziom 35  

    warez napisał:


    Moje pytanie brzmi czy mogę pogodzić precyzyjny odczyt z ADC (z uśpieniem) i dokładny timer czy muszę wybrać albo precyzyjne ADC i niedokładny timer albo standardowy odczyt z ADC i dokładny timer?


    Timer1 jest taktowany przez prescaler z CLK_I/O, a podczas 'ADC Noise Reduction' , ten zegar jest nieaktywny/ wyłączony.
    Patrz tabela14 w datasheet; w której znajdziesz że podczas tego trybu czynny jest /może byc clk_ASY. Doczytaj uwagę (2).
    Znaczy to że Timer2 w trybie asynchronicznym i oscylatorem z zewn. kwarcem 32K może spełnic zadanie (pracowac niezaleznie od tego trybu uśpienia).

    e marcus

    0
  • #5 13 Lip 2014 08:11
    warez
    Poziom 8  

    Dziękuję bardzo za pomoc, problem rozwiązany.

    0