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 zaprogramować przerwanie od licznika T0 na mikrokontrolerze 89S52?

rkliw 05 Gru 2009 20:38 879 1
REKLAMA
  • #1 7349603
    rkliw
    Poziom 10  
    Posty: 9
    Proszę o pomoc w zaprogramowanie przerwania pochodzącego od licznika T0 do krótkiego programiku który napisałem.Prośba maja jest aby licznik zliczył 10s (startując równo z odliczaniem do dziesięciu które widac na wyświetlaczu siedmiosegmentowym) i włączył przerwanie które wykona program według pokazanego kodu.Są to moje początki dlatego proszę o wyrozumiałość.
    Zaznaczam iż dzięki pomocy forum wykonałem sobie programator wraz z wizualizacją .
    Początek napisałem korzystając z etykiety.Program po przerwaniu tradycyjnie. Chcę go pokazać bo jest to mój pierwszy .
    Gas to znaczy gaś wyświetlacz sidmiosegmentowy.
    Próba programu;

    
    Gas      EQU  11111111B
    Zero     EQU  11000000B
    Jeden    EQU  11111001B
    Dwa      EQU  10100100B
    Trzy     EQU  10110000B
    Cztery   EQU  10011001B
    Piec     EQU  10010010B
    Szesc    EQU  10000010B
    Siedem   EQU  11111000B
    Osiem    EQU  10000000B
    Dziewiec EQU  10010000B
    LJMP	START
    START:
           MOV  P0,#Zero
           MOV  P2,#Jeden
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Dwa
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Trzy
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Cztery
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Piec
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Szesc
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Siedem
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Osiem
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Zero
           MOV  P2,#Dziewiec
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
           MOV  P0,#Jeden
           MOV  P2,#Zero
            LCALL	OPOZNIENIE1S
           MOV  P0,#Gas
           MOV  P2,#Gas
    	LCALL	OPOZNIENIE
    

    Tutaj chciałbym zrobić przerwanie od licznika T0
    aby wykonał poniższą instrukcje.

    
    	CLR	P0.0
            CLR	P0.3
            CLR	P0.4
            CLR	P0.5
            CLR	P2.1
            CLR	P2.2
            CLR	P2.4
            CLR	P2.5
            CLR	P2.6
            CLR	P1.3
    	LCALL	OPOZNIENIE1S
            SETB	P0.0
            SETB	P0.3
            SETB	P0.4
            SETB	P0.5
            SETB	P2.1
            SETB	P2.2
            SETB	P2.4
            SETB	P2.5
            SETB	P2.6
            SETB	P1.3
    	LCALL	OPOZNIENIE
    	CLR	P0.1
            CLR	P0.2
            CLR	P0.4
            CLR	P0.5
            CLR	P0.6
            CLR	P2.0
            CLR	P2.3
            CLR	P2.4
            CLR	P2.5
            CLR	P1.2
    	LCALL	OPOZNIENIE1S
    	SETB	P0.1
            SETB	P0.2
            SETB	P0.4
            SETB	P0.5
            SETB	P0.6
            SETB	P2.0
            SETB	P2.3
            SETB	P2.4
            SETB	P2.5
            SETB	P1.2
    	LCALL	OPOZNIENIE
            CLR	P0.0
            CLR	P0.3
            CLR	P0.4
            CLR	P0.5
            CLR	P2.0
            CLR	P2.3
            CLR	P2.4
            CLR	P2.5
            CLR	P2.6
            CLR	P1.1
    	LCALL	OPOZNIENIE1S
    	SETB	P0.0
            SETB	P0.3
            SETB	P0.4
            SETB	P0.5
            SETB	P2.0
            SETB	P2.3
            SETB	P2.4
            SETB	P2.5
            SETB	P2.6
            SETB	P1.1
    	LCALL	OPOZNIENIE
            CLR	P0.0
            CLR	P0.3
            CLR	P0.4
            CLR	P0.5
            CLR	P0.6
            CLR	P1.0
    	LCALL	OPOZNIENIE1S
    	SETB	P0.0
            SETB	P0.3
            SETB	P0.4
            SETB	P0.5
            SETB	P0.6
            SETB	P1.0
    	LCALL	OPOZNIENIE
            CLR	P0.0
            CLR     P0.2
            CLR	P0.3
            CLR	P0.5
            CLR	P0.6
            CLR	P0.7
            CLR	P2.0
            CLR     P2.1
            CLR	P2.2
            CLR	P2.3
            CLR     P2.4
            CLR	P2.5
            CLR	P1.0
    	LCALL	OPOZNIENIE4S
            SETB	P0.0
            SETB    P0.2
            SETB	P0.3
            SETB	P0.5
            SETB	P0.6
            SETB	P0.7
            SETB	P2.0
            SETB    P2.1
            SETB	P2.2
            SETB	P2.3
            SETB    P2.4
            SETB	P2.5
            SETB	P1.0
    	LJMP	START
    OPOZNIENIE1S:		
    WARTOSC1:	
    	MOV	R0,#10
    WARTOSC2:
    	MOV 	R1,#200
    WARTOSC3:
    	MOV 	R2,#250
    	DJNZ 	R2,$
    	DJNZ 	R1,WARTOSC3
    	DJNZ 	R0,WARTOSC2
    	RET
    OPOZNIENIE4S:		
    WARTOSC7:	
    	MOV	R0,#40
    WARTOSC8:
    	MOV 	R1,#200
    WARTOSC9:
    	MOV 	R2,#250
    	DJNZ 	R2,$
    	DJNZ 	R1,WARTOSC9
    	DJNZ 	R0,WARTOSC8
    	RET
    OPOZNIENIE:		
    WARTOSC4:	
    	MOV	R3,#1
    WARTOSC5:
    	MOV 	R4,#1
    WARTOSC6:
    	MOV 	R5,#1
    	DJNZ 	R5,$
    	DJNZ 	R4,WARTOSC6
    	DJNZ 	R3,WARTOSC5
    	RET
    END
    

    Z góry dziękuję za pomoc

    Dodano po 2 [godziny] 35 [minuty]:

    Napisałem coś takiego ale mi nie działa.
    Przerwanie zewnętrzne z INT0.

    Gas EQU 11111111B
    Zero EQU 11000000B
    Jeden EQU 11111001B
    Dwa EQU 10100100B
    Trzy EQU 10110000B
    Cztery EQU 10011001B
    Piec EQU 10010010B
    Szesc EQU 10000010B
    Siedem EQU 11111000B
    Osiem EQU 10000000B
    Dziewiec EQU 10010000B
    ORG 0000h
    LJMP START
    ORG 0003h
    LJMP intEX0
    START:
    SETB EX0
    SETB EA
    MOV P0,#Zero
    MOV P2,#Jeden
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Dwa
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Trzy
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Cztery
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Piec
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Szesc
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Siedem
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Osiem
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Zero
    MOV P2,#Dziewiec
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    MOV P0,#Jeden
    MOV P2,#Zero
    LCALL OPOZNIENIE1S
    MOV P0,#Gas
    MOV P2,#Gas
    LCALL OPOZNIENIE
    intEX0:
    CLR P0.0
    CLR P0.3
    CLR P0.4
    CLR P0.5
    CLR P2.1
    CLR P2.2
    CLR P2.4
    CLR P2.5
    CLR P2.6
    CLR P1.3
    LCALL OPOZNIENIE1S
    SETB P0.0
    SETB P0.3
    SETB P0.4
    SETB P0.5
    SETB P2.1
    SETB P2.2
    SETB P2.4
    SETB P2.5
    SETB P2.6
    SETB P1.3
    LCALL OPOZNIENIE
    CLR P0.1
    CLR P0.2
    CLR P0.4
    CLR P0.5
    CLR P0.6
    CLR P2.0
    CLR P2.3
    CLR P2.4
    CLR P2.5
    CLR P1.2
    LCALL OPOZNIENIE1S
    SETB P0.1
    SETB P0.2
    SETB P0.4
    SETB P0.5
    SETB P0.6
    SETB P2.0
    SETB P2.3
    SETB P2.4
    SETB P2.5
    SETB P1.2
    LCALL OPOZNIENIE
    CLR P0.0
    CLR P0.3
    CLR P0.4
    CLR P0.5
    CLR P2.0
    CLR P2.3
    CLR P2.4
    CLR P2.5
    CLR P2.6
    CLR P1.1
    LCALL OPOZNIENIE1S
    SETB P0.0
    SETB P0.3
    SETB P0.4
    SETB P0.5
    SETB P2.0
    SETB P2.3
    SETB P2.4
    SETB P2.5
    SETB P2.6
    SETB P1.1
    LCALL OPOZNIENIE
    CLR P0.0
    CLR P0.3
    CLR P0.4
    CLR P0.5
    CLR P0.6
    CLR P1.0
    LCALL OPOZNIENIE1S
    SETB P0.0
    SETB P0.3
    SETB P0.4
    SETB P0.5
    SETB P0.6
    SETB P1.0
    LCALL OPOZNIENIE
    CLR P0.0
    CLR P0.2
    CLR P0.3
    CLR P0.5
    CLR P0.6
    CLR P0.7
    CLR P2.0
    CLR P2.1
    CLR P2.2
    CLR P2.3
    CLR P2.4
    CLR P2.5
    CLR P1.0
    LCALL OPOZNIENIE4S
    SETB P0.0
    SETB P0.2
    SETB P0.3
    SETB P0.5
    SETB P0.6
    SETB P0.7
    SETB P2.0
    SETB P2.1
    SETB P2.2
    SETB P2.3
    SETB P2.4
    SETB P2.5
    SETB P1.0
    LJMP START
    RETI
    OPOZNIENIE1S:
    WARTOSC1:
    MOV R0,#10
    WARTOSC2:
    MOV R1,#200
    WARTOSC3:
    MOV R2,#250
    DJNZ R2,$
    DJNZ R1,WARTOSC3
    DJNZ R0,WARTOSC2
    RET
    OPOZNIENIE4S:
    WARTOSC7:
    MOV R0,#40
    WARTOSC8:
    MOV R1,#200
    WARTOSC9:
    MOV R2,#250
    DJNZ R2,$
    DJNZ R1,WARTOSC9
    DJNZ R0,WARTOSC8
    RET
    OPOZNIENIE:
    WARTOSC4:
    MOV R3,#1
    WARTOSC5:
    MOV R4,#1
    WARTOSC6:
    MOV R5,#1
    DJNZ R5,$
    DJNZ R4,WARTOSC6
    DJNZ R3,WARTOSC5
    RET
    END
  • REKLAMA
  • #2 7352347
    rkliw
    Poziom 10  
    Posty: 9
    Pomyliłem się w instrukcji.
    LJMP START dałem na końcu a nie w petli głównej.
    Może przez to nie chodzi.

    Dodano po 4 [godziny] 47 [minuty]:

    Sprawdziłem przerwanie działa ale program po wykonaniu podprogramu przerwania nie wraca do programu głównego.
REKLAMA