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] - Funkcja delay - niedokładność

LuigiPL 06 Paź 2014 00:23 972 3
  • #1 06 Paź 2014 00:23
    LuigiPL
    Poziom 1  

    Zapoznałem się z "AVR Libc Reference Manual", wynika z niego, że funkcję _delay_ms i delay_us po przekroczeniu pewnej wartości jako parametru traci na swej dokładności.
    Ponadto w kilku wątkach na forum, związanych z odmierzaniem czasu, wspomniano również, że ww. funkcję są "strasznie" niedokładne, jednak nie wyjaśniono tego dokładniej.
    Tutaj pojawia się moje pytanie, czy są jeszcze jakieś inne przyczyny niedokładności poza wspomnianymi w ww. Manualu.
    Jeśli są, to prosiłbym o wypisanie jakie.

    1 3
  • Pomocny post
    #2 06 Paź 2014 01:18
    vonar
    Poziom 28  

    Nawet z uwzględnieniem zmniejszenia dokładności (które przy wykorzystaniu aktualnej wersji avr-gcc przy typowych opcjach kompilacji nie występuje – patrz fragment If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) support[…] w dokumentacji) te funkcje (jako same w sobie) są całkiem niezłe. W praktycznych zastosowaniach ich niedokładność (a konkretniej możliwość odczekania czasu dłuższego niż zadany) wynika z możliwości wykonywania przez rdzeń procedur obsługi przerwań w czasie działania funkcji _delay_xx (zliczają one cykle procesora, więc czas zużyty na obsługę przerwań zsumuje się z zadanym). Czy taka sytuacja może wystąpić i w jakim stopniu będzie stanowić problem zależy już od konkretnego programu.

    Zobacz też ten artykuł.

    0
  • #3 06 Paź 2014 09:04
    GanzConrad
    Poziom 21  

    LuigiPL, w większości przypadków nie ma potrzeby używania tej funkcji, zaleca się wręcz unikanie tego typu mechanizmów - nie należy ona do tzw. "dobrych praktyk". Jej dokładność wystarcza do mikrosekundowych opóźnień i chętnie jest wykorzystywana do obsługi komunikacji z niektórymi czujnikami, ale trzeba zdawać sobie sprawę, że wprowadza ona procesor w stan wielokrotnego wykonywania jednej pętli co wręcz zakrawa na barbarzyństwo ;-). Ja staram się jej unikać jak ognia (wykorzystuję tylko do testów migania diodą).
    Jak chcesz dokładności (i nie tylko) to korzystaj z Timerów.

    0