Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Asembler 8051] Czas trwania programu - obliczanie

Sciepa 20 Nov 2010 20:27 3546 1
Computer Controls
  • #1
    Sciepa
    Level 9  
    Mam do zrobienia program, który będzie zliczać czas trwania programu.
    Zmienna sekund ma być prezentowana w postaci binarnej za pomocą diod świecących podłączonych do portu P2. Mam użyć systemu przerwań i odpowiedni licznik-timer w wybranym trybie wiedząc, że mikrokontroler jest taktowany zegarem 11.0592MHz, a zatem jeden cykl maszynowy trwa około 1,08507 μs. Zliczanie czasu ma poprawnie działać niezależnie od złożoności programu głównego.

    To co zrobiłem to zlicza mi ilość rozkazów w programie a nie czas, już sam nie wiem jak go przerobić, żeby było to co chce.
    Kod programu poniżej (główny program jest na średnia arytmetyczna dla dwóch elementów po przecinku).
    Code:

          
          CSEG AT 00h
          AJMP RESET

          CSEG AT 0Bh
           AJMP TF0service   ; skok do procedury obslugi przerwania

          CSEG AT 10h

    RESET:
       MOV R0,  #0            ; Zerowanie czasu
       MOV   TMOD,#00000010b       ;tryb 2 licznik sygnalu taktujacego
       MOV   TH0, #255         ; zaladowanie wartosci poczatkowej
       MOV   TL0, #255
       MOV P2,  #00h         ; wylaczenie wszystkich diod
       SETB   TR0             ; podlczenie sygnału do licznika
         SETB   ET0
       SETB   EA

       
    START:
       MOV   R1,#4             ;LICZBA ELEMENTÓW
        MOV   R2,#0             ;ZEROWANIE BUFORA SUMY CZESCI CALKOWITEJ
       MOV   R4,#0            ;ZEROWANIE BUFORA SUMY RESZTY
       MOV   R5,#10          ;MNOZNIK DODAJACY 1 MIEJSCE PO PRZECINKU
       MOV   R6,#2            ; ILOSC MIEJSC PO PRZECINKU
       MOV   R7,#0            ;ZEROWANIE BUFORA RESZTY PO PRZECINKU
       MOV   A,R1
       MOV   R3,A            ;ILOSC ELEMENTOW PRZEZ KTORE BEDZIE DZIELIL
       MOV   DPTR, #Tablica 

    PETLA:
       MOV   A,R1
       DEC   A                ;USTALENIE WSKAZNIKA W TABLICY
       MOVC  A,@A+DPTR        ;WYCIAGNIECIE ELEMENTU Z TABLICY
       MOV   B,R3           ;WSTAWIENIE DO B ILOSCI ELEMENTOW KTORE SA BRRANE DO SREDNIEJ
       DIV   AB              ;A-CZESC CALKOWITA, B-RESZTA
       ADD   A,R2             ;SUMOWANIE CALOKOWITEJ CZESCI
       MOV   R2,A
       MOV   A,B
       ADD   A,R4           ;SUMOWANIE RESZTY
       MOV   R4,A
       DJNZ  R1,PETLA         ;JEZELI WSZYSTKIE ELEMENTY DODANE TO DZIEL SUME PRZEZ ILOSC ELEMENTOW


       MOV   B,R3
       MOV   A,R4
       DIV   AB
       ADD   A,R2             ;A-CZESC CALKOWITA, B-RESZTA
       MOV   R4,B
       MOV   R2,A           ; CZESC CALKOWITA
     

    PRZECINEK:
       MOV   B,R5
       MOV   A,R7           ; DO A  JEST WSTAWIANE OBECNE DANE PO PRZECINKU
       MUL   AB
       MOV   R7,A
       MOV   A,R4           ; DO A WSTAWIAM RESZTE
       MOV   B,R5           ; DO B ZE MA BYC DODATKOWE MIEJSCE PO PRZECINKU
       MUL   AB
       MOV   B,R3           ;DO B WSTAWIAM ILE ELEMENTOW ZOSTALO UZYTCH TABLICY
       DIV   AB              ;A - DANE PO PRZECINKU, B RESZTA
       MOV   R4,B           ;TYMCZASOWE PRZETRZYMANIE R2 (NOWEJ RESZTY)
       ADD    A,R7
       MOV   R7,A           ;DANE PO PRZECINKU
       DJNZ  R6,PRZECINEK

      ;R2 - PRZECHOWUJE   CZESC CALKOWITA, A R7 - LICZBE PO PRZECINKU
       SJMP  $

    TF0service:
       PUSH ACC               ; zapamietanie akumulatora
       PUSH PSW               ; i rejestru stanu
       MOV  A,R0
       ADD  A,#1
       MOV    R0, A
       MOV  P2, R0
       POP  PSW
        POP  ACC
       RETI               ; koniec przerwania!

    Tablica:
       DB 99, 99, 96, 96

       END
  • Computer Controls
  • Helpful post
    #2
    kazwita
    Level 15  
    Witam.

    Timer mikrokontrolera '51 taktowanego zegarem 11.059200 MHz zliczy w ciągu jednej sekundy 921600 impulsów. Ze względu na wielkość timera (2 bajty) może Kolega zliczać setne części sekundy - ustawić przerwanie co 9216 impulsów. Każde wywołanie przerwania zwiększy zmienną o 1, czyli mamy w niej wynik pomiaru z rozdzielczością 0,01 s. Rozwiązanie szczególnie interesujące w tych mikrokontrolerach, które są wyposażone w układ automatycznego przeładowania całego timera wartością początkową. W klasycznej 51-ce trzeba uwzględnić czas tracony na zatrzymanie timera, załadowanie nową wartością i jego start.

    Drugie rozwiązanie - można też puścić timer bez przeładowywania (czyli będzie chodził w kółko, tzn. ze stanu FFFFh przejdzie sam do 0000h generując przerwanie). W przerwaniu dodajemy 1 do zmiennej (np. 1 bajtowej). Stanowi ona wtedy najstarszy bajt 3 bajtowej zmiennej, zliczającej impulsy zegarowe (młodszymi bajtami zmiennej są rejestry timera THx i TLx). Wystarczy podzielić wynik przez 9216 i mamy ilość setnych części sekund. Jeżeli wolimy dziesiętne, to trzeba dzielić przez 92160. Najdłuższy czas, możliwy do pomiaru na 3 bajtach w tym przypadku wyniesie 18,2 sek. Ten sposób jest miły w połączeniu z "okrągłą" częstotliwością zegara taktującego, przy 12 MHz dostajemy wynik w mikrosekundach, bez potrzeby dzielenia.

    Pozdrawiam.