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

atemga 16 i akcelerometr mxr9500 problem z przerwaniami

kliwer19 27 Kwi 2010 20:20 1191 6
REKLAMA
  • #1 8010176
    kliwer19
    Poziom 10  
    witam. Mam taki problem ponieważ sygnał który dostaje z akcelerometru muszę scałkować podwójnie i do tego jest mi potrzebny przedział miedzy próbkami i mam problem z wyznaczeniem tego czasu. żeby mieć stałe odstępy próbkowania wymyśliłem żeby próbkowanie odbywało się w przerwaniu i teraz problem polega na tym ze w trakcie wykonywania przerwania od timera2 następuje wywołanie odczytu danych z przetwornika w przerwaniu od adc i układ mi się wiesza;/ i nie wiem jak to rozwikłać. dziękuje za pomoc. to cześć kodu programu (te dwa przerwania oraz ustawienia adc i timera2)

    
    void ADC_Init(void) {
    
    	// konifgurujemy adc
    	ADMUX = 0x00;
    	ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    
    void Timer2_Init(void)
    	{
    	TCCR0= (1<<CS20) | (1<<CS21) | (1<<CS22) ; 
    	TIMSK = (1<<TOIE1);
    	}
    
    SIGNAL(SIG_ADC) 
    {
    	adc_temp = (float)(ADCL | (ADCH << 8));	// odczyt przetwornika w przerwaniu
    }
    
    
    SIGNAL (SIG_OVERFLOW2)
    {
    	ADMUX = 0x00;			// wyzerowanie ADMUX	
    	ADCSRA |= (1<<ADSC);    // start pojedynczego pomiaru
    	x=adc_temp;
    	ADMUX = 0x00;
    	ADMUX |= (1<<MUX0);		//wybor kanału
    	ADCSRA |= (1<<ADSC);
    	y=adc_temp;
    	ADMUX = 0x00;
    	ADMUX |= (1<<MUX1);		//wybór kanału
    	ADCSRA |= (1<<ADSC);
    	z=adc_temp;
    }
    


    Pozdrawiam kliwer19
  • REKLAMA
  • #2 8010394
    daniel6662
    Poziom 21  
    Nie rozumiem dlaczego w tym przypadku korzystasz z przerwania od adc...
    Spróbuj odczytać adc w przerwaniu timera 2 wg. schematu: Start pomiaru, czekanie do końca pomiaru, odczyt adc. Dodatkowo zyskasz na pamięci bo zmienna adc_temp będzie nie potrzebna, chyba że wykorzystujesz ją jeszcze do czegoś innego:)
    pozdrawiam
  • REKLAMA
  • #3 8010720
    kliwer19
    Poziom 10  
    ok dziękuje:) tak spróbuje :)

    Dodano po 22 [minuty]:

    czyli coś takiego?
    
    SIGNAL (SIG_OVERFLOW2)
    {
    	ADMUX = 0x00;			// wyzerowanie ADMUX	
    	ADCSRA |= (1<<ADSC);    // start pojedynczego pomiaru
    	while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie przetwarzania
    	    {};	
    	x= (float)(ADCL | (ADCH << 8));;
    	
    	ADMUX = 0x00;
    	ADMUX |= (1<<MUX0);		//wybor kanału
    	ADCSRA |= (1<<ADSC);
    	while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie przetwarzania
    	    {};	
    	y= (float)(ADCL | (ADCH << 8));;
    	
    	ADMUX = 0x00;
    	ADMUX |= (1<<MUX1);		//wybór kanału
    	ADCSRA |= (1<<ADSC);
    	while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie przetwarzania
    	    {};	
    	z= (float)(ADCL | (ADCH << 8));;
    
    }
    


    a w ustawieniach adc wyzerować bit ADIE żeby nie generował przerwania?

    Dodano po 57 [minuty]:

    i kapa nie działa:( pomoże ktoś?
  • REKLAMA
  • #4 8012683
    kliwer19
    Poziom 10  
    heh... jestem początkujący wiec prosiłbym żeby jak ktoś jest w stanie aby mi pomógł. pozdrawiam
  • REKLAMA
  • #5 8013739
    daniel6662
    Poziom 21  
    Takie może głupie pytanie ale... po czym wnioskujesz że się wiesza? Być może wszystko jest dobrze tylko kawałek kodu prezentujący wyniki jest źle napisany
    pozdrawiam
  • #6 8015058
    kliwer19
    Poziom 10  
    widzę ze to co w dalszej części kodu nie jest wykonywane. obsługa klawiszy czy obliczenia lub naświetlnie czegoś nie jest wykonywane
  • #7 8017728
    daniel6662
    Poziom 21  
    Masz błąd w procedurze inicjującej timer2.
    Mianowicie powinno być:
    
    void Timer2_Init(void) 
    { 
    TCCR2= (1<<CS20) | (1<<CS21) | (1<<CS22) ; 
    TIMSK = (1<<TOIE2); 
    }
    


    to by wyjaśniło dlaczego nie czyta wartości z adc ale co to niema raczej nic wspólnego z klawiszami...

    i oczywiście bit ADIE musi być wyzerowany jeżeli nie korzystasz z przerwania od adc:)
    pozdrawiam
REKLAMA