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

P89C668 - Jak działa i obliczać 1s Delay w Assemblerze?

atyll 18 Lis 2012 19:57 2457 9
REKLAMA
  • #1 11545318
    atyll
    Poziom 9  
    Posty: 8
    Witam, posiadam taki oto kod na 1 sekundowego Delay w Assemblerze.

    Uzywamy Microcontrollera P89C668

    
    ; 1s Delay subroutine   
    DELAY: MOV R0,#100   ;R0 = 100
    Loop1: MOV R1,#80    ;R1 = 68
    Loop2: MOV R2,#80    ;R2 = 68
    Loop3: DJNZ R2,Loop3    ;decrement 1 from R2 till = 0
       DJNZ R1,Loop2    ;decrement 1 from R1, if != 0 execute Loop2 again
       DJNZ R0,Loop1    ;decrement 1 from R1, if != 0 execute Loop1 again
      
       RET


    Wiem jak go używać, lecz byłby ktoś w stanie mi dokładnie opisać, jak działa ten delay i jak się go oblicza?

    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #3 11550194
    excray
    Poziom 41  
    Posty: 5501
    Pomógł: 739
    Ocena: 656
    Wykonują się 3 kolejne pętle łącznie nieprecyzyjnie licząc to <100*80*80 * czas trwania rozkazu DJNZ>

    Dodano po 36 [minuty]:
    Jeśli koniecznie chcesz precyzyjnie licząc to:
    P89C668 - Jak działa i obliczać 1s Delay w Assemblerze?
    t_MOV - czas trwania rozkazu MOV
    t_RET - czas trwania rozkazu RET
    t_CALL - czas trwania rozkazu CALL
    t_DJNZ - czas trwania rozkazu DJNZ
    Czasy sprawdź w datasheet.
    R2 - zawartość rejestru R2 - tutaj 80
    R1 - zawartość rejestru R1 - tutaj 80
    R0 - zawartość rejestru R0 - tutaj 100
    T - całkowity czas trwania funkcji
    T = (((t_DJNZ * R2) + t_DJNZ + t_MOV)* R1 + t_DJNZ + t_MOV) * R0 + t_MOV + t_RET + t_CALL

    Zakładając że:
    t_DJNZ = t_MOV = t_CALL = 2 cykle maszynowe
    t_RET = 1 cykl maszynowy
    w pierwszym przypadku liczenia wychodzi nam 1280000 cykli maszynowych a w drugim 1312405 cykle maszynowe. Błąd poniżej 3% więc spokojnie można liczyć 1-szym sposobem.
  • #4 11557389
    atyll
    Poziom 9  
    Posty: 8
    Trochę się już pogubiłem

    Kolega mi dziś powiedział, że to jest tak:

    100 X 80 X 80 X 2 X 542 = 1005952000 = 1 sekunda

    Ma racje?
  • Pomocny post
    #5 11557927
    excray
    Poziom 41  
    Posty: 5501
    Pomógł: 739
    Ocena: 656
    100 x 80 x 80 x 2 x 542 = 693 760 000
    Jaką masz częstotliwość kwarcu pracującego z tym mikroprocesorem? Czy nie jest to przypadkiem 7,68MHz albo 15,36MHz?
  • #6 11558053
    atyll
    Poziom 9  
    Posty: 8
    11.0592 MHz z tego co wiem.

    Czemu 1000? Kurde już się gubie :/
  • REKLAMA
  • #7 11558356
    excray
    Poziom 41  
    Posty: 5501
    Pomógł: 739
    Ocena: 656
    Literówka. 100 oczywiście miało być. Testowałeś tą funkcję? Ona trwa rzeczywiście 1 sekundę? Czy po prostu znalazłeś ją gdzieś w necie? Bo moim zdaniem ta funkcja trwa 1 sekundę ale pod warunkiem że masz kwarc 7,68MHz (dla trybu CLK/6) albo 15,36MHz (dla trybu CLK/12). Jeśli wpiszesz te wartości "zakomentowane" czyli 100*68*68 to rzeczywiście uzyskasz coś około 1 sekundy przy kwarcu 11,059MHz i przy trybie CLK/12, chociaż lepiej jest wpisać 100*66*66.
  • #8 11558470
    atyll
    Poziom 9  
    Posty: 8
    Tak, testowałem i wgrywałem na mikroprocesor i jest sekundka. Robie projekt z światłami drogowymi i wszystko skończyłem, tylko jeszcze trzeba będzie się troche tłumaczyć, a że z elektroniką jestem poczatkujacy to nie ogarniam troche :)

    Tylko mi się pomyliło, na sekundke mam:
    
    ; 1s Delay subroutine   
    DELAY: MOV R0,#145   ;R0 = 145
    Loop1: MOV R1,#80    ;R1 = 80
    Loop2: MOV R2,#80    ;R2 = 80
    Loop3: DJNZ R2,Loop3    ;decrement 1 from R2 till = 0
    
       DJNZ R1,Loop2    ;decrement 1 from R1, if != 0 execute Loop2 again
       DJNZ R0,Loop1    ;decrement 1 from R1, if != 0 execute Loop1 again
      
       RET


    145 x 80 x 80 x 2 x 542 = 1005952000 co równa się nieco ponad sekundke
  • REKLAMA
  • #9 11558665
    excray
    Poziom 41  
    Posty: 5501
    Pomógł: 739
    Ocena: 656
    Teraz wszystko się zgadza. To 542 to 542nS bo tyle trwa 1 cykl maszynowy przy kwarcu 11,059MHz i przy trybie CLK/6:
    6/11059000 = 542nS - tyle trwa 1 cykl maszynowy.
    Rozkaz DJNZ trwa 2 cykle maszynowe. Posiłkując się podanym przeze mnie uproszczonym wzorem: <R0*R1*R2 * czas trwania rozkazu DJNZ>
    145*80*80 * 2 * 542nS = 1005952000ns
  • #10 11559069
    atyll
    Poziom 9  
    Posty: 8
    No i wszystko jasne, dzięki za wielkie za pomoc.

    Została mi ostatnia rzecz, o której zapomniałem, Flow Chart (Schemat Blokowy) na tego delaya ;/

Podsumowanie tematu

✨ Użytkownik zadał pytanie dotyczące działania i obliczania opóźnienia 1 sekundy w kodzie assemblera dla mikroprocesora P89C668. W odpowiedziach wyjaśniono, że opóźnienie jest realizowane poprzez zagnieżdżone pętle, a całkowity czas opóźnienia można obliczyć na podstawie liczby cykli maszynowych dla poszczególnych instrukcji. Ustalono, że przy częstotliwości kwarcu 11,0592 MHz i trybie CLK/6, czas jednego cyklu wynosi 542 ns. Użytkownik potwierdził, że jego funkcja działa poprawnie, a obliczenia opóźnienia są zgodne z oczekiwaniami. Dodatkowo, użytkownik poprosił o pomoc w stworzeniu schematu blokowego dla tej funkcji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA