Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Kategoria: Akumulatorki / Baterie / Ładowarki

Pętla opóźniająca w C dla AVR

Prymulka 19 Wrz 2005 11:53
  • #1 19 Wrz 2005 11:53
    Prymulka
    Poziom 18  

    Witam!
    Napisałem w C taką funkcję opóźniającą
    void wait100ms(unsigned char x)
    {
    unsigned char a,b;
    for (;x > 0; --x)
    for(b=50; b>0; --b)
    for(a=100; a>20; --a)
    __asm("nop");
    }
    Niestety nie wiem jakie wartości mają mieć dokładnie a i b by pętla trwała 100ms. Zaglądałem do listingu ale nie znam dobrze assemblera do AVR i nie mogę sobie z tym poradzić, konkretnie to nie wiem ile czasu zajmują same pętle nielicząc a*b. Kwarc mam 4MHz. Bardzo proszę o pomoc.
    Pozdrawiam, Łukasz

  • Pomocny post
    #2 19 Wrz 2005 12:30
    yego666
    Specjalista PLD

    Nie sadze, by ktokolwiek znal dokladne wartosci opoznien dla poszczegolnych iteracji petli for, zwlaszcza w wielopoziomowym ukladzie.
    Z doswiadczenia jednak moge podpowiedziec ze dwie petle FOR z licznikami do 255 powinny Ci bardziej niz wystarczyc.

    Wrzuc takie petle na symulator i popatrz ile czasu zajmuja, a potem dopasuj liczniki tak by otrzymac owe 100ms. To jest standardowe podejscie do tego typu zagadnienia.
    Inna mozliwosc to wywolac kod asemblerowy z C i w nim skonstruowac zadane opoznienie, co jest o tyle latwiejsze, ze dla instrukcji asemblerowych masz zawsze podana ilosc cykli na egzekucje.

    Pozdrawiam, yego

  • Pomocny post
    #3 19 Wrz 2005 14:10
    sepher
    Poziom 19  

    Jeśli używasz WinAVR, zajrzyj do katalogu z bibliotekami i poszukaj pliku delay.h. Zawiera ona funkcje opóźniające, jako parametry podajesz tylko ilość ms lub us.

  • #4 19 Wrz 2005 20:48
    Prymulka
    Poziom 18  

    A w czym moge to zasymulować? i czy mam symulować kod asembleroski z listingu czy odrazu z C. Używam AVRSide. Przeglądałem tą bibliotekę delay.h ale coś nie mogę się połapać w tych funkcjach, nie wiem chyba jestem już 100 lat za murzynami :D.

  • #5 19 Wrz 2005 21:02
    sepher
    Poziom 19  

    Dodajesz bibliotekę dyrektywą #include i dostępne stają się 2 funkcje (teraz wyciąg z dokumentacji ;)):

    _delay_us(double __us)

    The maximal possible delay is 768 us / F_CPU in MHz.

    _delay_ms(double __ms)

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

    F_CPU musisz oczywiście gdzies zdefiniować, na przykład tak

    #define F_CPU 16000000UL // 16 MHz

    literki UL informują kompilator, że ma traktować to jako unsigned long.

    Co do drugiej czeście pytania - jest możliwość symulowania plików wyprodukowanych przez AVR-GCC w AvrStudio. Jako jedną z flag kompilatora podaje się żądany format pliku. Ja używam formatu elf/dwarf. W symulatorze widać krok po kroku instrukcje w C, tak jak zapisałeś w programie. Jest tez mozliwość podejrzenia jak każda z wprowadzonych została 'przetłumaczona' przez kompilator.

  Szukaj w 4mln produktów
Przeglądaj produkty