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

 
 
> AT91SAM7S работа ADC совместно с PDC (прямой доступ к памяти)
kumle
сообщение Dec 7 2011, 12:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Очень плохо этот момент описан в даташите и примера в IAR как назло нет.
Пробовал сам сделать но не получилось. Может там есть какая то хитрость ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kumle
сообщение Dec 9 2011, 08:25
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Цитата
Так показывайте, будем искать ошибку.


Вот инициализация ADC, PDC и таймера

Код
//ADC init
  
  ADC_Initialize( AT91C_BASE_ADC,
                    AT91C_ID_ADC,
                    AT91C_ADC_TRGEN_EN,
                    AT91C_ADC_TRGSEL_TIOA0,
                    AT91C_ADC_SLEEP_NORMAL_MODE,
                    AT91C_ADC_LOWRES_10_BIT,
                    BOARD_MCK,
                    BOARD_ADC_FREQ,
                    10,
                    1200);
  ADC_EnableChannel(AT91C_BASE_ADC, ADC_NUM_3);
  
  IRQ_ConfigureIT(AT91C_ID_ADC, AT91C_AIC_PRIOR_LOWEST, ADCC0_IrqHandler);
  IRQ_EnableIT(AT91C_ID_ADC);

  
  //PDC init
  ADC_Ptr1 = ADC_Result;
  AT91C_BASE_ADC->ADC_PTCR = AT91C_PDC_RXTDIS;
  AT91C_BASE_ADC->ADC_RPR = (unsigned long)ADC_Ptr1; // Receive Pointer Register
  AT91C_BASE_ADC->ADC_RCR = 64; // Receive Counter Register
  //  Set receive pointer register for next transfer
  AT91C_BASE_ADC->ADC_RNPR = (unsigned long)ADC_Ptr1;
  //  Set receive counter register for next transfer
  AT91C_BASE_ADC->ADC_RNCR = 64;    
  
  
  AT91C_BASE_ADC->ADC_IER = AT91C_ADC_ENDRX; //enable interrupt on transfer complete
  AT91C_BASE_ADC->ADC_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTDIS; //ADC start


//timer init
TC_Configure( AT91C_BASE_TC0,
                    (AT91C_TC_ASWTRG_CLEAR | AT91C_TC_ACPC_CLEAR | AT91C_TC_ACPA_SET | AT91C_TC_LDRA_RISING |
                     AT91C_TC_WAVE  | AT91C_TC_WAVESEL_UP_AUTO | 0 ));

TC_Start(AT91C_BASE_TC0); //старт таймера



вот прерывание:

Код
void ADCC0_IrqHandler(void)
{
  unsigned int status, i;
  unsigned short* ADC_Ptr2;
  status = AT91C_BASE_ADC->ADC_SR;
  if (status & AT91C_ADC_ENDRX)
  {
    ADC_Ptr2 = ADC_Result;
    AT91C_BASE_ADC->ADC_RPR = (unsigned long) ADC_Ptr2; // Receive Pointer Register
    AT91C_BASE_ADC->ADC_RCR = AD_DATA_BUFFER_SIZE; // Receive Counter Register
    //AT91C_BASE_ADC->ADC_RNPR = (unsigned long)ADC_Ptr_Next; // Receive Next Pointer Register
    //AT91C_BASE_ADC->ADC_RNCR = AD_DATA_BUFFER_SIZE; // Receive Next Counter Register
    conv_done = 1;
  }
  else if((status & AT91C_ADC_ENDRX) == AT91C_ADC_ENDRX)
  {
    AT91C_BASE_ADC->ADC_RNCR = AD_DATA_BUFFER_SIZE;
  }
}


Цитата(Genadi Zawidowski @ Dec 8 2011, 11:09) *
Готовый проект возмите - там в файле hardware.c начиная с функции adc_initialize().

Спасибо буду смотреть и сравнитвать со своим, правда я делал с помощью
функций из папки at91lib, придется в них залесть
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:47
Рейтинг@Mail.ru


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