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] przerwania int0 i int1

dbk20 27 Sty 2011 08:41 4480 3
REKLAMA
  • #1 9063074
    dbk20
    Poziom 10  
    Witam kolegów,

    sprawdzałem na różne sposoby, int0 ma mi dodac do pozycja++;
    ale nie dodaje...
    prosze o oswiecenie ;)


    
    /* układ ATmega 1MHz */
    /* servo by dex */
    
    #define F_CPU 1000000L 
    #include <avr/io.h> 
    #include <util/delay.h> 
    #include <avr/interrupt.h> 
    
    unsigned int roznicapozycji; 
    unsigned int wynik; 
    unsigned int dolnyzakres;
    unsigned int gornyzakres;
    unsigned int licznik; 
    unsigned int korekta; 
    unsigned int lewo; 
    unsigned int prawo; 
    unsigned long int pozycja;
    unsigned int kontrolaenkodera; 
    
      ISR(INT0_vect) { 
    
       pozycja++;               //przy int0 ustaw flage1 na 1 
    
       }    
    
       ISR(INT1_vect) { 
    
       pozycja++;                //przy int1 ustaw flage2 na 1 
    
       }    
    
     
    
    ISR (BADISP_vect){}
    
    int main(void) { 
    
    
       DDRD  = 0x00;            //port D jako wejscie 
       PORTD = 0xFF; 
    
       MCUCR = 0x0f;             // ustaw przerwanie INT0 i INT1, zbocze narastajace 
       GICR = (1<<INT0) | (1<<INT1); 
    
    
    licznik = 31000;
    pozycja=10000;
    korekta=1;
    dolnyzakres=440;
    gornyzakres=510;
    
          
      DDRB=0xFF;           // PINB jako wyjścia 
    
       DDRC  = 0x00;
       PORTC = 0x0F;
       //Ustawiamy PWM w Fast 8 bits mode -> WGM13,WGM12,WGM11,WGM10 = 0b0101 
       TCCR1A |= (1<<WGM10); 
       TCCR1A |= (0<<WGM11);  
       TCCR1B |= (1<<WGM12); 
       TCCR1B |= (0<<WGM13); 
    
       //włącz przekazywanie sygnału PWM na PIN PB1 (OC1A i 1B) rtfm str. 97 
       TCCR1A |= (1<<COM1A1); 
       TCCR1A |= (0<<COM1A0); 
       TCCR1A |= (1<<COM1B1); 
       TCCR1A |= (0<<COM1B0);  
    
       //Preskaler 
       TCCR1B &= ~((1<<CS12) | (1<<CS11) | (1<<CS10));   //wyzeruj bity preskalera 
       //TCCR1B |= (1<<CS11);   //ustaw preskaler 1:8
       TCCR1B |= (1<<CS10);   //do 64 z cs11 // samo 1:1
    
      // TCNT0 = 0;  // Resetuj TCNT0 
    
    sei();  
    
    for (;;) {  
    
              
    	//enkoder
    	switch(PINC & 0x03)
    	{
    	  case 0x03:
    		//if (kontrolaenkodera == 3) pozycja--;
    		//if (kontrolaenkodera == 2) pozycja++;
    		kontrolaenkodera=1;
    	  break;
    	  
    	  case 0x01:
    		//if (kontrolaenkodera == 1) pozycja--;
    		//if (kontrolaenkodera == 3) pozycja++;
    		kontrolaenkodera=2;
    	  break;
    	  
    	  case 0x00:
    		if (kontrolaenkodera == 2) pozycja--;
    		if (kontrolaenkodera == 4) pozycja++;
    		kontrolaenkodera=3;
    	  break;
    
    	  case 0x02:
    		//if (kontrolaenkodera == 3) pozycja--;
    		// if (kontrolaenkodera == 1) pozycja++;
    		kontrolaenkodera=4;
    	  break;
    	}
    		
    
    
    	if ( pozycja < 9999 ) 
    	{
    		prawo = ( 10000 - pozycja );
    		roznicapozycji=10000-pozycja;
    		
    		if ( prawo > 5 && korekta < 3) korekta++; // i moze razy stopa bledy? roznicapozycji  z enkodera//rośnie!
    		
    		if ( prawo < 5 && korekta > 0) korekta--; // jak juz nadgoni bledy to zwalnianie  x wspolczynnik bledu wprowadzic roznicapozycji //spada
    		
    		wynik = dolnyzakres + (prawo * korekta) + prawo;
    		if ( wynik > gornyzakres ) wynik=gornyzakres;
    		if ( wynik < dolnyzakres ) wynik=dolnyzakres;
    		OCR1B = wynik;
    		OCR1A = 1;
    	}
    	
    	
    	
    	if ( pozycja > 10001 ) 
    	{
    		lewo = ( pozycja - 10000 );
    		roznicapozycji=pozycja-10000;
    		
    		if ( lewo > 5 && korekta < 3) korekta++; // i moze razy stopa bledy? roznicapozycji  z enkodera//rośnie!
    		
    		if ( lewo < 5 && korekta > 0) korekta--; // jak juz nadgoni bledy to zwalnianie  x wspolczynnik bledu wprowadzic roznicapozycji //spada!	
    		
    		wynik = dolnyzakres + (lewo * korekta) + lewo;
    		if ( wynik > gornyzakres ) wynik=gornyzakres;
    		if ( wynik < dolnyzakres ) wynik=dolnyzakres;
    		OCR1A =  wynik;
    		OCR1B = 1;
    	}
    
    		
    	if ( pozycja == 10000 ) 
    	{
    		OCR1A = 1;
    		OCR1B = 1;
    	}	
    
     
    }  // koniec for(;;)     
    } 
    
  • REKLAMA
  • #2 9063126
    pawel_mr
    Poziom 15  
    Zmienne, które są dzielone między przerwaniami a resztą kodu muszą być deklarowane jako volatile. Zmienną "pozycja" zmieniasz zarówno w przerwaniu od INT0 jak i w innym miejscu w kodzie więc musisz użyć volatile.
  • REKLAMA
  • #3 9063142
    dbk20
    Poziom 10  
    dziękuje kolego, sprawdze jak rozłożę stanowisko ponownie,
    około południa będę wiedział czy cos innego jeszcze sie nie krzaczy ;)

    Dodano po 2 [godziny] 35 [minuty]:

    DZIALA. przepraszam. szkolny błąd.

    powinno zię znaleźć w FAQ... ;)
REKLAMA