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

Mikroprocesory- potrzebna pomoc :)

ziora 21 May 2006 17:04 1038 6
  • #1
    ziora
    Level 10  
    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 :)
  • #2
    jony15
    Level 23  
    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
  • #3
    ziora
    Level 10  
    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 :)
  • #4
    ziora
    Level 10  
    Jak mozna to prosibym o program napisany do tego zadania w asamblerze
  • Helpful post
    #5
    jony15
    Level 23  
    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:

    Code:

    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
  • #6
    User removed account
    User removed account  
  • #7
    jony15
    Level 23  
    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