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

Обсуждаем контроллеры компании Atmel.
Ответить
Land
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

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

Сообщение 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;	
Последний раз редактировалось Land Пн сен 19, 2022 17:14:21, всего редактировалось 1 раз.
С.Н.
Потрогал лапой паяльник
Сообщения: 307
Зарегистрирован: Пн окт 26, 2020 08:37:51
Откуда: г.Волгоград

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

Сообщение С.Н. »

[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
Извините за глупый вопрос, а Вы вектор прерывания АЦП и программу его обработки сотворили?
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Land
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

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

Сообщение Land »

С.Н., а вопрос не тупой. Это я идиот. Спасибо.
Мамедиев Дмитрий
Родился
Сообщения: 11
Зарегистрирован: Пн май 01, 2023 09:38:57

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

Сообщение Мамедиев Дмитрий »

подходящей темы не нашел, напишу здесь. микроконтроллер 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();//старт измерения
}
опорное напряжение инициализируется в ините на ацп
Ответить

Вернуться в «AVR»