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

DSM 8051 - Jak działa timer w kodzie asemblera?

denethor 28 Lis 2004 11:20 3851 9
REKLAMA
  • #1 1019304
    denethor
    Poziom 11  
    Posty: 23
    Mam taki program ale za wiele z niego nie czaję. Może mógłby to ktoś dokładnie opisać, albo rzucić jakieś linki do opisów itp.?
    Najbardziej chodzi o linikjki z gwiazdkami:

    ;LICZNIK

    CT0 EQU 0
    M0 EQU 1
    G0 EQU 0
    T0S EQU M0 + 4*CT0 + 8*G0

    CT1 EQU 0
    M1 EQU 0
    G1 EQU 0
    T1S EQU M1 + 4*CT1 + 8*G1
    TMS EQU T0S + 16*T1S ;*

    THS EQU 256-1 ;*


    LJMP START
    ORG 100H
    START:
    MOV TMOD, #TMS ;*
    MOV TL0, #0 ;*
    MOV TH0, #THS ;*
    CLR TF0 ;CZYSZCZENIE FLAGI PRZELADOWANIA

    SETB TR0

    MOV A, #20 ;USTAWIAMY LICZNIK
    LOOP:
    JNB TF0, $
    CLR TF0
    MOV TL0, #0
    MOV TH0, #THS
    DJNZ ACC, LOOP

    CPL P1.5
    MOV A, #20
    SJMP LOOP
  • REKLAMA
  • #2 1020604
    Speedi
    Poziom 12  
    Posty: 27
    Pomógł: 2
    Witam
    Pierwsze linie kodu to deklaracja ustawień liczników T0 i T1. Konfiguracja dla ułatwienia została rozpisana na poszczególne bity, dlatego póżniej trzeba je przemnożyć x4 i x8 aby bity były na swoich miejscach. Dla licznika T0:

    CT0 EQU 0
    M0 EQU 1
    G0 EQU 0
    T0S EQU M0 + 4*CT0 + 8*G0

    oraz dla licznka T1:

    CT1 EQU 0
    M1 EQU 0
    G1 EQU 0
    T1S EQU M1 + 4*CT1 + 8*G1

    Aby można było te wartości wpisać do TMOD musimy je jeszcze połączyć, czyli T1S pomnożyć x16 i dodać do T0S :

    TMS EQU T0S + 16*T1S
    teraz mamy gotowy rejestr z ustawieniami licznika T0 i T1, który bez problemu możemy wpisać do TMOD.

    THS EQU 256-1
    deklaracja wartości z jaką licznik będzie się przepełaniał, ile ma zliczyć cykli (bardziej znaczący bajt)

    Następnie zaczyna się program właściwy :)
    LJMP START
    ORG 100H

    START: MOV TMOD, #TMS
    ustawiany tryby pracy liczników

    MOV TL0, #0
    ustawiamy wartość ile ma zliczyć, mniej znaczący bajt

    MOV TH0, #THS
    ustawiamy wartość ile ma zliczyć, bardziej znaczący bajt

    CLR TF0
    wyzerowanie flagi przepełnienia licznika

    SETB TR0
    włączenie licznika T0

    MOV A, #20
    ustawienie ile razy licznik ma się przepełnić

    LOOP: JNB TF0, $
    czekamy aż licznik się przepełni, skok w miejscu

    CLR TF0
    zerujemy flegę przepełaninia

    MOV TL0, #0
    ponowne wpisanie wartości

    MOV TH0, #THS
    ponowne wpisanie wartości

    DJNZ ACC, LOOP
    zmniejszenie wartości w ACC o 1 i gdy nie zero to skok do LOOP

    CPL P1.5
    negacja linii P1.5 tu dojdziemy po 20 przepełnieniach licznika

    MOV A, #20
    ponowne wpisanie wartości do ACC

    SJMP LOOP
    skok do LOOP gdzie znów czekamy na przepełnienie licznika

    To na tyle, mam nadzieję że pomogłem.
  • REKLAMA
  • #3 1023145
    denethor
    Poziom 11  
    Posty: 23
    Wielkie wielkie dzięki Speedi. Muszę to sobie przetrawić, a potem będę miał pewnie jeszcze parę pytań. :)
    Pozdrawiam
  • #4 1025087
    denethor
    Poziom 11  
    Posty: 23
    Teraz parę pytanek:

    1) Jakie są tryby pracy timerów, powiedz mi, jeśli możesz, coś więcej na ten temat. Mam tabelkę o trybach ale za wiele z niej nie rozumię, tak ona mniejwięcej wygląda:

    m1, m0, tryb:
    ----------------
    0 0 - 0
    0 1 - 1
    1 0 - 2
    1 1 - 3

    wiem tylko, że pokazuje ona jak trzeba ustawić poszczególne bity żeby wybrać tryb. Zawiera ona także opis trybu (ilo jest bitowy, np 16bitowy) i flagi, ale nie rozumię o co chodzi z tymi flagami.

    2) Po co są pozostałe bity w rejestrze TMOD, to znaczy bity: C/T i GATE ?

    3) Timery są 2. Czy to znaczy, że jak kożystamy z jednego to bity w TMOD dla drugiego timera trzeba wyzerować?

    4) Można korzystać jednocześnie z dwóch timerów?

    5) Napisałeś:
    " THS EQU 256-1
    deklaracja wartości z jaką licznik będzie się przepełaniał, ile ma zliczyć cykli (bardziej znaczący bajt) "

    Co to znaczy, że licznik się przepełnia i po co nam to?

    6)
    " MOV TL0, #0
    ustawiamy wartość ile ma zliczyć, mniej znaczący bajt
    MOV TH0, #THS
    ustawiamy wartość ile ma zliczyć, bardziej znaczący bajt "

    Co to są te rejestry TL0 i TH0 ? Czemu to co wyliczyliśmy w THS podstawiamy do TH0, a do TL0 wstawiamy 0 ?

    7)
    " CLR TF0
    wyzerowanie flagi przepełnienia licznika "

    Co to znaczy, że licznik jest przepełniony?
    I w jaki sposób on się przepełnia, kiedy i dlaczego?

    8)
    " LOOP: JNB TF0, $
    czekamy aż licznik się przepełni, skok w miejscu "

    Co to jest skok w miejscu? Co oznacza sam znaczek "$"? Czy to znaczy, że w tej instrukcji jeśli flaga przepełnienia nie jest ustawiona, to instrukcja ta wciąż będzie powtarzana?

    -----------------------------
    To by było chyba na tyle. Może niektóre pytania wydają się banalne, ale chciałbym to wszystko zrozumieć, wię czekam na odpowiedź. Z góry dzięki. :)
  • REKLAMA
  • Pomocny post
    #5 1030999
    Speedi
    Poziom 12  
    Posty: 27
    Pomógł: 2
    Witam ponownie
    1) Co do trybów polecam poczytanie rozdziału 2.9 z manuala
    2) Patrz manual
    3) Właściwie nic nie trzeba robic po prostu go nie uruchamiasz, np używasz tylko T0 to go uruchamiasz TR0=1, a dla licznika T1 robisz TR1=0 (poczytaj manuala)
    4) Można
    5) Przepełnienie licznika następuje gdy wszystkie wartości licznika zmianią się z 1 na same 0, wtedy ustawiana jest sprzętowo flaga przepełniania TFx. Przepełnienie potrzebne jest do odmiarzania czasu, wiemy kiedy licznik juz zliczył.
    6) Rejestry TL0 i TH0 to rejestry licznika T0, na których liczy, zwiększa ich wartość. Wpisujemy tylko do TH0 bo widocznie tyle chcemy zliczyć, a tak przy okazji to zauważyłem że cos nie tak jest z ustalaniem trybu liczników. Brakuje jeszcze jednej danej. Powinno byc M00 i M10 dla T0 oraz M01 i M11 dla T1.
    7) To już pisałem, zmiana wszystkich bitów z 1 na 0
    8) Tak dopóki flaga przepełnienie nie będzie ustawiona to ta instrukcja będzie wykonywana. Znak $ z tego co pamiętam to zapis wartości licznika rozkazów.

    Miłej lektury manuala
  • REKLAMA
  • #6 1036032
    denethor
    Poziom 11  
    Posty: 23
    sory ale skąd ściągnąć manuala? nigdzie nie mogę znaleźć.

    i jeszcze jedno, chciałem prosić o jkieś linki do dobrych stron gdzie można poczytać o timerach (nie tylko w dsm8051) o dzieleniu częstotliwości itp.
  • #8 1038403
    denethor
    Poziom 11  
    Posty: 23
    Ok dzięki.
    U mnie linki wyświetla w kolorze prawie identycznym jak zwykłą czcionkę więc nie zauważyłem.
  • #9 1038465
    denethor
    Poziom 11  
    Posty: 23
    1)
    jeśli rejestr TH ustawimy tak:
    THS EQU 256-180

    to co ile będzie mrugała dioda w tym przykładzie który dałem wyżej?
    (wklejam go tu jeszcze raz)

    2)
    Co ile by mrugała gdyby nie było w pętli LOOP liczenia do 20???

    3)
    Jak to wszystko poustawiać, żeby mrugała dokładnie co sekundę?

    4)
    Jak się dokładnie oblicza te częstotliwości? Tego nie czaję.
    Może ktoś napisać coś więcej o dzieleniu częstotliwości?

    Tylko nie odsyłajcie mnie do manuala, bo jest po angielsku i wielu rzeczy z niego nie rozumię.



    CT0 EQU 0
    M0 EQU 1
    G0 EQU 0
    T0S EQU M0 + 4*CT0 + 8*G0

    CT1 EQU 0
    M1 EQU 0
    G1 EQU 0
    T1S EQU M1 + 4*CT1 + 8*G1
    TMS EQU T0S + 16*T1S
    THS EQU 256-180 ;<-----------??

    LJMP START
    ORG 100H
    START:
    MOV TMOD, #TMS
    MOV TL0, #0
    MOV TH0, #THS
    CLR TF0

    SETB TR0

    MOV A, #20 ;<------------licznik
    LOOP:
    JNB TF0, $
    CLR TF0
    MOV TL0, #0
    MOV TH0, #THS
    DJNZ ACC, LOOP

    CPL P1.5
    MOV A, #20
    SJMP LOOP
  • #10 1055377
    denethor
    Poziom 11  
    Posty: 23
    Ludzie pomocy!
    Wiem, że takie "puste" posty są niezgodne z regulaminem, ale potrzebuję szybkiej pomocy %-]

