logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Asembler: Program na dwóch licznikach do migania diodą co 100/900 ms

zbyszekp22 08 Sty 2006 22:24 1401 10
REKLAMA
  • #1 2161053
    zbyszekp22
    Poziom 10  
    Posty: 35
    Ocena: 4
    Mam problem.
    Musze napisać program w asemblerze na dwóch licznikach który ma włączać diode na 100 ms i wyłączać na 900 ms.
    Napisałem i nie działa (bynajmniej u mnie) Czemu ??

    $$ ORG 00h LJMP START ORG 0Bh LJMP 50h ORG 1Bh LJMP 70h START: ILOSC EQU 65536-46080 ; czas odliczania 50ms MOV TH0,#ILOSC/256 MOV TL0,#ILOSC-(ILOSC/256)*256 MOV TMOD,#00010001B SETB TR0 CLR TF0 MOV IE,#10000010B CLR P1.7 MOV R0,#2 MOV R1,#18 PETLA: NOP SJMP PETLA END ORG 5Oh MOV TH0,#ILOSC/256 MOV TL0,#ILOSC-(ILOSC/256)*256 DJNZ R0,DALEJ SETB P1.7 MOV R0,#2 MOV TH1,#ILOSC/256 MOV TL1,#ILOSC-(ILOSC/256)*256 MOV IE,#10001000B CLR TR0 SETB TR1 DALEJ: RETI ORG 7Oh MOV TH1,#ILOSC/256 MOV TL1,#ILOSC-(ILOSC/256)*256 DJNZ R1,DALEJ CLR P1.7 MOV R1,#18 MOV TH0,#ILOSC/256 MOV TL0,#ILOSC-(ILOSC/256)*256 MOV IE,#10000010B CLR TR1 SETB TR0 DALEJ: RETI $$
  • REKLAMA
  • #2 2161109
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Bardzo to nieczytelne. A jaki to procesor ? Po rejestrach wygląda na '51
  • REKLAMA
  • #3 2161129
    zbyszekp22
    Poziom 10  
    Posty: 35
    Ocena: 4
    Oczywiście to '51

    ORG 00h
    LJMP START
    ORG 0Bh
    LJMP 50h
    ORG 1Bh
    LJMP 70h
    START:
    ILOSC EQU 65536-46080 ; czas odliczania 50ms
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    MOV TMOD,#00010001B
    SETB TR0
    CLR TF0

    MOV IE,#10000010B
    CLR P1.7
    MOV R0,#2
    MOV R1,#18
    PETLA: NOP
    SJMP PETLA
    END

    ORG 5Oh

    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R0,DALEJ
    SETB P1.7
    MOV R0,#2
    MOV TH1,#ILOSC/256
    MOV TL1,#ILOSC-(ILOSC/256)*256
    MOV IE,#10001000B
    CLR TR0
    SETB TR1
    DALEJ:
    RETI

    ORG 7Oh

    MOV TH1,#ILOSC/256
    MOV TL1,#ILOSC-(ILOSC/256)*256
    DJNZ R1,DALEJ
    CLR P1.7
    MOV R1,#18
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    MOV IE,#10000010B
    CLR TR1
    SETB TR0
    DALEJ:
    RETI
  • REKLAMA
  • #4 2161352
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jedna uwaga. Jak piszesz program który ma działać na przerwaniach to nie powinno się stosować pętli opóźniających, ponieważ przedłuża to proces trwania obsługi przerwania i jednocześnie nic nie robi a w tym czasie może być potrzeba obsługi innego przerwania. Generalnie program w obsłudze przerwania powinien być jak najkrótszy robił tylko to co jest absolutnie niezbędne.
  • #5 2163604
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    GienekS napisał:
    Jedna uwaga. Jak piszesz program który ma działać na przerwaniach to nie powinno się stosować pętli opóźniających,...

    GienekS :arrow: W którym miejscu są te pętle :?:

    zbyszekp22 :arrow: Do "pomrygania" diodą , nie są potrzebna aż dwa timery.
    Jeden w zupełności wystarczy ;)

    Piotrek

    PS
    Czy Twój kompiltor nie protestuje , dla 2 x etykieta DALEJ: ;)
  • REKLAMA
  • #6 2163723
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    [quote="zumekGienekS :arrow: W którym miejscu są te pętle :?:
    [/quote]Sory ale coś mnie przyćmiło. Nie wiem dlaczego ale w tym dopatrzyłem się pętli
    DJNZ R1,DALEJ
    ....
    DJNZ R0,DALEJ 
    
    
  • #7 2166781
    zbyszekp22
    Poziom 10  
    Posty: 35
    Ocena: 4
    Po małych korektach śmiga. Dzięki :D

    A propos, to włąśnie o to chodzi żeby zrobić to na dwóch Timerach. Oczywistym jest , że na jednym jest o wiele prostsze.


    ORG 00h
    LJMP START
    ORG 0Bh
    LJMP PRZE1
    ORG 1Bh
    LJMP PRZE2
    START:

    ILOSC EQU 65536-46080 ; czas odliczania 50ms
    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    MOV TH1,#ILOSC/256
    MOV TL1,#ILOSC-(ILOSC/256)*256
    MOV TMOD,#00010001B
    CLR TF1
    CLR TF0
    SETB TR1
    MOV IE,#10001010B
    MOV R0,#2
    MOV R1,#18
    PETLA: NOP
    SJMP PETLA


    PRZE1:

    MOV TH0,#ILOSC/256
    MOV TL0,#ILOSC-(ILOSC/256)*256
    DJNZ R0,DALEJ
    MOV R0,#2
    SETB P1.7

    CLR TR0
    SETB TR1
    DALEJ:
    RETI

    PRZE2:

    MOV TH1,#ILOSC/256
    MOV TL1,#ILOSC-(ILOSC/256)*256
    DJNZ R1,DALEJ1
    MOV R1,#18

    CLR TR1
    SETB TR0
    CLR P1.7
    DALEJ1:
    RETI

    END
  • #8 4404740
    Fevers
    Poziom 2  
    Posty: 2
    Witam
    Mam problem z napisaniem prostego(nie dla mnie)programu,którego zasadza działania polega na zapalaniu i gaszeniu diody przy użyciu timerów(podobno wdl.Nauczyciela wystarczy 1 timer) oraz przyspieszanie mrugania diody( i tak w kółko).Prog napisany w dsm 8051.
    Po czytaniu wielu postów wiem ze to nie problem dla kogoś kto wie co z czym itd.
    Byłbym bardzo wdzięczny za szybką pomoc(potrzebuje to na jutro;/)
    Szukałem na forum takiego programu ale jak na razie mi sie nie udało znaleźć.
    Pozdrawiam.
  • #9 4405211
    slomek83
    Poziom 12  
    Posty: 61
    Pomógł: 1
    	org 0h
    	jmp start
    
    	org 0bh
    	jmp przerwanie
    
    	
    	org 30h
    start:
    	setb p0.1
    	setb p0.0
    	setb p0.2
    	clr tr0
    	mov tmod,#00000001b
    	mov ip,#00000010b
    	mov ie,#10000010
    	mov th1,#0dch
    	setb tr0
    	mov r1,#100
    
    przerwanie:
    	mov th0,#0dch
    	djnz r1,koniec
    	mov r1,#100
    	cpl p0.2
    	cpl p0.0
    	cpl p0.1
    koniec:	reti
    
    end


    Tutaj masz mruganie diodami, prawdopodobnie co sekunde diody zmieniaja swoj stan, oczywiscie przy uzyciu odpowiedniego kwarcu, a w tym wypadku zostal podlaczony kwarc 11.0...MHz
  • #10 4405335
    Fevers
    Poziom 2  
    Posty: 2
    Ehm a gdzie użyty jest rozkaz zapalenia diody( clr p1.7) albo gdzie go ewentualnie wmontować??.Jeśli Byłbyś tak miły i wytłumaczył każdy wers to może bym to zrozumiał co jest chyba najistotniejsze w programie.
    Tak czy siak dzięki za odpowiedz:)
  • #11 4405382
    slomek83
    Poziom 12  
    Posty: 61
    Pomógł: 1
    Z 51 mialem stycznosc dwa lata temu, teraz nie pamietam wszystkich rejestrow funkcyjnych i za co one odpowiadaja, ale za etykieta START masz ustawienie przerwania od timera, wpisywana jest wartosc poczatkowa i pewnie ustawiane priorytety przerwan i ich maskowanie. a za mruganie diody co sekunde odpowiedzialny jest rozkaz CPL, ktory zmienia wartosc wyjsc na pinie na przeciwna 1->0->1 i mamy mrugajaca diode, w przerwaniu oczywiscie trzeba ustawic timer znow wartoscia poczatkowa, ustawiana jest tylko bardziej znaczacy bajt. Mlodszego nie zmieniamy, a to tylko dzieki zastosowaniu kwarcu 11.05...MHz. W przerwaniu masz licznik, ktory jest dekrementowany i jesli on zostanie wyzerowany to wtedy nastepuje zapalenie/wygasniecie diod. Z tego wnioskuje ze zmiana stanow nastepuje co sekunde.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z napisaniem programu w asemblerze dla mikrokontrolera rodziny 8051, który ma sterować miganiem diodą LED z czasem włączenia 100 ms i wyłączenia 900 ms, wykorzystując dwa liczniki (timery). Autor przedstawił kod źródłowy, który początkowo nie działał poprawnie. Wskazano, że stosowanie pętli opóźniających w procedurach przerwań jest niezalecane, ponieważ wydłuża obsługę przerwania i może blokować inne przerwania. Zasugerowano, że do realizacji zadania wystarczy jeden timer, jednak autor chciał celowo użyć dwóch timerów. Po drobnych korektach kod zaczął działać poprawnie. W dyskusji pojawiły się przykłady kodów asemblerowych konfigurujących rejestry TH0, TL0, TH1, TL1, TMOD, IE oraz obsługujących przerwania timerów 0 i 1. Omówiono także znaczenie rozkazów takich jak DJNZ, CPL oraz ustawianie i czyszczenie bitów sterujących timerami i portami I/O (np. P1.7). Wspomniano o wykorzystaniu kwarcu o częstotliwości około 11 MHz do uzyskania odpowiednich czasów odliczania. Podkreślono, że w przerwaniach należy ustawiać wartości początkowe timerów i minimalizować czas wykonywania kodu przerwania.
Wygenerowane przez model językowy.
REKLAMA