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

[Atmega8] [C] Opóźnienie czasowe

ullman 17 Cze 2010 22:35 1635 3
REKLAMA
  • #1 8201608
    ullman
    Poziom 11  
    Witam,
    Chciałem zrealizować opóźnienie czasowe załączenia urządzenie po wystąpieniu przerwania o czas tau2 który został zliczony przez timer wynosi on ok 70ms, tau2 jest w us czyli ok 70000us Napisałem dwie funkcje w oparciu o delay_ms i delay_us i otrzymuje dwa różne rezultaty, dlaczego?

    
    ISR(INT0_vect) {
    	if (zal==1) {
    		wl=1;
    		for (k=0; k<(tau2/1000); k++) {      			
        		_delay_ms(1);
      			}
    
    		PORTA ^= (1<<PORTA0);						//zmnien stan PA0
    		zal=0;
    		_delay_ms(2000);		
    		}
    
    }


    
    ISR(INT0_vect) {
    	if (zal==1) {
    		wl=1;
    		for (k=0; k<(tau2); k++) {      			
        		_delay_us(1);
      			}
    
    		PORTA ^= (1<<PORTA0);						//zmnien stan PA0
    		zal=0;
    		_delay_ms(2000);		
    		}
    
    }
  • REKLAMA
  • #2 8201635
    sulfur
    Poziom 24  
    A tau2 to jakiej jest wielkości przepraszam, bo 70k nie mieści się nawet w 16 bitach.
  • REKLAMA
  • #3 8201729
    ullman
    Poziom 11  
    tau2 jest typu unsigned long int czyli 2^32 -1
  • Pomocny post
    #4 8202030
    gaskoin
    Poziom 38  
    sama pętla for dodaje jeszcze 3 cykle zegarowe, popatrz na liczbę wykonań pętli dla 8MHz zegara

    pierwsza to 70*3/8000ms + 70*1ms = 26,25µs + 70 ms
    druga 70000*3/8000ms + 70ms = 26.25ms + 70ms

    różnica jest ogromna...
REKLAMA