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

[C]attiny2313 a biblioteka DELAY

jakubek151 30 Maj 2010 17:01 1958 8
REKLAMA
  • #1 8134119
    jakubek151
    Poziom 10  
    na wspomnianym w temacie attiny2313 chciałbym zrealizować mruganie diodą wykorzystaniem biblioteki delay. Udało mi się znaleźć pewien kod:

    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void) {
        DDRB |= 1<<PB0; /* set PB0 to output */
        while(1) {
            PORTB &= ~(1<<PB0); /* LED on */
            _delay_ms(100);
            PORTB |= 1<<PB0; /* LED off */
            _delay_ms(900);
        }
        return 0;
    }

    Używam zewnętrznego rezonatora 12MHz i ustawiłem odpowiednie fusebity. Jak wskazuje pierwsza linijka tego kodu, działa on dla wewnętrznego rezonatora 8MHz. Jednak bez tej pierwszej linijki kod i tak nie działa poprawnie, np. zamiast 1 sekundy opóźnienia wychodzi mu 88ms.

    czy biblioteka ta zrealizowana jest dla konkretnego zegara? W jaki sposób mógłbym się za to zabrać używając zewnętrznego rezonatora 12MHz?
  • REKLAMA
  • #2 8134166
    sony_1000
    Poziom 12  
    a spróbuj tak:

    void opoznienie (int czas)
    {
    for(int i = 0 ; i <czas; i++)
    {  
    _delay_ms(1);
    }
    
    }


    a później wywołuj funkcję
    opoznienie(200), gdzie 200 to będzie 200ms opóźnienia.
    Gdzieś słyszałem, że duże wartości opóźnienia za pomocą samego _delay_ms
    nie działa poprawnie.
    Druga sprawa - jeżeli potrzebujesz gdzieś interwały czasowe itp to polecam
    stosować wbudowane timery.
  • REKLAMA
  • #3 8134256
    tmf
    VIP Zasłużony dla elektroda
    Sony, słyszałeś błędnie. Najprościej jest zajrzeć do źródła, czyli do AVR-libc.
    jakubek - żeby delay działało poprawnie niezbędne jest poprawne zdefiniowanie zegara taktującego procesor. Czyli zdefiniowanie F_CPU, z tym, że robi się to globalnie w makefile, ew. możesz sobie to zdefiniować w opcjach projektu w AVR Studio, co spowoduje wygenerowanie odpowiedniego makefile. Przy okazji sprawdź jeszcze fusebity, czy na pewno taktujesz procesor z kwarcu.
  • #4 8136115
    28aug240
    Poziom 14  
    sony_1000 napisał:
    a spróbuj tak:

    void opoznienie (int czas)
    {
    for(int i = 0 ; i <czas; i++)
    {  
    _delay_ms(1);
    }
    
    }


    a później wywołuj funkcję
    opoznienie(200), gdzie 200 to będzie 200ms opóźnienia.
    Gdzieś słyszałem, że duże wartości opóźnienia za pomocą samego _delay_ms
    nie działa poprawnie.
    Druga sprawa - jeżeli potrzebujesz gdzieś interwały czasowe itp to polecam
    stosować wbudowane timery.



    Rozwiązanie kolegi powinno rozwiązać problem z tego co się orientuję to zmienna przekazywana do _delay_ms(); nie może być większa niż 255.
    Zawsze na wstępie swoich programów pisze
    
    void delay(int czas)
    {
    	//wdt_reset();
    	for (;czas!=0;czas--)
    	{
    	_delay_ms(1);
    	}
    }
  • #5 8136144
    rpal
    Poziom 27  
    a nie lepiej jest użyć np. 16 bitowego timera (o ile jest oczywiście wolny) i poprzez jego sprawdzanie odliczać zwlokę czasową ? To oczywiście taka luźna propozycja.
  • REKLAMA
  • #6 8136254
    mirekk36
    Poziom 42  
    28aug240 napisał:
    Rozwiązanie kolegi powinno rozwiązać problem z tego co się orientuję to zmienna przekazywana do _delay_ms(); nie może być większa niż 255.
    
    void delay(int czas)
    {
    	//wdt_reset();
    	for (;czas!=0;czas--)
    	{
    	_delay_ms(1);
    	}
    }


    To się źle orientujesz.

    Już ktoś wyżej napisał, i temat ten był wiele razy wałkowany. Ktoś kidyś puścił jakąś plotkę o tym, że dla _delay_ms() nie można dawać stałych większych niż coś tam - i tak kolene ludziska wałkują to wciąż jak przekupki na straganie.

    Najspokojniej w świecie można używać np _delay_ms(8500); ŻADEN PROBLEM.

    A tego typu procedurki jak twoja przydają się z całkiem innego powodu, ano takiego, że do _delay_ms() najlepiej jest przekazywać stałe dosłowne a nie parametr w postaci zmiennej bo to niesie czasem za sobą "dziwny" przyrost programu. Dziwny w cudzysłowiu, bo tak na prawdę oczywisty - jeśli się ktoś zechce bliżej zapoznać z funkcją _delay_ms(), która jest nawiasem mówiąc dobrze opisana zarówno w kodzie jak i w dokumentacji.
  • #7 8136380
    28aug240
    Poziom 14  
    mierkk36 wiem że zmienna w funkcji _delay_ms jest 8 bajtowa (double) tylko nie w każdym programie można jej narzucić wartość 8500 nie wiem od czego to zależy ale takie zjawisko zaobserwowałem. Swoją drogą to z chęcią bym się dowiedział czemu tak się dzieje że jedni mogą dawać 4000 do _delay_ms a inni nie.

    Pozdrawiam
  • REKLAMA
  • #8 8136432
    tmf
    VIP Zasłużony dla elektroda
    28aug240 - to może czas najwyższy zajrzeć do dokumentacji? Zapewniam cię, że znajdziesz tam odpowiedzi na nurtujące cie pytania.
  • #9 8136491
    mirekk36
    Poziom 42  
    28aug240 napisał:
    mierkk36 wiem że zmienna w funkcji _delay_ms jest 8 bajtowa (double)

    Nie wiesz a na dodatek kręcisz na maxa.

    28aug240 napisał:
    tylko nie w każdym programie można jej narzucić wartość 8500

    Nie wiesz, więc nie powtarzaj tego wkółko bo sam zaczynasz w to wierzyć.


    28aug240 napisał:
    nie wiem od czego to zależy ale takie zjawisko zaobserwowałem.

    To nie jest żadne zjawisko.


    28aug240 napisał:
    Swoją drogą to z chęcią bym się dowiedział czemu tak się dzieje że jedni mogą dawać 4000 do _delay_ms a inni nie.


    No jakoś wątpię, że chciałbyś się dowiedzieć, skoro wciąż to samo powtarzasz a nie chce ci się zajrzeć do pliku PDF, dokumentacji AVR GCC znajdującego się w twoim folderze WinAvr po zainstalowaniu. Poza tym można zajrzeć do odpowiedniego pliku nagłówkowego delay.h i prześledzić losy tej funkcji, żeby wszystkiego się dowiedzieć. Ale ty NIE! .... wolisz badać zjawiska i wciąż powtarzać soje przypowiednie i jak to ci się zdaje.

    No weź, że pan raz przeczytaj, potem ew o coś konkretnego dopytaj i będziesz miał problem z głowy raz na zawsze. A w innym przypadku próbując pisać kolejne swoje programy nadal będziesz ciągnął za sobą te zabobony i konstruował coraz dziwniejszy i pokręcony kod.
REKLAMA