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

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.