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 ustawić opóźnienie 2s na mikrokontrolerze 89C2051?

DAREK4444 15 Lis 2003 13:05 1518 9
REKLAMA
  • #1 400631
    DAREK4444
    Poziom 19  
    Posty: 425
    Pomógł: 5
    Ocena: 23
    Witam. Jak zrobić (wiem tylko że to się jakoś robi na rejestrach) opóźnienie np 2s.??? Z góry dzieki za odpowiedzi.
  • REKLAMA
  • #2 400633
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    A jaki masz kwarc?
    Robi się to na tajmerze, w obsłudze przerwania (wywoływane cykliczne co zadany czas np. co 10ms) robisz licznik programowy, który Ci odlicza te 2 sek.
    Ale z tego co widzę to chyba nie za duzo wiesz o uC? Do czego to ma służyć?
  • REKLAMA
  • #3 400654
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Jeśli procek ma nie robić nic innego, to proponuje zrobić pustą pętle odliczającą czas.
  • REKLAMA
  • #4 400658
    ACULA
    Poziom 34  
    Posty: 3005
    Pomógł: 105
    Ocena: 114
    np

    zaczekaj: ;etykieta
    mov R1,#0 ;instrukcja,wyzerowanie rejestru R1
    wewnetrzna_petelka:;etykieta
    mov 50h,#0 ;instrukcja,wyzerowanie rejestru
    djnz 50h,$ ;instrukcja,R2=R2-1jesli=0 dalej,jesli1 powtorz komende
    djnz R1,wewnetrzna_petelka;instrukcja,R2=R2-1jesli=0 dalej,jesli1 skocz do etykiety
    ret ;instrukcja,wroc z podprogramu
  • REKLAMA
  • #5 400894
    DAREK4444
    Poziom 19  
    Posty: 425
    Pomógł: 5
    Ocena: 23
    Bo zrobiłem program testujący bramki NAND i między podawanymi stanami musi być opóźnienie. ACULA: Mam sprawę. Mógłbyś mi wytłumaczyć ten zapis. Mi on działa ale chciałbym poznać to dogłębnie i to zrozumieć. Czemu tam jest 50H, co znaczy dnjz i czy wew. pętla jest konieczna? I jak można przeliczyć jaką liczbe dać żeby otrzymać n sekund?
  • #6 401050
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    :arrow: Darek, sory ale odnosze wrażenie że nie wiesz jak pisać programy pod ten procesor. Wszystkie podane "dziwne" słowa przez Acule są to mnemoniki do rozkazów procesora. Wartość 50H jest to adres komórki pamięci w której znajduje się licznik odliczonych pętli. Czas trwania opóźnienie można wyliczyć na podstawie częstotliwości zegara i czasu wykonywania poszeczególnych intrukcji w podanym programie.
  • #7 401308
    ACULA
    Poziom 34  
    Posty: 3005
    Pomógł: 105
    Ocena: 114
    Darek4444 :arrow: a wczym właściwie piszesz??
    dla znające asembler powinno być wszystko jasne ;)
  • #8 401348
    DAREK4444
    Poziom 19  
    Posty: 425
    Pomógł: 5
    Ocena: 23
    No właśnie może Wam się to wydać głupie, ale kumam assemblera nawet trochę ale pętle to moja zgroza :( Nie mówie że jestem specem ale swoje wiem. A w jaki sposób można wydłużać i skracać ten czas? I czemu zeruję rejestr np. R2?
  • #9 402630
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Darek, postaram Ci trochę przybliżyc pojęcie pętli czsowej.
    Kazdy rozkaz wiadomo zajmuje trochę czasu. Np przy kwarcu 12M
    taki rozkaz NOP (nic nie rób) to 1 mikros.
    Chcąc uzyskać np opóznienie 10 us mozesz napisac 10 takich rozkazów.
    Ale mozna to zrobic całkiem inaczej.
    MOV R7,#5
    DJNZ R7,$ (rozkaz ten idejmuje 1 od zawartości rejestru R7 i jeśli
    pozostała wartość w R7 nie=0 skacze do etykity, w tym
    przypadku do siebie samego).
    Ponieważ czas wykonywania tego rozkazu jest dwa razy dłuższy od NOP
    dostajesz 10 us. Możesz to też napisać tak:
    ET1: DJNZ R7,ET1
    Zobacz, że wstawiając na początku MOV R7,#0 uzyskujesz 256 powtórzeń
    pętli a więc 512 us. DJNZ bowiem najpierw odejmuje a dopiero potem
    sprawdza czy zero.
    Dam Ci teraz bardziej rozbudowany przykład, z dwoma petlami.
    MOV R6,#14
    ET1: MOV R7,#100
    DJNZ R7,$
    DJNZ R6,ET1
    Teraz wewnętrzna pętla z R7 wykonywała się będzie 14 razy.
  • #10 402666
    DAREK4444
    Poziom 19  
    Posty: 425
    Pomógł: 5
    Ocena: 23
    olekewaagata dzięki. Twoje wytłumaczenie najbardziej rozjaśniło mój umysł. Wielkie dzięki :)

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji opóźnienia 2 sekund na mikrokontrolerze 89C2051. Opóźnienie można zrealizować za pomocą timerów i przerwań, które cyklicznie wywołują licznik programowy odliczający zadany czas, lub prostą pętlą opóźniającą, jeśli procesor nie wykonuje innych zadań. Przykładowy kod w asemblerze wykorzystuje instrukcję DJNZ (dekrementuj i skocz, jeśli nie zero) oraz rejestry (np. R1, R2, R6, R7) do tworzenia zagnieżdżonych pętli, które sumarycznie generują opóźnienie. Wartość 50H oznacza adres komórki pamięci wykorzystywanej jako licznik pętli. Czas opóźnienia można obliczyć na podstawie częstotliwości kwarcu (np. 12 MHz) i czasu wykonywania poszczególnych instrukcji. Instrukcja DJNZ najpierw dekrementuje rejestr, a następnie sprawdza, czy jest zero, co pozwala precyzyjnie kontrolować liczbę powtórzeń pętli i tym samym długość opóźnienia. Wskazano, że zrozumienie działania pętli i przeliczanie liczby iteracji na czas opóźnienia wymaga znajomości asemblera i parametrów taktowania mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA