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

Jak odczytać stan licznika T1 w uC 8051 przy przerwaniach T0?

mmx01 16 Mar 2004 09:05 1755 9
  • #1 549894
    mmx01
    Poziom 18  
    Posty: 354
    Pomógł: 1
    Ocena: 14
    Witam, wlacze od jakiejs chwili z assemblerem dla 51, stanalem na odczytaniu stanu licznika T1, sytuacja jest taka ze T1 pracuje w trybie counter liczac impulsy z zewnatrz w tym czasie T0 pracuje w trybie timer,
    w momencie gdy T0 wygeneruje 15 przerwan przy kwarcu 12Mhz tyle mniej wiecej przypada na sekunde ma nastapic odczyt licznika T1.
    O tyle co dla T0 bedzie to proste przy kazdej obsludze przerwania
    INC ILEPRZERWAN

    i w glownej petli programu

    MOV A,#ILEPRZERWAN
    XRL A,#15 ;jesli ileprzerwan 15 to do A, 0
    JZ ODCZYTT1

    To jak zobaczyc ile zliczyl T1 ?

    MOV A,TH1
    MOV B,#256
    MUL AB
    ADD A,TL1

    Teraz akumulator powinien miec wynik operacji (TH1*256)+TL1 czyli ilosc impulsow na T1 ?
  • #2 550244
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Jeżeli T1 pracuje jako 16 bitowy to rejestry TH1:TL1 traktujesz jako jeden 16 bitowy i tam masz wartość możesz te rejestry przenieść gdzieś indziej i dalej obrabiać (np. wyświetlić itp.), natomiast to mnożenie w podanym przykładzie wydaje mi się nie potrzebne.
  • #3 550260
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    Zasadniczo to uC '51 jest osmiobitowy i akumulator (A) tez jest 8 bitowy więc na pewno nie masz w akumulatorze 16 bitowej danej. Arytmetyka więcej niż 8 bitowa w asm jest troche "upierdliwa". Z tego co napisałeś wnoszę, że towrzysz miernik częstotliwości... Mozesz to wpisać do DPTR (DPH i DPL) ale na tym rejestrze nie zrobisz operacji arytmetycznych.
    Proponuje poszukać w sieci odpowiednich procedur do arytmetyki i z nich skorzystac ale zawsze dane 16 bit sa przechowywane w czesciach po 8 bitow.
  • #4 550445
    mmx01
    Poziom 18  
    Posty: 354
    Pomógł: 1
    Ocena: 14
    To jak na boga odczytac ilosc impulsów ktora przekroczyła 255 ?
    Skoro kazda operacja logiczna operuje na 8 bitowym akumulatorze to jak to zrobic ? Co przerwanie wpisywac liczbe z T1 do rejestru i zerowac TH1 i TL1 ? niby bylo by to wtedy (max 1000 impulsow na sec)
    czyli 15 przerwan przy kazdym przerwaniu zliczone max. 67 ale jak to poskladac do kupy ? Wartosc odczytana z T1 i tak musze podzielic pozniej jeszcze przez 16 ...

    Czyli najpierw (TH1 / 10) * 256 + (TL1 / 10) ? powinno dac to liczbe zmniejszona o 10 czyli z 889 impulsów zrobic sie 88.9 a to z kolei zamiast 16 podzielic przez 1.6 wtedy zmieszcze sie w 255 i teraz skoro mam juz wynik czyli 55.5metra na sekunde (w zalozeniach mam 16 impulsow na metr przy 200km/h bede mial 889 impulsow na T1) czyli wynik 55.5 mnoze przez 3.6 (3600s 55.5m/s) -> 199.8 wiec w miare dokladnie.

    Ale czy da sie to zrobic innaczej ? jesli predkosc mierzona miala by byc 300km/h ? co wtedy ?
  • #5 550492
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Dla bezpieczeństwa wstrzymujesz przerwania od licznika T1 i poprostu odzytujesz zawartość TL1 i TH1 dalej możesz odczytaną liczbę traktowac jak integer bez znaku. Co do kwesti formalnej to nie możesz oddzielnie dzielic MSB/10 a potem LSB/10 bo to nie jest matematycznie i wyjdą ci głupoty.
  • #6 550754
    mariooo
    Poziom 2  
    Posty: 2
    No niby to dzielenie nie powinno przejsc :) ale:

    licznik T1 zliczyl do 1500
    tak wiec w TH1 bedzie: 101 a w TL1: 11011100
    101 to 5, 11011100 to 220 robie wiec (5/10)*256+(220/10) = 128 + 22 = 150, czyli 1500/10.
  • #7 551494
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    GimekS: Gdzie w asm do '51 masz integery?
    mmx01: Da się zrobić wszystkie potrzebne Ci obliczenia ale nie tak wprost i latwo. napisalem zebys poszukal w necie gotowych procedur arytmetycznych do 51 w asm, bo takie są, i wtedy będziesz mógł takie działania robić choć wynik będziesz miał w dwóch kawałakach ale to w niczym ni eprzeszkadza.
  • #8 551976
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    mariooo: niby jak hcesz przehować zmienną zmienno-przecinkową w 51?
    avr'y mają bit carry dzięki czemu idzie sobie liczyć zmienne bardzooo duże..
    co do metody liczenia są 2 inne metody:
    1: puścić timer.
    programowo odliczyć 200 impulsów..
    po tych 200 impulsach sprawdzić jaki czas upłynoł (wartość licznika)
    2: puścić timer.
    programowo zliczać impulsy
    podczas przepełnienia licznika sprawdzić ile zostało zliczonyh impulsów.

    no co racja to racja licznik może zliczać zewnętrzne impulsy.. radze pokombinować z bitem C o ile taki owaki istnieje w 51..
    ilość impulsów można podzielić sprzętowo, np jakiś licznik zew.. impulsy podłączyć do wejścia inkrementacyjnego.. a np pin bitu 2 licznika podpiąć do licznika 51 dzięki czemu częstotliwośc będzie podzielona przez 16..
  • #9 552006
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Dysputa nabiera rumieńców - :arrow: Boski Dialer: jest takie coś jak kodowanie na 4 bajtach zmiennych typu real i bit Carry nie ma nic do tego. Teraz do rzeczy - to ma chyba być prędkościomierz, ale nikt nie powiedział, że okres pomiaru musi wynosić 1 sekundę - to my jesteśmy do takich rzeczy przyzwyczajeni bo się łatwo liczy. A może zamiast 15 przerwań timera tylko kilka, w tym czasie zliczenie na liczniku ilości impulsów, a potem to tylko przeliczenia.
  • #10 552014
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 55
    frohme ma racje bit Carry nie ma nic do floata, malo tego te obliczenia mariooo tez nie maja nic wspolnego z liczbami zmiennoprzecinkowymi.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy odczytu stanu 16-bitowego licznika T1 mikrokontrolera 8051 pracującego w trybie zliczania impulsów zewnętrznych, podczas gdy timer T0 generuje przerwania co określony czas (np. 15 przerwań przy kwarcu 12 MHz). Wskazano, że rejestry TH1 i TL1 tworzą 16-bitową wartość, którą można odczytać bez mnożenia, jednak akumulator A jest 8-bitowy, co utrudnia bezpośrednią arytmetykę 16-bitową w asemblerze. Proponowano wstrzymanie przerwań podczas odczytu TH1 i TL1, a następnie traktowanie odczytanej wartości jako liczby całkowitej bez znaku. Podkreślono, że dzielenie osobno MSB i LSB przez 10 jest matematycznie niepoprawne. Sugerowano poszukiwanie gotowych procedur arytmetycznych 16-bitowych dla 8051 w asemblerze. W dyskusji pojawiły się także alternatywne metody pomiaru prędkości i zliczania impulsów, takie jak programowe odliczanie impulsów i pomiar czasu lub sprzętowe dzielenie częstotliwości impulsów. Zwrócono uwagę, że okres pomiaru nie musi wynosić dokładnie 1 sekundy, co może ułatwić obliczenia i zwiększyć zakres pomiarowy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA