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 napisać program na '51 do sterowania diodą LED z dwoma timerami?

zbyszekp22 21 Gru 2005 01:04 1865 7
REKLAMA
  • #1 2102492
    zbyszekp22
    Poziom 10  
    Posty: 35
    Ocena: 4
    Dopiera zacząłem programowanie '51.
    Otrzymałęm zadanie aby nasiać program na 2 timerach, aby przez 100ms dioda była zapalona, a przez 900ms zgaszona. Oczywiście na jednym timerze to nie ma problemu.
    Oto moje coś ...
    ... no i oczywiśćie nie działa :(
    Pomocy !!!

    ORG 00h
    LJMP START
    ORG 0Bh
    MOV TH1,#(ILOSC-1)/256
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R0,DALEJ
    SETB P1.7
    MOV R0,#2
    MOV IP,#00001000B
    DALEJ:
    RETI
    ORG 1Bh
    MOV TH1,#(ILOSC-1)/256
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R1,DALEJ1
    CLR P1.7
    MOV R1,#20
    MOV IP,#00000000B
    DALEJ1:
    RETI
    START:
    ILOSC EQU 65536-46080 ; czas odliczania 50ms
    MOV TMOD,#00010001B
    SETB TR0
    SETB TR1
    CLR TF0
    CLR TF1
    MOV IE,#10001010B ;
    MOV TH1,#(ILOSC-1)/256 ; ustawianie i
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256 ; i synchronizacja
    MOV TH0,#ILOSC/256 ; timerów
    MOV TL0,#ILOSC-(ILOSC/256)*256
    CLR P1.7
    MOV R0,#2
    MOV R1,#20
    PETLA: NOP
    SJMP PETLA
    END
    Załączniki:
    • Nowy Dokument tekstowy.txt (828 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2102669
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    ja spróbowal bym to zrobić nastepująco
    sprawdzaj dwie wartosci liczników jeden t0 niech liczy cały czas 100 a drugi t1 1000
    jesli t0 i t1 beda maiły te same wartosci w rejestrach th1 th0 i tl1 tl0 to zapal diode
  • REKLAMA
  • #3 2103083
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Maxiu25, a tak dla ciekawości jak sprawdzisz że te wartości o których piszesz są równe, może podasz kawałek kodu. Bardzo mnie to interesuje.
  • #4 2103365
    pepson
    Poziom 18  
    Posty: 171
    Pomógł: 26
    Ocena: 30
    Po małej przeróbce nawet działa
    Cytat:

    ILOSC EQU 65536-46080 ; czas odliczania 50ms

    ORG 00h
    LJMP START
    ORG 0Bh
    AJMP T1_SRV
    ORG 1Bh
    MOV TH1,#(ILOSC-1)/256
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R1,DALEJ1
    CLR P1.7
    MOV R1,#20
    ;MOV IP,#00000000B
    DALEJ1:
    RETI
    T1_SRV:
    MOV TH1,#(ILOSC-1)/256
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R0,DALEJ
    SETB P1.7
    MOV R0,#2
    ;MOV IP,#00001000B
    DALEJ:
    RETI

    ORG 200H
    START:

    MOV TMOD,#00010001B
    SETB TR0
    SETB TR1
    CLR TF0
    CLR TF1
    MOV IE,#10001010B ;
    MOV TH1,#(ILOSC-1)/256 ; ustawianie i
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256 ; i synchronizacja
    MOV TH0,#ILOSC/256 ; timerów
    MOV TL0,#ILOSC-(ILOSC/256)*256
    CLR P1.7
    MOV R0,#2
    MOV R1,#20
    PETLA: NOP
    SJMP PETLA
    END

    Przede wszystkim należy pamietać, że pomiędzy adresami przerwań
    jest bardzo niewiele miejsca i nie można tam umieszczać zbyt wielu
    rozkazów. Na ogół pod adresem przerwania umiescza się tylko polecenie
    skoku do własciwej procedury obsługi przerwania

    Dodano po 5 [minuty]:

    Kurcze pogubiły się wcięcia :-|
    dodaję to w załączniku
    Załączniki:
    • timery.txt (875 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #5 2103421
    pepson
    Poziom 18  
    Posty: 171
    Pomógł: 26
    Ocena: 30
    Po małej przeróbce nawet działa
    Cytat:

    ILOSC EQU 65536-46080 ; czas odliczania 50ms

    ORG 00h
    LJMP START
    ORG 0Bh
    AJMP T1_SRV
    ORG 1Bh
    MOV TH1,#(ILOSC-1)/256
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R1,DALEJ1
    CLR P1.7
    MOV R1,#20
    ;MOV IP,#00000000B
    DALEJ1:
    RETI
    T1_SRV:
    MOV TH1,#(ILOSC-1)/256
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R0,DALEJ
    SETB P1.7
    MOV R0,#2
    ;MOV IP,#00001000B
    DALEJ:
    RETI

    ORG 200H
    START:

    MOV TMOD,#00010001B
    SETB TR0
    SETB TR1
    CLR TF0
    CLR TF1
    MOV IE,#10001010B ;
    MOV TH1,#(ILOSC-1)/256 ; ustawianie i
    MOV TL1,#(ILOSC-4)-((ILOSC-4)/256)*256 ; i synchronizacja
    MOV TH0,#ILOSC/256 ; timerów
    MOV TL0,#ILOSC-(ILOSC/256)*256
    CLR P1.7
    MOV R0,#2
    MOV R1,#20
    PETLA: NOP
    SJMP PETLA
    END

    Przede wszystkim należy pamietać, że pomiędzy adresami przerwań
    jest bardzo niewiele miejsca i nie można tam umieszczać zbyt wielu
    rozkazów. Na ogół pod adresem przerwania umiescza się tylko polecenie
    skoku do własciwej procedury obsługi przerwania
  • REKLAMA
  • #6 2103670
    zbyszekp22
    Poziom 10  
    Posty: 35
    Ocena: 4
    Dzięki za :pomoc i Wesołych Świąt :D
  • #7 2109210
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    a=TCNT1L;
    b=TCNT0;
    j=TCNT1H;
    if ((a==b)&(j>120))
    {
    PORTB=0b10101010;
    }
    else
    {
    PORTB=0x0f;
    }
    program jest w c nie w asemblerze i przelancza stan portu b mniej wiecej co polowe calego czasu liczonego przez t1
  • #8 2110547
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    a nie lepiej załączyć pierwszy timer1 na 1000ms.. jak sie przepełni to załączamy led oraz timer2 na 100ms.. jak ten sie przepełni to gasimy led. i wyłączamy timer2.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy programowania mikrokontrolera rodziny 8051 w asemblerze do sterowania diodą LED za pomocą dwóch timerów. Zadanie polega na zaświeceniu diody na 100 ms i zgaszeniu jej na 900 ms, co wymaga wykorzystania dwóch timerów do odmierzania różnych interwałów czasowych. Wskazano, że przerwania w 8051 mają ograniczoną przestrzeń, dlatego zaleca się umieszczanie w wektorach przerwań jedynie skoków do procedur obsługi. Propozycje rozwiązań obejmują monitorowanie wartości rejestrów timerów TH0, TL0, TH1, TL1 i porównywanie ich w celu sterowania stanem diody. Alternatywnie zasugerowano użycie jednego timera do odmierzania 1000 ms, po którym włącza się drugi timer na 100 ms do zapalenia diody, a następnie wyłączenia jej i drugiego timera. Przykłady kodu w asemblerze i C ilustrują podejścia do synchronizacji timerów i sterowania portami mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA