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

 
 
> AT91SAM7xxxx, ADC, 2 канала и PDC
hd44780
сообщение Dec 10 2012, 13:17
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем.

AT91SAM7S256 цифрует стереозвук встроенным АЦП (ADC7-левый, ADC6-правый канал) и далее обрабатывает эти выборки. Выборки сейчас по 512 байт.

Сейчас сделано "как в AVR" - запуск АЦП по сигналу TIOA1 ~24kHz, съём данных в прерывании АЦП. Каналы АЦП переключаются в прерывании.

Код
// Прерывание АЦП - один из каналов завершил преобразование
void ADC_IrqHandler(void)
{
    dword status;
    word wValue;
    
    status = ADC_GetStatus(AT91C_BASE_ADC);
    
    if ( (status & (1<<ADC_CHANNEL_LEFT) ) !=0  )
    { // левый канал закончил преобразование
      wValue = AT91C_BASE_ADC->ADC_CDR7;

      // Включить правый канал
      ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_RIGHT );
      ADC_EnableIt ( AT91C_BASE_ADC, 1 << ADC_CHANNEL_RIGHT );
      
      adcDataLeft [ dataPosLeft ] = wValue >> 2;
      dataPosLeft ++;
      if ( dataPosLeft == ADC_DATA_SIZE )
      {
        // останов преобразований
        StopConversion ( );
        conversionDone = 1;
      } // if
    } // if
  
    if ( (status & (1<<ADC_CHANNEL_RIGHT) ) !=0  )
    { // правый канал закончил преобразование
      // AT91C_BASE_ADC->ADC_CDR6 - регистр канала
      wValue = AT91C_BASE_ADC->ADC_CDR6;

      // Включить левый канал
      ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_LEFT );
      ADC_EnableIt ( AT91C_BASE_ADC, 1 << ADC_CHANNEL_LEFT );
      
      adcDataRight [ dataPosRight ] = wValue >> 2;
      dataPosRight ++;
      if ( dataPosRight == ADC_DATA_SIZE )
      {
        // останов преобразований
        StopConversion ( );
        conversionDone = 1;
      } // if
    } // if
} // ADC_IrqHandler


Процесс начинается с левого канала:
ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_LEFT );
ADC_EnableIt ( AT91C_BASE_ADC, 1 << ADC_CHANNEL_LEFT );

Это работает нормально. Результирующая частота дискретизации получается, конечно, в 2 раза меньше, но я сейчас не об этом.

Я где-то на форумах читал, что если написать
ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL_LEFT | ADC_CHANNEL_RIGHT );
ADC_EnableIt ( AT91C_BASE_ADC, ( 1 << ADC_CHANNEL_LEFT ) | ( 1 << ADC_CHANNEL_RIGHT ) );
то он будет сам щёлкать каналы по очереди. Попробовал - не работает. Точнее сказать - работает только левый канал - ADC7. Условие для правого канала вообще никогда не срабатывает. Проверял по DBGU.
Может я неправильно включаю этот режим... Или чего-то недопонимаю...

Вопрос - может ли он сам переключать каналы? Ведь зачем-то в регистрах сделано по битику на канал (а на как в AVR-ах ADMUX=7 и 6 туда уже одновременно не запишешь)?

Вопрос особенно актуален, если задействовать PDC. Получать 512 байт сперва с одного, потом 512 с другого, да ещё и с задержками на перепрограммирование ADC/PDC - как-то "некошерно", необходима как можно большая синхронность в оцифровке каналов. А это - только оцифровка каналов по очереди.
Не считая установки 2-х независимых АЦП

Спасибо.

PS.
Замечания типа "Омар фигня, лобстер круче", где омар==AT91SAM7, лобстер==STM32 просьба не писать. Я прекрасно знаю, что в STM32 есть 2-3 независимых АЦП и прочие плюшки, но пока интересует исключительно AT91SAM7.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
hd44780
сообщение Dec 14 2012, 18:46
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Написал так:

1. Инициализация АЦП

Код
void ConfigureAdc(void)
{
  dword shtim, startup, prescal, trgSel;
    
  AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_ADC);    // разрешить тактовую для ADC
  AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST;            // reset ADC

  shtim=8;
  startup=0x0F;
  prescal=0x02;
  trgSel=1;     // Запуск по TIOA1 (TC1)

  ADC_CfgModeReg (AT91C_BASE_ADC, (shtim << 24) | (startup << 16) | (prescal << 8) |
                  AT91C_ADC_SLEEP_NORMAL_MODE | AT91C_ADC_LOWRES_8_BIT |
                  (trgSel << 1) | AT91C_ADC_TRGEN_EN);

  // выкл все каналы
  AT91C_BASE_ADC->ADC_CHDR = 0xFF;
  
  // Включить канал 6, 7
  AT91C_BASE_ADC->ADC_CHER = (1 << ADC_CHANNEL_LEFT) | (1 << ADC_CHANNEL_RIGHT);
  
  // Разрешить прерывания каналов 6 и 7 в ADC
  AT91C_BASE_ADC->ADC_IER = ( 1 << ADC_CHANNEL_LEFT ) | ( 1 << ADC_CHANNEL_RIGHT );

  // Установка прерывания ADC
  IRQ_ConfigureIT ( AT91C_ID_ADC, 6, ADC_IrqHandler );
  
  // Set AIC_IECR
  IRQ_EnableIT(AT91C_ID_ADC);
  
  ////////////////////////////////////////////////////////////////////////////////  
  // PDC
  //  Буфер данных
  AT91C_BASE_ADC->ADC_RPR = (dword)ADCbuf;
  AT91C_BASE_ADC->ADC_RNPR = (dword)ADCbuf;
  
  //  Set receive counter register (number of transfers)
  AT91C_BASE_ADC->ADC_RCR = sizeof ( ADCbuf );    
  AT91C_BASE_ADC->ADC_RNCR = sizeof ( ADCbuf );    

  // ENDRX - End of receive buffer interrupt enable (когда регистр ADC_RCR досигает нуля)
  AT91C_BASE_ADC->ADC_IER = AT91C_ADC_ENDRX;

  // Конфигурирование  TC1 на переключение TIOA1  23.81kHz
  ConfigureTc1 ( );
} // ConfigureAdc


Всё, что до комментария PDC - рабочее на 100%. Без PDC работает нормально.

2. Запуск:

Код
void StartConversion ( void )
{
  //  Буфер данных
  AT91C_BASE_ADC->ADC_RCR = sizeof ( ADCbuf );    
  AT91C_BASE_ADC->ADC_RNCR = sizeof ( ADCbuf );    

  //  Set receive counter register (number of transfers)
  AT91C_BASE_ADC->ADC_RCR = sizeof ( ADCbuf );    
  AT91C_BASE_ADC->ADC_RNCR = sizeof ( ADCbuf );    

  //  Enable PDC receiver requests, disable transmitter requests
  AT91C_BASE_ADC->ADC_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTDIS;
  
  // запуск ТС1
  AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG | AT91C_TC_CLKEN;
} // StartConversion


До PDC здесь был только запуск TC1.
Инициализация проходит нормально, а после вызова StartConversion всё наглухо виснет. Даже прерываний от АЦП нету.
Проверялось через DBGU.

В чём я ошибся?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hd44780   AT91SAM7xxxx, ADC, 2 канала и PDC   Dec 10 2012, 13:17
- - RabidRabbit   Цитата(hd44780 @ Dec 10 2012, 17:17) Я гд...   Dec 11 2012, 05:47
|- - hd44780   Цитата(RabidRabbit @ Dec 11 2012, 07:47) ...   Dec 11 2012, 07:32
- - hd44780   AT91C_BASE_ADC->ADC_CHER и AT91C_BASE_ADC->A...   Dec 11 2012, 18:08
- - RabidRabbit   Я думаю, с PDC разберётесь с полпинка, там всё про...   Dec 12 2012, 06:25
|- - hd44780   Цитата(RabidRabbit @ Dec 12 2012, 08:25) ...   Dec 12 2012, 07:03
- - Сергей Борщ   Когда будете работать с PDC обратите внимание на т...   Dec 12 2012, 07:24
|- - RabidRabbit   Цитата(Сергей Борщ @ Dec 12 2012, 11:24) ...   Dec 12 2012, 15:51
|- - Сергей Борщ   QUOTE (RabidRabbit @ Dec 12 2012, 17:51) ...   Dec 13 2012, 07:09
|- - RabidRabbit   Цитата(Сергей Борщ @ Dec 13 2012, 11:09) ...   Dec 14 2012, 07:28
|- - Сергей Борщ   QUOTE (RabidRabbit @ Dec 14 2012, 09:28) ...   Dec 14 2012, 09:59
- - hd44780   Спасибо, на будущее учту. Но пока преобразования ...   Dec 12 2012, 08:19
- - Jack_of_Shadows   ЦитатаТак вот, если вы будете перезаряжать PDC сли...   Dec 12 2012, 09:40
|- - Сергей Борщ   QUOTE (Jack_of_Shadows @ Dec 12 2012, 11...   Dec 12 2012, 14:30
- - Jack_of_Shadows   Во время стационарной работы конечно такое маловер...   Dec 13 2012, 08:06
- - hd44780   Jack_of_Shadows, а Вы не запускайте шарманку во вр...   Dec 13 2012, 09:39
- - Jack_of_Shadows   hd44780, сейчас то, когда я разобрался, именно так...   Dec 13 2012, 10:01
- - hd44780   Народ, я не понял, зачем регистры RNPR (Receive Ne...   Dec 14 2012, 12:21
|- - Сергей Борщ   QUOTE (hd44780 @ Dec 14 2012, 14:21) Наро...   Dec 14 2012, 13:10
- - hd44780   Спасибо, примерно понял, но хочу уточнить. Если я...   Dec 14 2012, 13:28
|- - Сергей Борщ   QUOTE (hd44780 @ Dec 14 2012, 15:28) мне ...   Dec 14 2012, 14:29
- - hd44780   Сергей Борщ, спасибо. Понял. Пошёл доделывать   Dec 14 2012, 15:02
|- - RabidRabbit   Я немного не понимаю, инициализация указателей для...   Dec 15 2012, 07:35
|- - hd44780   Цитата(RabidRabbit @ Dec 15 2012, 09:35) ...   Dec 15 2012, 09:02
- - RabidRabbit   Я бы убрал вот это // Разрешить прерывания каналов...   Dec 15 2012, 13:19
- - hd44780   Поправил. Прерывания каналов вырубил, добавил AT...   Dec 15 2012, 15:34
- - Jack_of_Shadows   hd44780, памяти для буфера ацп в куче точно хватае...   Dec 17 2012, 10:23
- - hd44780   Jack_of_Shadows, у меня кучи и динамического распр...   Dec 17 2012, 10:51


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

 


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


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