Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-19 18:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2017-авг-15 14:19 
Не в сети

Зарегистрирован: 2015-апр-01 07:41
Сообщения: 12
Откуда: Пермь
Всем добра.
Контроллер 1986ВЕ1Т. АЦП настроен на перебор каналов с 1 по 6 включительно и генерацию прерывания по завершению преобразования. После включения первым вызывается прерывание для канала 0. Если же пройти пошагово по коду инициализации АЦП, то этого не происходит.

Открыть Код инициализации
Код:
#define __ADC_ON()      (MDR_ADC->ADC1_CFG |= (1 << Cfg_REG_ADON))
#define __ADC_OFF()     (MDR_ADC->ADC1_CFG &= ~(1 << Cfg_REG_ADON))

#define __ADC_REG_ON()  (MDR_ADC->ADC1_CFG |= (1 << Cfg_REG_GO))
#define __ADC_REG_OFF() (MDR_ADC->ADC1_CFG &= ~(1 << Cfg_REG_GO))

// Настройка порта ввода-вывода --------------------------------------------//
  PORT_InitTypeDef PortInitStructure;

  PORT_StructInit(&PortInitStructure);
  PortInitStructure.PORT_PULL_UP = PORT_PULL_UP_OFF;
  PortInitStructure.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
  PortInitStructure.PORT_FUNC = PORT_FUNC_PORT;
  PortInitStructure.PORT_SPEED = PORT_SPEED_FAST;
  PortInitStructure.PORT_MODE = PORT_MODE_ANALOG;
  PortInitStructure.PORT_OE = PORT_OE_IN;
  PortInitStructure.PORT_Pin = ADC_PINS;
  PORT_Init(ADC_PORT, &PortInitStructure);
 
 
  MDR_RST_CLK->PER_CLOCK |= (1 << ADC_PCLK); // Разрешить тактирование ADC
 
  /* Настройка ADC1 */
  __ADC_REG_OFF();                            // Остановить преобразование
  __ADC_OFF();                                // Выключить АЦП
 
  MDR_ADC->ADC1_CFG = (0 << Cfg_REG_CLKS) |   // Тактирование с CPU_CLK
                      (1 << Cfg_REG_SAMPLE) | // Непрерывное преобразование
                      (0 << Cfg_REG_CHS) |    // Перебираются несколько каналов
                      (1 << Cfg_REG_CHCH) |   // Перебор каналов включен
                      (0 << Cfg_REG_RNGC) |   // Контроль уровней выключен
                      (0 << Cfg_REG_M_REF) |  // Внутренний ИОН (AUcc)
                      (10 << Cfg_REG_DIVCLK) | // Делить частоту на 512
                      (0 << Cfg_Cync_Conv) |  // Независимые АЦП
                      (0 << TS_EN) |          // Термодатчик и датчик ИОН включены
                      (0 << TS_BUF_EN) |      // Выходной усилитель датчиков выключен
                      (0 << SEL_TS) |         // Выход датчика температуры отключен
                      (0 << SEL_VREF) |       // Выход датчика ИОН отключен
                      (8 << TRIM) |           // Подстройка ИОН
                      (7 << Delay_Go) |       // Задержка старта 7 тактов
                      (0 << Delay_ADC);       // Задержка старта 1 такт
 
  MDR_ADC->ADC2_CFG = (0 << Cfg_REG_CLKS) |   // Тактирование с CPU_CLK
                      (1 << Cfg_REG_SAMPLE) | // Непрерывное преобразование
                      (0 << Cfg_REG_CHS) |    // Не подключать канал
                      (0 << Cfg_REG_CHCH) |   // Перебор каналов выключен
                      (0 << Cfg_REG_RNGC) |   // Контроль уровней выключен
                      (0 << Cfg_REG_M_REF) |  // Внутренний ИОН (AUcc)
                      (10 << Cfg_REG_DIVCLK) | // Делить частоту на 512
                      (0 << ADC1_OP) |        // Внутренний ИОН АЦП1
                      (0 << ADC2_OP) |        // Внутренний ИОН АЦП2
                      (7 << Delay_Go);        // Задержка перебора каналов 7 тактов
   
  MDR_ADC->ADC1_CHSEL = 0x7E; // Перебирать 6 каналов (1..6)
 
  MDR_ADC->ADC1_STATUS |= (1 << EOCIF_IE); // Разрешить прерывание по окончанию преобразования
  NVIC_EnableIRQ(ADC_IRQn);
 
  __ADC_ON();                                   // Включить АЦП
  __ADC_REG_ON();                               // Запустить преобразование
Закрыть


Открыть Код обработчика прерывания
Код:
void ADC_IRQHandler(void)
{
  if (MDR_ADC->ADC1_STATUS & (1 << FLG_REG_EOCIF))
  {
    uint16_t channelNum = (MDR_ADC->ADC1_RESULT & 0x0FFF0000) >> 16;
    uint16_t result = MDR_ADC->ADC1_RESULT & 0x00000FFF;
    ADCTask(channelNum, result);
  }
}
Закрыть


Внутри функции ADCTask поставил условие на равенство channelNum нулю или семи, и в нем брейкпоинт. Выполнение останавливается на этом месте один раз и больше туда не попадает. В принципе, проблема решилась этим самым условием, но все же интересно, почему так может происходить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-сен-06 16:17 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 44
Откуда: ПКК "Миландр"
По описанию не вполне понятно в чем состоит проблема и как она разрешилась.
Вышлите проект на support@milandr.ru, попробуем запустить на демо плате и разобраться.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB