Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Asembler - Timer w 8052 - Czu to zadziała?

takilogin 23 Sty 2007 16:15 2677 5
  • #1 23 Sty 2007 16:15
    takilogin
    Poziom 15  

    Witajcie :)
    Czy dobrze napisałem program przesuwający bity na porcie P1 co ok 1s ?
    Taktowanie 6MHz.

    Code:
         ; poczatek programu
    
    ORG 0000h
    MOV ACC, #00000001b   
    LJMP START

    ;tablica wektorow
    ORG 000Bh      ; tu skacze w razie przerwania T0
    RETI

    ;petl glowna
    START:
    SETB ET0      ;zalaczenie przerwanie z T0
    SETB EA        ;zalaczenie przerwan
    MOV TMOD, #0001b      ;T0 jako 16bitowy licznik

    MOV R1, #8      ;licznik ma zliczac 8 razy
    LCALL opoznienie      ;skok do "opoznienie"
    MOV P1, A      ;wystaw nA port ACC
    RR A      ;pzesun ACC o bit w prawo
    JMP START      ; skok do "START"

    opoznienie:
    SETB   TR0     ;Start timera T0
    DJNZ R1,opoznienie      ;Czy R1=1?
    RET   
       

    ENDEND


    Nie jestem pewien czy dobrze ustawiłem przerwania i timera a nie mam na czym tego sprawdzić
    Przy taktowaniu 6MHz licznik robi krok co 2us. Przy liczniku 16bitowym przepełnienie nastąpi po upływie ok ok 0,13s. Dlatego dodałem pętle pracującą na R1 powodująca zliczanie 8 razy czyli łączny czas ok 1s
    Poprawcie mnie proszę jak źle myślę.

    Pozdrawiam

    0 5
  • #2 23 Sty 2007 17:02
    Bigfoot
    Poziom 25  

    U Ciebie nic nie dzieje sie w przerwaniu - gdy tylko do niego dojdzie to program automatycznie z niego wyskakuje przez RETI. W przerwaniu powinienes umiescic zlicznie do 8 a nie gdzies indziej. Gdy zliczysz to wtedy przesuwasz bity na swoim porcie, zerujesz swoj licznik i kreci sie wszystko od nowa.

    BF

    na szybko (ni to C, ni to assembler ale idea:)

    Code:


    INTERRUPT:

    INC licznik
    IF (licznik==8)
    {
      RR PORT
      licznik = 0
    }
    RETI



    MAIN PROGRAM
    {
     SET_TIMER 
     EA=1
     ET=1
     TR=1
    }

    0
  • #3 23 Sty 2007 21:20
    tomkozak
    Poziom 10  

    aby odmierzac dokladnie czas 1s lepiej by licznik zliczal 50 000 impulsów
    czyli musiz wpisac wartosc poczatkowa do licznika 15535+1 na przekrecenia licznika
    przy 2us na 1 impuls daje ci to 100 000us czyli 100ms no i dajesz raz 10 i masz pelna sekunde :)
    a program wyglada tak

    Code:

    ORG 0000h
    LJMP START

    ORG 000Bh
    LJMP LICZNIK

    START:                 ;ustawienie przerwan
    SETB ET0
    SETB EA
    MOV TH0,#3Ch     ; zapis wartosci poczatkowej do licznika, starszych bitow
    MOV TL0,#0B0h  ;mlodszych bitow
    MOV TMOD,#1h  ;tryb 1 licznika
    SETB TR0          ; zalaczenie licznika
    MOV R0,#0h   ; R0 bedzie wykorzystywane do zliczania ilosci przerwan i na wszelk iwypadek wpisujemy tam zero na poczatku programu
    MOV A,#1h   

    PRZESUNIECIE:
    CJNE R0,#10,PRZESUNIECIE ; sprawdza czy bylo juz 10 przerwan jak tak to idzie dalej jak nei skacze do przesuniecie
    MOV R0,#0h
    MOV P1,A
    RR A
    LJMP PRZESUNIECIE

    LICZNIK:
    MOV TH0,#3Ch     ; wpisanie znowu wartosci pocztakowej by stale zliczal ta sama ilosc impulsow
    MOV TL0,#0B0h
    INC R0            ;licznik impulsów
    RETI


    tak chyba najlepiej zrealizowac tego typu zadanie

    0
  • #4 16 Sty 2008 22:01
    Tarczel2
    Poziom 16  

    Jakiego kompilatora używacie bo mój nie wywala błąd w lini

    Code:
    ORG 000BH  

    Co robić??

    0
  • #5 16 Sty 2008 22:12
    romsik
    Poziom 14  

    może trzeba od tabulatora (dsm51ass) woisać to org albo włąsnie bez

    0
  • #6 17 Sty 2008 20:31
    Tarczel2
    Poziom 16  

    tabulator nic nie pomaga :cry:
    A ty czym kompilujesz??

    Dodano po 4 [godziny] 42 [minuty]:

    Problem rozwiązany :)
    Pozdrawiam

    0