Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн сен 19, 2022 16:50:16

Совершенно дикая ситуация. Проект на 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 раз.

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

Пн сен 19, 2022 17:01:20

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

ADIE: ADC Interrupt Enable
Извините за глупый вопрос, а Вы вектор прерывания АЦП и программу его обработки сотворили?

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

Пн сен 19, 2022 17:13:58

С.Н., а вопрос не тупой. Это я идиот. Спасибо.

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();//старт измерения
}

опорное напряжение инициализируется в ините на ацп
Ответить