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.

Asembler - Opóźnienie w Asemblerze

marcin89e 26 Lut 2013 11:42 1353 4
  • #1 26 Lut 2013 11:42
    marcin89e
    Poziom 2  

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Witam, mógłby mi ktoś matematycznie wytłumaczyć w jaki sposób to opóźnienie się tworzy, na kwarcu 11,0592 daje około 0,7s. Sprawdzałem w keil uvision ale doszedłem do samych bzdur. Oczywiście rozumiem co robi rozkaz DJNZ :)

    0 4
  • #2 26 Lut 2013 11:43
    mickpr
    Poziom 39  

    Znasz znaczenie DJNZ?

    Decrement Jump if Not Zero.
    Zmniejsza wartość podanego rejestru, a następnie wykonuje skok - gdy wartość (rejestru) wciąż jest <> 0.
    Jak wiadomo czas wykonywania instrukcji jest niezerowy - stąd powstaje "regulowane " (podanymi wartościami) opóźnienie.
    Zmienia się bowiem liczba iteracji pętli - więc i liczba wykonanych instrukcji.

    Czy jeszcze coś jest niejasne?

    0
  • #3 26 Lut 2013 11:47
    marcin89e
    Poziom 2  

    Popraw mnie jeżeli się mylę, ten program wykonuje się 10+(10*180)+(10*180*200)?

    0
  • #4 26 Lut 2013 12:00
    mickpr
    Poziom 39  

    Ile się wykonuje zależy od typu procesora..
    Nie każda instrukcja wykonuje się tyle samo razy
    Przykładowo: DJNZ jak wykonuje skok - wykonuje się dłużej (zabiera więcej cykli taktów CPU) - niż jak skoku nie wykonuje.
    Wszystko zależy od typu procka (i częstotliwości).
    Do tego zależy - czy czasem nie masz włączonych przerwań.
    Jak wiadomo - przerwanie przerywa działanie pętli i wykonuje się ona jeszcze dłużej.

    Stosowanie takich pętli (zwłaszcza długich) jest wielce nieefektywne.
    Procek w nich nic nie robi.
    O wiele lepszym rozwiązaniem jest stosowanie timerów i przerwań (właśnie).

    0
  • #5 26 Lut 2013 12:08
    marcin89e
    Poziom 2  

    hehe doszliśmy razem z kolegą po schemacie blokowym, że program wykonuje się 360 000 x, nie bez przypadku podałem częstotliwość kwarcu. DJNZ w moim uP trwa 2 cykle, czyli ~2,16 us. Dlatego całość ~0,7. Używam tego opóźnienia w zegarze binarnym, przy obsłudze przycisków, sam zegar operuje na T0.

    0