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.

sposób obliczenia opóźnienia asembler

Rafal10202 16 Lis 2013 16:14 1296 9
  • #1 16 Lis 2013 16:14
    Rafal10202
    Poziom 9  

    Witam,
    piszę z prośba o wytłumaczenie mi jak liczy się opóźnienie w sekundach. Procesor to at89s4051 z zegarem 24Mhz.

    kod opóźnienia:
    lcall delay

    delay:
    mov R0,#0xff
    mov R1,#0xff
    mov R2,#0xff
    petla:
    djnz R0,petla
    djnz R1,petla
    djnz R2,petla
    ret


    i teraz tak wiem że lcall 2 cykle, mov 1 cykl, ret 2cykle, djnz 2 cykle, jak policzyć czas opóźnienia wywołany tą funkcją?


    P.S. wyszło mi 1535 cykli łącznie, nie wiem czy dobrze?

    0 9
  • #3 16 Lis 2013 16:42
    Rafal10202
    Poziom 9  

    a te tryby zegara clk/6 ,clk/12 co to dokładnie jest ?

    0
  • #4 16 Lis 2013 16:49
    excray
    Poziom 39  

    U Ciebie jest CLK/12. Rodzina 8051 ma zazwyczaj dzielony zegar systemowy przez 12. Jeśli masz kwarc 24MHz to zegar systemowy jest 24/12 czyli 2MHz. Czyli jeden cykl rozkazowy trwa 0,5us. Rozkaz 2-cyklowy taki jak DJNZ będzie wykonywany 1uS. Funkcja która trwa 133693440 cykli będzie wykonywana 66,84 sekundy.

    0
  • #5 16 Lis 2013 16:51
    Rafal10202
    Poziom 9  

    a nie 250ns? bo tam w tym linku co podawałeś widziałem że liczono tak 12/24000000 = 250ns

    0
  • Pomocny post
    #6 16 Lis 2013 16:55
    excray
    Poziom 39  

    12/24000000 = 0,5us

    0
  • #7 16 Lis 2013 17:30
    Rafal10202
    Poziom 9  

    a tak pomyłka ;)

    Dodano po 30 [minuty]:

    org 000h




    mov P1,#0x01
    tam: mov A, P1
    rl A
    mov P1,A
    lcall delay
    ljmp tam


    delay:
    mov R0,#0xff
    mov R1,#0xff
    mov R2,#0xff
    lop:
    djnz R0,lop
    djnz R1,lop
    djnz R2,lop
    ret


    end



    to mam to mam taki programik żeby diodki sie zapalały po koleji od prawej do lewej i tak w kółko, z wyliczeń wynika że powinny sie zapalać co 60 sek. a one tak mniej więcej co sekunde przeskakują w symulatorze w keilu. Nie wiem co jest nie tak?

    0
  • Pomocny post
    #8 16 Lis 2013 18:01
    excray
    Poziom 39  

    Bo to jest symulator. Poza tym ja też popełniłem błąd. Prawidłowy przybliżony wzór to 256*256*255*2 czyli 33423360 a cały delay powinien trwać 16,71s.

    0
  • #9 16 Lis 2013 18:17
    Rafal10202
    Poziom 9  

    a właściwie czemu na końcu jest 255 a nie 256?

    0
  • #10 16 Lis 2013 18:37
    excray
    Poziom 39  

    Bo tyle wpisałeś do rejestru: "mov R2,#0xff". 0xFF to jest właśnie 255. W poprzednich tez tyle wpisałeś ale taka wartość tam wykona się tylko raz a następne pętle będą trwać 256 cykli. Dokładniej Twoja pętla wykona się 2*255*255 + 2*256*256*254 cykli plus cykle "mov...", "ret", i "call".

    0