Podsumowanie tematu

✨ Dyskusja dotyczy działania timerów w mikrokontrolerze DSM 8051, ze szczególnym uwzględnieniem kodu asemblerowego konfigurującego timer T0. Omówiono sposób ustawiania rejestru TMOD poprzez definiowanie bitów konfiguracyjnych dla timerów T0 i T1 (CTx, Mx, Gx), które są odpowiednio przesuwane i sumowane, aby utworzyć wartość zapisywaną do TMOD. Wyjaśniono znaczenie rejestrów TL0 i TH0 jako mniej i bardziej znaczącego bajtu licznika oraz rolę flagi przepełnienia TF0, która sygnalizuje moment przepełnienia licznika i umożliwia odmierzanie czasu. Poruszono tryby pracy timerów (tryby 0-3) oraz funkcje bitów C/T i GATE w rejestrze TMOD. Omówiono możliwość jednoczesnego korzystania z dwóch timerów oraz sposób ich uruchamiania i zatrzymywania poprzez bity TR0 i TR1. Wskazano, że przepełnienie licznika następuje, gdy licznik zmienia wartość z maksymalnej na zero, co jest wykorzystywane do odmierzania interwałów czasowych. Autor pytał także o obliczanie częstotliwości i dzielenie sygnału zegarowego, a także o praktyczne zastosowanie ustawień TH0 i pętli zliczającej (np. DJNZ) do generowania określonych czasów, np. mrugania diodą. Podano linki do manuala Atmel oraz zachęcono do lektury rozdziału dotyczącego timerów w dokumentacji mikrokontrolera. Dyskusja zawierała prośby o wyjaśnienia w języku polskim, bez odsyłania wyłącznie do anglojęzycznych źródeł.
Wygenerowane przez model językowy.
REKLAMA