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

Przerwanie Atmega32 - problem z instrukcjami if()

qutrit 27 Lis 2010 21:59 935 3
REKLAMA
  • #1 8797729
    qutrit
    Poziom 20  
    Witam.
    Otóż mam taki problem z przerwaniem od przepełnienia. Mianowicie w tym przerwaniu wykonywana jest tylko druga instrukcja "if". Do portów mam podłączone diody, dioda od portu portd_5 tylko nie zauważalnie miga co 5sek., przy porcie port_6 świeci-czyli ten "if" działa dobrze. Jeżeli "if-y" zamienię miejscami to i tak wykonywany zostanie drugi "if". Oczywiście jeżeli w przerwaniu jest jeden "if" obojętnie który, to działa poprawnie. Co należy zrobić aby działały obydwa "if-y" ?? W if-ach wstawiłem (1) żeby były prościej, ale docelowo są tam (a<b).
    Z góry dziękuję za sugestie.
    
    
    TCCR1B |= ((1<<CS12)|(0<<CS11)|(1<<CS10)); //timer1 z preskalerem 1024
    TCNT1 = 60653; //wartosc poczatkowa do przepelnienia uplynie ~5sek
    TIMSK |= (1<<TOIE1);
    
    
    ISR(TIMER1_OVF_vect)
    {		
    		if(1) 
    		{
    		PORTD=(1<<5);
    		}
    		else
    		{
    		PORTD=(0<<5);
    		}
    		
    		if(1)
    		{
    		PORTD=(1<<6);
    		}
    		else
    		{
    		PORTD=(0<<6);
    		}
    		
    		TCNT1 = 60653;
    		
    }
    

    Problem jest taki sam gdy:
    
    ISR(TIMER1_OVF_vect)
    {		
    		
    		if(1) //pompka trzeba ustawic delte histereze
    		{
    		PORTD=(1<<5); //nie włącza diody
    		PORTD=(1<<6); //włącza diodę
    	
    		}
    		else
    		{
    		}
    		TCNT1 = 60653;
    		
    }
    

    Dlaczego wykonywana jest instrukcja tylko na PORTD=(1<<6); a PORTD=(1<<5); tylko mignie ??? Po zamianie miejscami jest odwrotnie.
  • REKLAMA
  • Pomocny post
    #2 8797759
    H0miczek
    Poziom 20  
    Moze chodzilo Ci o PORTD|=(1<<6); lub PORTD&=~(1<<6); ? ;]
  • REKLAMA
  • Pomocny post
    #3 8797794
    Andrzej__S
    Poziom 28  
    Instrukcja PORTD=(1<<6); w drugim 'if' zeruje bit 5 ustawiany instrukcją PORTD=(1<<5);. Aby ustawić bit nie zmieniając innych bitów, należy użyć konstrukcji PORTD|=(1<<6);. Zerowanie określonego bitu bez zmiany pozostałych wykonuje się poprzez instrukcję np. PORTD&=~(1<<6); zamiast PORTD=(0<<6);.
  • #4 8797853
    qutrit
    Poziom 20  
    Dzięki Panie i Panowie za tak szybką odpowiedź, oto chodziło :)
    Przeczytałem sporo na temat programowania, ale jakoś na ten fakt nie natrafiłem. Jeśli mogę się zrewanżować, to z fizyki jestem bardziej biegły :)
    Pozdrawiam.

    Moderowany przez _Robak_:

    Proszę o nich też nie zapominać!

REKLAMA