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

jak wyliczyc sekunde na AT89S52 z rezonatorem 16MHz?

05 Lut 2007 20:10 1076 1
  • #1 3532543
    Konto nie istnieje
    Konto nie istnieje  
  • #2 3533535
    qran
    Poziom 13  
    Posty: 59
    Pomógł: 2
    Ocena: 6
    Hej!

    Zależy co rozumieć pod pojęciem "wyliczyć jedną sekundę". Niestety o C nie mam pojęcia ale w asemblerze (zatrzymanie programu na 1s) zrobiłbym tak:
    
    	org 0000H        ;początek pamięci
    	ljmp Main        ;daleki skok do programu głównego
    
    	......
    	......
    
    	org 000BH        ;wektor T0
    	ljmp T0        ;daleki skok do procedury obsługi przerwania
    
    	......
    	......
    
    T0:         ;procedura obsługi przerwania 
    
    	push PSW         ;odłóż PSW na stos 
    	mov TH0, #30H        ;przeładuj TH0
    	inc R0            ;zwiększ licznik
    	cjne R0, #C8H, T0End        ;czy licznik = 200
    	clr TR0        ;   tak : zatrzymaj TR0
    T0End:        ;   nie : zliczaj dalej
    	pop PSW        ;zdejmij ze stosu
    	reti        ;powrót
    
    	......
    	......
    
    
    Main:
    	......
    	......
    
    	anl TMOD, #F0H        ;licznik TR0 w trybie 0
    	mov TH0, #30H        ;załaduj wartość początkową
    	mov R0, #00H        ;wyzeruj licznik przerwań
    
    	setb EI        ;globalne odblokowanie przerwań
    	setb ET0        ;odblokuj przerwanie od TR0
    
    	setb TR0        ;włącz TR0
    Wait:
    	jb TR0, Wait        ;skacz dopóki TR0 = 1
    
    	......
    	......
    
    

    Program wykorzystuje:
    - licznik T0 pracujący w trybie 0, przerwanie zgłaszane co 0,004992s
    - rejestr R0 zliczający 200 zgłoszeń przerwania od T0

    Uzyskanie przerwy trwającej dokładnie 1s jest bardzo trudne z kwarcem 16MHz. Może warto zastanowić się nad inną wartością.

    Pozdrawiam!
    Cezzary Kuran
REKLAMA