Skocz do zawartości
m471

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

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)

Udostępnij ten post


Link to post
Share on other sites
Anonim

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

Udostępnij ten post


Link to post
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 🙂

Udostępnij ten post


Link to post
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...