реклама на сайте
подробности

 
 
> ADC c PDC и программным запуском, sam7x
xelax
сообщение May 12 2008, 06:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Про работу АЦП c PDC в мануале честно говоря мало информации. Я посчитал, что настроив PDC и ADC на работу с ним и программно запустив первое преобразование, далее PDC самостоятельно запустит N преобразований, а затем дернет прерывание, о том что приёмный буфер полный.

На практике оказалось иначе. Стартую преобразование, оно происходит один раз, причём вижу, что результат сохранился в регистре, а в PDC значение N(количество преобразований), стало равно N-1.
Далее отпускаю программу поработать какое-то время, затем останавливаю и вижу что в регистрах картина не изменилась. Тот же самый результат преобразования, теже значения в регистрах PDC.
Проверял в связке sam7x-ek + arm-elf-gdb + sam-ice + eclipse.

Собственно вопросы:
1. Может ли вообще АЦП работать таким образом? И если может, то почему у меня не работает?
2. А если не может, то на кой ляд они прикрутили к АЦП контроллер доступа к памяти, в чём его глубокий смысл?

вот код работы с АЦП
Код
void adcHandler(void)
{  
  if (AT91C_BASE_ADC->ADC_SR & AT91C_ADC_RXBUFF)
  {       
     // Disable data ready Interrupt
     AT91C_BASE_ADC->ADC_IDR = AT91C_ADC_RXBUFF;
     // disables all channels  
     AT91C_BASE_ADC->ADC_CHDR = ALL_CHANNEL_DISABLE;          
     AdcInterrupt();
  }
}

/******************************************************************************
Inits the ADC.
******************************************************************************/
void  OpenAdc(AdcParams_t *param)
{    
  //enable the clock of ADC
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_ADC;
                
  // initialization adc
  // reset adc
  AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST;
  
  /* disable receiver PDC transfer requests */
  AT91C_BASE_ADC->ADC_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
  
  // Starting a conversion is only possible by software. 8-bit resolution mode.
  AT91C_BASE_ADC->ADC_MR = (uint32_t)sampleRate | AT91C_ADC_LOWRES;
  
  /* set pdc pointer and counter */
  AT91C_BASE_ADC->ADC_RCR = selectionsAmount;
  AT91C_BASE_ADC->ADC_RPR = bufferPointer;
      
  // disables all channels  
  AT91C_BASE_ADC->ADC_CHDR = ALL_CHANNEL_DISABLE;                                                                                                                                                                                                      
  // disable all adc interrupt                  
  AT91C_BASE_ADC->ADC_IDR = ALL_PERIPHERIAL_INTERRUPT_DISABLE;
              
  if (AT91C_BASE_AIC->AIC_SVR[AT91C_ID_ADC] != (uint32_t)adcHandler)
  {    /*first start*/                           
    /* Enable interrupts */
    /* Disable the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_ADC);
    /* Save the interrupt handler routine pointer and the interrupt priority */
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_ADC] = (uint32_t)adcHandler;
    /* Store the Source Mode Register */
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_ADC] = AT91C_AIC_SRCTYPE_HIGH_LEVEL |
    AT91C_AIC_PRIOR_LOWEST;
    /* Clear the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_ADC);  
    /* Enable the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_ADC);
  }                       
}

/******************************************************************************
Starts convertion on the ADC channel.
Parameters:
  channel - channel number.
******************************************************************************/
void StartAdc(AdcChannelNumber_t channel)
{
  // enable current channel
  AT91C_BASE_ADC->ADC_CHER = channel;  
  // enable receiver PDC transfer requests  
  AT91C_BASE_ADC->ADC_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN;
  // enable receiver buffer full interrupt                     
  AT91C_BASE_ADC->ADC_IER = AT91C_ADC_RXBUFF;        
  // Starts conversion
  AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение May 12 2008, 11:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Это понятно.

Только всё таки мне интересно, при программном старте измерения АЦП должен сам доизмерять оставшиеся разы или его нужно пинать каждый раз(таймером, внешним триггером, программой).
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 12 2008, 12:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(xelax @ May 12 2008, 19:08) *
пару недель назад тоже пинал АЦП. Хотелось, чтоб через ДМА АЦП сам загонял несколько измерений в буфер. Так ничего и не получилось. В итоге отказался от этой затеи и от прерываний от АЦП тоже. От ДМА у меня один плюс - не надо считывать каждый раз его регистр данных. В начале цикла измерений задаю адрес и размер буфера. Через нужные периоды времени пинаю АЦП

Запускаю АЦП из задачи.


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- xelax   ADC c PDC и программным запуском   May 12 2008, 06:49
- - _dem   Можно "клокить" ADC от таймеров. Пример...   May 12 2008, 09:22
- - _dem   Вы либо пинаете его программно (на одно преобразов...   May 12 2008, 12:22
- - xelax   Наверное примерно также и прийдётся сделать. По п...   May 12 2008, 12:59
- - _dem   Да елки-палки все работает нормально, автоматичес...   May 12 2008, 13:21
|- - prottoss   Цитата(_dem @ May 12 2008, 21:21) вот это...   May 12 2008, 13:32
- - _dem   Вечером ткну Сейчас на работе, занят. Курим пока...   May 12 2008, 14:22
|- - prottoss   Цитата(_dem @ May 12 2008, 22:22) Вечером...   May 12 2008, 14:41
- - _dem   Понятно. Из вашего сообщения "пару недель на...   May 12 2008, 14:53
|- - prottoss   Цитата(_dem @ May 12 2008, 22:53) Из ваше...   May 12 2008, 15:23
|- - xelax   2 _dem Где же обещанный пример без таймера, где ...   May 13 2008, 05:27
- - defunct   В атаче выдранные исходники из рабочего проекта. П...   May 12 2008, 16:21
- - _dem   А кто обещал пример без таймера 8( ??? Нет пока во...   May 13 2008, 08:34
- - xelax   Я думал у Вас без таймера работает, а с таймером и...   May 13 2008, 10:22
- - nicks80   Вот как надо и все работает непрерывно в два буффе...   Jun 9 2008, 21:18
- - aaarrr   Цитата(nicks80 @ Jun 10 2008, 01:18) Вот ...   Jun 9 2008, 21:37
- - nicks80   Цитата(aaarrr @ Jun 10 2008, 00:37) Нет, ...   Jun 9 2008, 22:19


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 23:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01263 секунд с 7
ELECTRONIX ©2004-2016