W swoim programie wykorzystuję m. in. TIMER i przetworniki ADC.
Timer działa w trybie CTC, dane z przetwornika pobieram funkcją adc_get():
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.
Timer działa w trybie CTC, dane z przetwornika pobieram funkcją adc_get():
Kod: C / C++
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.