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 zaprojektować stoper na AT89C51 z wyświetlaniem binarnym?

ziora 21 Maj 2006 17:04 1203 6
REKLAMA
  • #1 2648995
    ziora
    Poziom 11  
    Posty: 7
    Witam mam problem z zadaniem na elektronike , jego treść to :
    Stoper - Po podaniu na wyprowadzenie P2.0 stanu 0L, stoper powinien rozpocząć zliczanie czasu aż do pojawienia się się stanu 1L na tym wyprowadzeniu. Liczba sekund powinna być wyświetlona w postaci binarnej przy pomocy diod podłączonych do portu P1. Wyprowadzenie P2.1 wykorzystaj do zerowania stopera.
    Przy pomocy dodatkowego stopera zmierz dokłądność zaprojektowanego układu w zależności od czasu trwania pomiaru.
    Całe te zadanie jest robione na układzie AT89C51.
    Z góry dzięki za pomoc :)
  • REKLAMA
  • #2 2649346
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    wykorzystaj timer ( masz ich 2 ) ustawiasz go tak żeby generował przerwanie co jedną sekundę ( przy "małym kwarcu" przy większym będzie troche bardziej skomplikowane ) w przerwaniu od timera sprawdzasz czy p2.0 jest niski jeśli niski to zwiększ zmienna np: "sek", po tym przepisujesz zmienna na p1 ( mov p1,sek ) . w programie głównym sprawdzasz czy p2.1 jest aktywny; jeśli tak to zerujesz zmienna sek. zadanie nie jest takie trudne jedyne co to musisz zmusić timer do odmierzania "tych" sekund. Podaj wartość kwarc-u przy up i jaki stan na p2.1 ( L czy H ) będzie zerował licznik sekund, to coś poradzimy dalej ( w asm i najwcześniej jutro wieczorem ). pozdrawiam
  • REKLAMA
  • #3 2649615
    ziora
    Poziom 11  
    Posty: 7
    jak jest możliwość to prosiłbym o bardzo prostą oraz szczegółową instrukcje bo nie mielismy z tego rzadnych wykładów a profesor kazał nam zrobić to zadanie. Więc sami wiecie jak to jest nie mieć o tym zielonego pojęcia :(
    Z góry bardzo dziękuje :)

    Dodano po 26 [minuty]:

    Prosił bym jeszcze jak można o schemat :)
  • REKLAMA
  • #4 2652710
    ziora
    Poziom 11  
    Posty: 7
    Jak mozna to prosibym o program napisany do tego zadania w asamblerze
  • Pomocny post
    #5 2653064
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    a wiec tak zakładamy że przy up pracuje kwarc 12MHz. jeśli nie wymagasz dużej dokładnośći to timer ustawiasz w tryb 1 ( 16 bit ) tak aby generował przerwanie np: co 10ms; przy 12MHz cykl wynośi 1us czyli przerwanie będzie co 10000 cykli ( 10000 us = 10ms ). wartość po której następuje przerwanie to zmiana z 65535 na 0000. czyli do rejestrów licznika musisz wpisać ( wpisywać w każdym przerwaniu ) wartość: 65535 - 10000 = 55535 ( D8EF hex ). w przerwaniu będziesz liczył przerwania ( zakręcone troche :-) ) i jeśli wystąpi setne przerwanie to upłyneła właśnie jedna sekunda. troche programu:

    
    org 0000h
    sjmp pre_stert   ; etykieta początek programu
    
    org 000Bh  ; tu program skacze jak pojawi sie przerwanie od t0 ( jego użyjemy) 
    sjmp przerwanie
    ; na poczatku deklarujemy zmienne "sek" i "10ms" ( bajt )
    pre_start:
    mov sek,#0
    mov 10ms,#0
    mov p1,# ; gasimy wszystkie ledy
    ; konfiguracja t0
    mov tmod,#00000001b ; timer 0 w trym drugi ( 16 bit ) jako czasomerz
    mov th0,#D8h ;ładujemy do licznika wartość początkową
    mov tl0,#EFh
    mov IE,#10000010b ; uaktywniamy przerwanie od t0
    ; i na koniec start licznika
    setb tr0
    
    prog_glowny:   ; program główny 
    setb p2.1
     jnb p2.1,prog_glowny ; jesli p2.1 w stanie wysokim to skocz do prog_glowny ( aktywny stan niski ) jesli pin aktywny to idz dalej 
    mov sek,#0 ; i zeruj zmienna sek ( liczba sekund )
    mov p1,sek  ; wyzeruj także port p1  
    sjmp prog_glowny
    
    
    przerwanie: 
    mov th0,#D8h ; ponowne zaladowanie wartosci poczatkowych ( licznik liczy od zerz)
    mov tl0,#EFh
    push psw     ;psw i a na stos
    push a
    inc 10ms                   ;zwieksz o jeden zmienna 10ms
    mov a,10ms              ;zmienna do a
    cjne a,100,koniec_t0  ;jesli a nie jest rowne 100 to koniec przerania
    setb p2.0                   ; ustaw p2.0 w stan wysoki H
    jb p2.0, koniec_t0      ;sprawdz czy p2.0 w stanie wysokim jeśli tak to koniec przerwania
    inc sek                    ; jeśli nei to zwieksz zmienna sek o jeden
    mov p1,sek            ; przepisz zmienna na port p1
    koniec_t0:             ;koniec przerwania
    pop a                    ;zdejmij ze stosu a
    pop psw                ;zdejmij ze stosu psw
    reti                      ; najważniejsz instrukcja zakończ przerwanie bez niej program pujdzie w "maliny"



    p.s. to coś ( "program" ) jest pisany na szybkiego i nie sprawdzany; przeglądałem go kilka razy i wydaje mnie sie ze niczego nie zapomniałem. pozdrawiam
  • REKLAMA
  • #6 2654151
    Konto nie istnieje
    Konto nie istnieje  
  • #7 2656162
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    Było by lepsze gdyby nie brak jednej instrukcji w przerwaniu po instrukcji

    cjne a,#100,koniec_t0

    swoja drogą przed 100 powinien być hasz << hyba tak sie to pisze>> bez niego to 100 wskazuje na adres w pamięci ram up a nam chodzi o wartość. I po tej instrukcji powinno sie znaleźć:

    mov 10ms,#0

    bez niej w następnym przerwaniu zmienna 10ms będzie miała wartość 101 i cała sekunda pójdzie w maliny.
    Kolejna rzecz to że i tak nie będzie to dokładnie sekunda bowiem od ustawienia bitu TF0 w słowie TCON do "wejścia" w przerwanie ( wpisania nowych wartość do th0 i tl0 ) mija pewien czas kilku, kilkunastu cykli zegara. Sposoby na to są dwa: tryb 0 i trym 2. osobiście polecam tryb 2 ( 8bit z automatycznym wpisem wartości początkowych ).
    p.s. 1 - za błędy przepraszam 2 - co forum na to?. pozdrawim jasiek

