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.

Problem 8051 - zapalenie diody na 1 sekundę jak to zrobic ?

Suchy 17 Lut 2005 15:51 2820 8
  • #1 17 Lut 2005 15:51
    Suchy
    Poziom 17  

    Witam uczę się w szkole o elektronicznej , ucza nas duzo teori , troche mniej praktyki , dostalem zadanie zeby wysterowac diodę led stanem niskim z wyjscia jednego z portów wyjsciowych MCS 8051... Hmm myslalem sporo nad tym , i stwierdzilem ze przu uzyciu kwarcu 12Mhz jeden takt trwa 1us wiec zeby zliczyc jedna sekunde potrzebuje wpisac np. 1 000 000 NOP ( No operate - nic nie rob :) ) zle ja mam tylko 65 000 komorek programu wiec ten pomysl odpada , nastepnym pomyslem moim bylo wpisanie 50 000 NOP-ow i zliczanie ilosci powtórzeń ale kto mi bedzie wpisywał 50 000 razy to samo zreszta zabierze to wiekszac miejsca w pamieci na program... WIec pomyslalem o wykozystaniu ktoregos z licznikow w MCS-8051 T) lub T1 tylko ktorego i jak napisac program zeby wystawił mi po nacisnieciu przysku "0" i wysterowal diode na jedna sekunde... nie wiem jak programowac licznik zeby mi zliczal ilosc taktow i pozniej porownal czy jest to rowne zadanemu czasowi i nastepnie jesli tak to wykonal operacje wystawienia zera na ktoras z linii potru... Z Góry bardzo dziekuje za pomoc....

    0 8
  • Pomocny post
    #2 17 Lut 2005 16:40
    Jacu$
    Poziom 27  

    Niezły dowcip z tym 1000000 * NOP
    A nie słyszałeś nigdy o pętlach?
    Napisz sobie taką procedurkę:

    Code:

    ;------------------------------------------------------
    ; Podprogram opoznienia 1 s dla zegara 12 MHz
    ;------------------------------------------------------
    DELAY:  MOV     R1,#250  ; licznik obiegow zewnetrznej petli
    LOOP1:  MOV     R0,#250  ; licznik obiegow wewnetrznej petli

    LOOP2:  NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            NOP              ; 1 cykl
            DJNZ    R0,LOOP2 ; 2 cykle

            DJNZ    R1,LOOP1
            RET


    Wewnętrzna pętla trwa 16 cykli maszynowych (16 mikrosekund) i jest wykonywana 250 razy, co daje nam 4000 mikrosekund czyli 4 milisekundy. Te 4 ms są powtarzane przez zewnętrzną pętlę 250 razy co daje nam 1 sekundę. Dla uproszczenia pominąłem czas wykonywania 250 pętli zewnętrznych ale chyba nie jesteś aptekarzem :wink:
    Zapalasz diodę ustawiając zero na pinie portu, do którego podpiąłeś katodę diody (anoda przez rezystor 1k do +5V) i wywołujesz procedurkę opóźniającą rozkazem
    Code:
     ACALL DELAY

    następnym rozkazem jest gaszenie diody czyli ustawienie jedynki na pinie portu, gdzie jest dioda.
    Uwaga: mogłem pomylić się w ilości cykli maszynowych dla instrukcji DJNZ i nie tylko. Ostatni program na 51 pisałem w zeszłym stuleciu.

    0
  • #3 17 Lut 2005 16:45
    Suchy
    Poziom 17  

    Ok mam jeszcze pytanko czy to jest kompletny program , czy juz jest zapentlony i czy gdy bedzie juz odmierzony ten czas 1s to czy programsie zatrzyma i wygasi mi diodę . . . ?? :) heh nie mialem jeszcze do czynienia zbyt duzo z progamem 8051

    0
  • #4 17 Lut 2005 17:10
    yarpen2
    Poziom 22  

    a może tak inaczej:

    Code:
    ;program steruje linijką diod 
    
    ;wykorzystuje tryb1 timera0
    ;   (c) by yarpen2  3.08.2000
    $MOD51

            org 0000h
       ajmp init

            org 000Bh
       ajmp intT0

    Led1   bit P1.0      
    Led2   bit P1.1
    led3    bit p1.2
    led4    bit p1.3
    led5    bit p1.4
    led6    bit p1.5
    led7    bit p1.6
    led8    bit p1.7
    stala   equ  20            
       
    lh   equ 03Ch   ;dopełnienie do 65536, co daje 50000 taktów   
    ll   equ 0B0h   ;

       
    init:
       clr   EA
       mov     SP,#050h
       mov   PSW,#00h
       mov    TMOD,#00000001b   ;ustaw licznik 0 w tryb 1
       mov   TH0,#lh   
       mov   TL0,#ll   
       mov    TCON,#10000000b
       setb   EA
       setb   ET0

       setb   Led1
       clr     led2
            setb    led3
            clr     led4
            setb   Led5
       clr     led6
            setb    led7
            clr     led8

       mov   A,#stala
       mov   50,A
       
       setb   TR0      ;start timera

    wait:
       ajmp    wait       

    intT0:  orl   TL0,#ll
       mov   TH0,#lh
       mov a,50
            dec a
            jnz koniec
            mov a,#stala
       cpl   Led1      
       cpl   Led2
            cpl   Led3      
       cpl   Led4   
            cpl   Led5      
       cpl   Led6
            cpl   Led7      
       cpl   Led8

    koniec: mov 50,a
       reti

    end

    0
  • #5 17 Lut 2005 17:13
    Jacu$
    Poziom 27  

    Nie, to nie jest program a tylko podprogram wywoływany przez program główny. Od momentu wywołania podprogramu do momentu powrotu z niego mija 1 sekunda (i ciut). Pisałem przecież, że przed wywołaniem tego podprogramu musisz w programie głównym zapalić diodę a później ją zgasić.

    0
  • #6 17 Lut 2005 17:17
    Suchy
    Poziom 17  

    Aha to chyba rozumiem :) pierw w programie glownm zapalam diode , pozniej daje opozienie o sekude i ciut i nastepnie gaszę diode po powrocie z programu glownego ?? czy jakies przerwania bede wykozystywal ?? To jest moj pierwszy program wiec prosze o wyrozumialosc , dziekuje :)

    0
  • #7 18 Lut 2005 12:19
    Jacu$
    Poziom 27  

    Suchy, najpierw pomyśl a później napisz. Po napisaniu wciśnij "podgląd" i przeczytaj 3 razy a jak zrozumiesz swój własny tekst to wciśnij "wyślij".
    Piszesz bez sensu:

    Cytat:
    Aha to chyba rozumiem Smile pierw w programie glownm zapalam diode , pozniej daje opozienie o sekude i ciut i nastepnie gaszę diode po powrocie z programu glownego ??

    Do czego chcesz wracać z programu głównego?
    Zacznijmy od początku:
    W programie głównym piszesz pierwszą sekwencję instrukcji, która zapala diodę.
    Teraz piszesz instrukcję ACALL DELAY.
    Następnie piszesz sekwencję instrukcji, które spowodują zgaszenie diody.
    To był program główny. Za nim lub przed nim umieszczasz moją procedurkę o nazwie DELAY, która nic nie robi tylko marnuje czas procesora. Marnuje go ciut więcej niż sekundę ale dla naszych celów można o tym "ciut" zapomnieć.
    A teraz opiszę jak to wszystko działa.
    1. zapala się dioda
    2. następuje wyskoczenie z programu do podprogramu i wykonanie zawartych tam instrukcji, co trwa jedną sekundę
    3. następuje powrót z podprogramu do programu głównego
    4. następuje zgaszenie diody.
    Żadnych przerwań nie ma. Mam do Ciebie żal, że marnujesz mój czas a nie zadasz sobie trudu przeanalizowania kodu, w którym są użyte tylko 4 rozkazy z całej listy wykonywanych przez procesor. NOP, MOV, DJNZ, RET. Jak chcesz zrozumieć działanie programu skoro nie znasz rozkazów?
    I wyprzedzając Twoje pytanie odpowiadam: program główny musisz sobie sam napisać. Ode mnie masz tylko podprogram DELAY.

    :arrow: yarpen2
    Chyba się trochę rozpędziłeś :wink:

    0
  • #8 24 Lut 2005 01:57
    ekspert100
    Poziom 16  

    mam coś prostszego bez tajmerów

    deklaracja
    ustaw porty
    czasówka na piechotę
    ustaw porty

    muszę poszukać lisingu
    jak interesuje to mail

    0
  • #9 12 Lis 2005 18:56
    Suchy
    Poziom 17  

    dziekuje problem został rozwiązany...

    0