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

[ATMEGA32A][C] Problem z czasami opóźnień

Sokol_09334 24 Cze 2010 15:59 1305 13
  • #1 8226675
    Sokol_09334
    Poziom 15  
    Witam wszystkich podczas ostatnich zabaw z programowaniem zgubił mnie jeden problem a mianowicie ... wykorzystując delay.h i instrukcję np _delay_ms(100) zauważyłem ze ten czas jest o wiele krótszy ... chciałem dowiedzieć sie od czego to zależy ... fusebits ustawione na zawnętrzny oscylator ... czy może to być wina kompilatora ? ... używam winavr i szukam rozwiązania a nie mogę go znaleźć. Pozdrawiam
  • Pomocny post
    #2 8226695
    xanio
    Poziom 27  
    A f_cpu ustawione dobrze?

    I jeszcze info:

    Cytat:

    
    void _delay_ms  	(  	double   	 __ms  	 )   	
    


    Perform a delay of __ms milliseconds, using _delay_loop_2().

    The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).

    The maximal possible delay is 262.14 ms / F_CPU in MHz.

    When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution.



    pogrubienie moje
  • #3 8226757
    Sokol_09334
    Poziom 15  
    Wszystko ustawione jak należy w makefile F_OSC = 12000000 i dodatkowo dla pewności w programie to samo ... dla _delay_ms(500) pomiar z oscyloskopu mam 43 ms ... solidne niedociągnięcie
  • Pomocny post
    #4 8226962
    flapo213
    Poziom 21  
    A msza włączone przerwania ? Pamiętaj że przerwania na pewno wydłużą czas. Pamiętaj również że to nie jest precyzyjne odmierzenie czasu tylko szacunkowe.

    Sprawdź również opcje optymalizacji jak są ustawione. Włączenie optymalizacji mocno !!!! skróci delaya .

    Pozdrawiam
  • Pomocny post
    #5 8227018
    _Robak_
    Poziom 33  
    Po pierwsze to włączenie optymalizacji nie skróci delaya, tylko wyłączenie go wydłuży. Druga sprawa to kolega Sokol_09334 nie bardzo chce chyba czytać ze zrozumieniem. Nie chodzi o to żeby zadeklarować poprawną wartość FOSC, tylko powyżej 262.14 ms / F_CPU delay jest niedokładny, czyli u kolegi już przy 22ms.
  • Pomocny post
    #6 8227216
    gaskoin
    Poziom 38  
    no i jeszcze na jedno należy zwrócić uwagę:

    #ifndef F_CPU
    # warning "F_CPU not defined for <util/delay.h>"
    # define F_CPU 1000000UL
    #endif
    


    jak zadeklarujesz F_OSC a nie F_CPU to mimo swoich 12MHz, program przelicza to dla 1MHZ, co by się zgadzało ponieważ masz 500/12 = około 42ms.

    Przy kompilacji nie wyskoczył Ci przypadkiem taki warning?
  • #7 8228791
    Sokol_09334
    Poziom 15  
    Problem się rozwiązał ... Dzięki wszystkim :)
  • #8 8228833
    flapo213
    Poziom 21  
    Hmmm,

    Kolego warto by chyba napisać dla innych użytkowników którzy być może w przyszłości będą mieli z tym problem co było nie tak.


    PS. Do użytkownika '_Robak_':

    Jaka jest różnica pomiędzy

    optymalizacjia ustawiona na O0

    loop = 0xFF;
    while(loop--);

    a

    optymalizacja ustawiona na O2 czy s

    loop = 0xFF;
    while(loop--);

    przy założeniu że zmienna loop będzie pozbawiona deklaracji volatile, kompilowane w GCC naturalnie.

    Pozdrawiam
  • #9 8229285
    _Robak_
    Poziom 33  
    To wcale nie jest takie proste, przy włączonej optymalizacji, niektóre kawałki kodu mogą w ogóle nie być wykonywane;) Proszę zobaczyć sobie kod wynikowy w asemblerze.
  • #10 8229404
    flapo213
    Poziom 21  
    No dokładnie zostaną ominięte co sprawi że np z 500ms zrobi się np 10ms czyli wejście i wyjście z funkcji itd. Więc wniosek jest oczywisty nie zwolni tylko przyśpieszy jeśli już.

    Pozdrawiam
  • #11 8229862
    _Robak_
    Poziom 33  
    A kolega dalej swoje, delay jest tak napisany że działa TYLKO dla optymalizacji -os, więc nie można go skrócić przez jej zmianę!
  • #12 8230065
    flapo213
    Poziom 21  
    Nie spoko wszystko gra tylko udeżyło mnie stwierdzenie

    Cytat:
    Po pierwsze to włączenie optymalizacji nie skróci delaya, tylko wyłączenie go wydłuży.....


    Temat w tej kwestii zamknięty jak rozumiem
  • #13 8230376
    gaskoin
    Poziom 38  
    Jedna kwestia pozostaje niewyjaśniona

    flapo213 napisał:


    Kolego warto by chyba napisać dla innych użytkowników którzy być może w przyszłości będą mieli z tym problem co było nie tak.

  • #14 8231041
    Sokol_09334
    Poziom 15  
    Ogolnie miałem lekkie niedociągnięcie w makefile ... zrobiłem nowy i wszystko jest OK
REKLAMA