Podsumowanie tematu

✨ Dyskusja dotyczy zaprojektowania stopera na mikrokontrolerze AT89C51 z wyświetlaniem czasu w postaci binarnej na diodach podłączonych do portu P1. Stoper ma rozpocząć zliczanie sekund po pojawieniu się stanu niskiego (0L) na wyprowadzeniu P2.0 i zatrzymać się przy stanie wysokim (1L) na tym samym pinie. Wyprowadzenie P2.1 służy do zerowania licznika. Proponowane rozwiązanie wykorzystuje timer 0 w trybie 1 (16-bitowy) do generowania przerwań co 10 ms przy kwarcu 12 MHz. W przerwaniu liczony jest czas, a po osiągnięciu 100 przerwań (1 sekunda) zwiększana jest zmienna sekundowa, której wartość jest przesyłana na port P1 w celu wyświetlenia binarnego. Wskazano konieczność poprawnego ustawienia rejestrów timera oraz resetowania licznika przerwań, aby zapewnić dokładność pomiaru. Zasugerowano również rozważenie trybu 2 timera (8-bit z automatycznym przeładowaniem) dla lepszej precyzji. Autor prosił o prostą i szczegółową instrukcję oraz schemat, a także o program w asemblerze realizujący zadanie. Wskazano, że dokładność stopera zależy od konfiguracji timera i częstotliwości kwarcu.
Wygenerowane przez model językowy.
REKLAMA