Страница 1 из 1

Atmega88A запись ADCSRA|=(1<<ADSC) решено.

Добавлено: Пн сен 19, 2022 16:50:16
Land
Совершенно дикая ситуация. Проект на Atmega88A. При старте конверсии АЦП (запись бита ADSC в регистр ADCSRA) окончание преобразования приводит к рестарту программы, т.е. выбрасывает на первую сроку main. В реальном железе выглядит как постоянные перезапуски прошивки, в Студии, как написал, уходит на первую строку main(ProgrammCounter = 0) Отловил, что сброс программного счетчика на ноль происходит при выставлении флага ADIF. Т.е. закончилось преобразование АЦП -- и улетел
Понимаю, что лопатить за меня мой код никто не будет. Но хоть направление может кто подскажет?
Вот так выглядит инициализация АЦП. Ничего вроде необычного

Код: Выделить всё

// ADC initialization------------------------------------------------------------------------------------------
	// ADC enabled
	ADCSRA |= (1<<ADPS0) |(1 << ADPS1)|(1<<ADEN)|(1<<ADIE); 
	ADMUX= CURRENT_ch | ADC_VREF_TYPE;	

Re: Atmega88A запись ADCSRA|=(1<<ADSC) = срыв стека?

Добавлено: Пн сен 19, 2022 17:01:20
С.Н.
[uquote="Land",url="/forum/viewtopic.php?p=4291397#p4291397"]

Код: Выделить всё

// ADC initialization------------------------------------------------------------------------------------------
	// ADC enabled
	ADCSRA |= (1<<ADPS0) |(1 << ADPS1)|(1<<ADEN)|(1<<ADIE); 
	ADMUX= CURRENT_ch | ADC_VREF_TYPE;	
[/uquote]
ADIE: ADC Interrupt Enable
Извините за глупый вопрос, а Вы вектор прерывания АЦП и программу его обработки сотворили?

Re: Atmega88A запись ADCSRA|=(1<<ADSC) = срыв стека?

Добавлено: Пн сен 19, 2022 17:13:58
Land
С.Н., а вопрос не тупой. Это я идиот. Спасибо.

Re: Atmega88A запись ADCSRA|=(1<<ADSC) решено.

Добавлено: Пн май 01, 2023 09:59:44
Мамедиев Дмитрий
подходящей темы не нашел, напишу здесь. микроконтроллер at90pwm3b. не могу обновить регистры ЦАП

Код: Выделить всё

	if (term>50)
		{
			DACH=200;
		}
		if (term<50)
		{
			DACH=100;
			
		}

Код: Выделить всё

void DAC_init (void)
{
	DACON|=(1<<DAEN)//включаем
		 |(1<<DAOE)//вывод на DA2
		 |(1<<DALA)//Для того, чтобы легко работать только с 8 битами, есть возможность 
	                 //отрегулировать входное значение влево. Таким образом, достаточно 
					 //написать DACH, чтобы обновить значение DAC.стр262.
	     |(0<<DAATE);//автоматически обновлять вход ЦАП при записи значения в регистр DACH.
	Enable_vcc_vref(); // опорное напряжение питания
}

Код: Выделить всё

void ADC_ini(void)
{
	Enable_adc();//включаем ацп
	Set_prescaler(128); //делитель 128
	Enable_vcc_vref(); // опорное напряжение питания
	Right_adjust_adc_result();// правое выравнивание результата АЦП для 10 бит
	Enable_adc_it();//прерывания по ацп
	Start_conv();//старт измерения
}
опорное напряжение инициализируется в ините на ацп