Skocz do zawartości

[AVR] Timer zakłóca działanie ADC


m471

Pomocna odpowiedź

Witam,

Po inicjacji Timera, ADC przestaje działać. Przed, oraz w trakcie inicjacji wszystko działa jak należy, co sprawdziłem pułapkami programowymi w postaci funkcji LED() (na piny ADC0-2 podpięte są przez przyciski dzielniki napięć które na wyjściu dają połowę napięcia). Wszystko przestaje działać po włączeniu przerwania Compare Match Timera 1. Początkowo myślałem, że problem tkwi w tym, że program wychodząc z jednego przerwania wchodzi od razu w drugie, jednak dioda po zainicjowanym timerze wciąż świeci połową jasności, po prostu już nie gaśnie. Czy przerwania ADC i timera się w jakiś sposób gryzą? Lub ma ktoś jakiś inny pomysł w czym może tkwić problem?

Kod:

#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/atomic.h>
#include <util/delay.h>

volatile int adc;
volatile int MUX_tmp;
volatile char adc_arr[3];

void ADC_init(void)
{
	ADMUX|= ( _BV(REFS0) );
	ADCSRA|= ( _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0));
	DIDR0 |= 0x3F;
}


void LED(void)
{


	while(adc<=300)
	{
		PORTB|=_BV(PB0);
		PORTB=0;
	}
	while(adc>=500){};
	PORTB=0;

}

void Timer_init(void)
{
	TCCR0A|= (_BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01));
	LED();
	_delay_ms(32);

	TCCR0B|= (_BV(CS00));
	LED();
	_delay_ms(32);

	TCCR1B|= (_BV(WGM12) | _BV(CS10));
	LED();
	_delay_ms(32);

	OCR1AH|= 0b1001000;
	LED();
	_delay_ms(32);

	TIMSK1|= _BV(OCIE1A);
	LED();
	_delay_ms(32);

}





ISR(ADC_vect)
{
	adc=ADC;

		MUX_tmp=ADMUX & 0xF;
		adc_arr[MUX_tmp]=adc;
		if(MUX_tmp <= 3)
		{
			ADMUX=(MUX_tmp+1) | _BV(REFS0);
			MUX_tmp= ADMUX & 0xF;
		}
		else
		{
			ADMUX=_BV(REFS0);
		}

	ADCSRA|= _BV(ADSC);
}

volatile int Flag=0;

ISR(TIMER1_COMPA_vect)
{
	Flag=1;
}

int main(void)
{
	sei();
	ADC_init();
	ADCSRA|= _BV(ADSC);
	DDRB|= _BV(PB0);

	LED();
	_delay_ms(32);

	LED();
	_delay_ms(32);

	Timer_init();
	LED();
	_delay_ms(32);

	while(1);
	{
		LED();

		_delay_ms(32);

	}
}

 Nie widzę potrzeby w wrzucaniu schematu, do PB0 podłączona jest dioda, do pinów ADC wspomniałem wcześniej a reszta mikrokontrolera podłączona jest prawidłowo.

Z góry dziękuję za odpowiedź 🙂

Pozdrawiam

Ps: Jest to wycinek programu, więc niektóre zmienne mogą zdawać się bezużyteczne (jak np int Flag)

Link do komentarza
Share on other sites

Dnia 7.01.2020 o 00:24, atMegaTona napisał:

Wg. mnie funkcja LED jest bez sensu, pozbądź się jej 😜  albo przynajmniej zmień while na if i kombinuj dalej 🙂

Jest to pułapka programowa, zwiększyłem preskaler i program działa, choć timer zaczyna działać dopiero po minucie... Szczerze mówiąc wydaje mi się, że problem tkwi w programatorze 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.