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

Jak obliczyć opóźnienie w procedurze Delay w projekcie z Techniki Cyfrowej?

ElKuba 06 Kwi 2005 10:07 1626 6
REKLAMA
  • #1 1380322
    ElKuba
    Poziom 11  
    Posty: 27
    Witam :)

    Gdzieś tu na forum znalazłem taką procedurkę Delay:

    Delay:
    MOV B,#00h ;inaczej 256 bo najpierw jest odejmowane a potem porownywane
    MOV A,#00h
    x1:
    CJNE A,#100,x2 ;x2 wykona się 100 razy
    RET
    x2:
    INC A
    DJNZ B,$ ;$ - oznacza adres aktualnego rozkazu czyli skok do samego siebie
    MOV B,#00h ;j.w.
    SJMP x1

    Czy może ktoś mi powiedzieć jakie opóźnienie ona wprowadza, bo według mnie jest to trochę ponad 51ms, ale nie jestem pewien.
    Muszę wiedzieć to w miarę dokładnie bo jest mi to potrzebne w projekcie z Techniki Cyfrowej.

    Prosiłbym o pomoc i w miarę możliwości krótkie objaśnienie.

    Z góry dziękuję i pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 1380586
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    opoznienie bedzie wynosic w przyblizeniu 256*100*2 czyli 51200 cykli instrukcji, takie to proste :)
    Wynika to z tego, ze 100 razy wywolujemy petle, ktora wykonuje 256 razy instrukcje djnz a ta instrukcja trwa 2 cykle.

    Teraz w zaleznosci od zegara twojego procesora i od ilosci cykli jakie potrzebuje twoj procesor na wykonanie tych instrukcji bedzie zalezec opoznienie.

    Jak dobrze widze to jest to kod dla 8051. Jak dobrze pamietam to te procesory przewaznie wykonuja jedna instrukcje w 12 cykli zegarowych (zdaje sie ze sa tez zamienniki, ktore sa szybsze).

    Przyjmijmy teraz, ze twoj procesor dziala z kwarcem 12MHz.
    Korzystajac z tego, ze 12 cykli zegarowych to jedna instrukcja obliczamy, ze 12MHz/12=1MHz czyli wykonujemy milion instrukcji na sekunde.

    Poniewaz nasza funkcja delay zabiera ok 51200 cykli instrukcji to wystarczy obliczyc 51200/1000000 i mamy ok 0.051 sekundy czyli ok 51ms na wykonanie tej funkcji.


    Zeby obliczyc to dla swojego przypadku musisz wiedziec:
    -jaki masz kwarc
    -ile cykli potrzebuje twoj procesor na wykonanie instrukcji djnz (pozostale instrukcje sa tak malo razy wykonywane, ze mozna je pominac w obliczeniach)

    Obliczenia wykonujesz tak samo jak ja to zrobilem, tylko podstawiajac swoje dane.
  • REKLAMA
  • #3 1380593
    trikess
    Poziom 11  
    Posty: 72
    Pomógł: 1
    Ocena: 7
    Według mnie to czas trwania tej petli opozniajacej bedzie trwal 51,6ms przy kwarcu 12MHz gdy 1 cykl maszynowy wynosi 1us
  • #4 1380606
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    tak, juz zmienilem moja odpowiedz, cos mi z tylu glowy krzyczalo, ze djnz bedzie zabierac 2 cykle a nie 1... sprawdzilem i okazalo to sie prawda, wiec poprawilem obliczenia :-)
  • REKLAMA
  • #5 1380614
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    DJNZ trwa 2 cykle maszynowe, CJNE też dwa cykle ale wydaje mi się, że instrukcja DJNZ nie działa działa dla rejestru B. Sprawdź to w dokumenatcji.

    Co do pomijania to CJNE jest wykonywane 100 razy, (to samo dotyczy SJMP) czyli wcale nie tak mało...

    Z analizy MirekCz, po uwzględnieniu faktu, że DJNZ, CJNE i SJMP zajmują po dwa cykle maszynowe wychodzi, że to faktycznie będzie w okolicy 51ms.
  • REKLAMA
  • Pomocny post
    #6 1380704
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Żeby nie było wątpliwości DJNZ B,adres-skoku jest jak najbardziej poprawne. Jako argument możemy podawać RAM z zakresu 0-255 i te bajty SFR ktore są dostępne np DJNZ IE,adres-skoku.
  • #7 1381757
    ElKuba
    Poziom 11  
    Posty: 27
    Dziękuję wszystkim za tak szybką odpowiedz :)

Podsumowanie tematu

✨ Omówiono sposób obliczenia opóźnienia generowanego przez procedurę Delay napisaną w asemblerze dla mikrokontrolera 8051. Procedura wykonuje pętlę zagnieżdżoną, gdzie zewnętrzna pętla powtarza się 100 razy, a wewnętrzna 256 razy, wykonując instrukcję DJNZ, która trwa 2 cykle maszynowe. Całkowita liczba cykli instrukcji wynosi około 51200. Przy założeniu kwarcu 12 MHz i 12 cykli zegarowych na instrukcję, efektywna częstotliwość wykonania instrukcji to 1 MHz, co daje opóźnienie około 51 ms. Potwierdzono poprawność użycia instrukcji DJNZ z rejestrem B oraz uwzględniono czas trwania instrukcji CJNE i SJMP, które również zajmują 2 cykle maszynowe. W efekcie, opóźnienie procedury Delay jest zgodne z szacunkami około 51 ms, co jest istotne dla precyzyjnego sterowania w projektach z Techniki Cyfrowej.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA