|
|
  |
ADC AT91SAM7S256, Вопросы |
|
|
|
Aug 29 2012, 17:54
|

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

|
Запускаю АЦП  . Сделал программный старт с программным ожиданием конца завершения. Работает  . Пытаюсь сделать то же самое, но с прерыванием от АЦП - глухо  , прерывания нету. Может где-то с инициализацией намутил, не знаю. CODE //------------------------------------------------------------------------------ /// Interrupt handler for the ADC. Signals that the conversion is finished by /// setting a flag variable. //------------------------------------------------------------------------------ void ADCC0_IrqHandler(void) { dword status; // SR reg status = ADC_GetStatus(AT91C_BASE_ADC);
// Switch LED LED_Toggle(0); if (ADC_IsChannelInterruptStatusSet(status, ADC_CHANNEL)) { conversionDone = 1; } // if } // ADCC0_IrqHandler
//------------------------------------------------------------------------------ /// Configure the ADC //------------------------------------------------------------------------------ void ConfigureAdc(void) { dword shtim, startup, prescal, trgSel; dword intMode; AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_ADC); // разрешить тактовую для ADC AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST; // reset ADC
// TRGSEL==0 - запуск по нарастанию TIOA0 (TC0) // TRGEN==1 - разрешить hw triggers // LOWRES==1 - 8-бит режим // SLEEP==0 - Normal mode // SHTIM==2 - Tracking time = (SHTIM + 1) / ADCclock = 3/48MHz=0.0625mks // PRESCAL==2 - ADCclock = MCK / [(PRESCAL + 1)*2] = 48MHz/((2+1)*2) = 48/6=8MHz // STARTUP==0x0F - Startup Time = [(STARTUP + 1)*8] / ADCclock = ((15+1)*8)/48MHz = 16*8/48=2.67 mks shtim=2; startup=0x0F; prescal=0x02; trgSel=0; ADC_CfgModeReg (AT91C_BASE_ADC, (shtim << 24) | (startup << 16) | (prescal << 8) | (AT91C_ADC_SLEEP_NORMAL_MODE << 5) | (AT91C_ADC_LOWRES_10_BIT <<4) | (trgSel << 1) | AT91C_ADC_TRGEN_DIS); // Включить канал 7 // set ADC_CHER ADC_EnableChannel ( AT91C_BASE_ADC, ADC_CHANNEL ); // Разрешить прерывание в самом ADC // set ADC_IER ADC_EnableIt(AT91C_BASE_ADC, 1<<ADC_CHANNEL);
// Установка прерывания // intMode -> AIC_SMR - intMode=AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL; IRQ_ConfigureIT(AT91C_ID_ADC, intMode, ADCC0_IrqHandler); // Set AIC_IECR IRQ_EnableIT(AT91C_ID_ADC); } // ConfigureAdc
В прерывании переключается светодиодик. Но он молчит. Хотя в других местах он срабатывает. Подскажите кто может. Полный проект под ИАР прикладываю. Спасибо.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Aug 30 2012, 06:42
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040

|
По поводу AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_ADC); // разрешить тактовую для ADCиз даташита 36.4.1 Power Management The ADC Controller clock (MCK) is always clocked.Далее по таймингам Это вроде неправильно SHTIM==2 - Tracking time = (SHTIM + 1) / ADCclock = 3/48MHz=0.0625mksДаташит: • SHTIM: Sample & Hold Time Sample & Hold Time = SHTIM/ADCClockSHT = 2 / 8MHz = 250 нс, минимальное Sample & Hold Time опять же по даташиту = 600 нс Со Start Up Time та же ботва, там в формуле ADCClock, а у Вас в расчётах MCK  Не уверен, что достаточно просто объявить функцию, чтобы она при выходе правильно вернулась из режима IRQ, хотя с IAR не работал void ADCC0_IrqHandler(void)Попробуйте инициализацию "ручками", что-то вроде: AT91C_BASE_ADC->ADC_MR = 0x080F0200; AT91C_BASE_ADC->ADC_CHDR = 0xFF; AT91C_BASE_ADC->ADC_CHER = 1 << 7; AT91C_BASE_ADC->ADC_IER = 1 << 7; AT91C_BASE_AIC->AIC_SMR4 = 6; AT91C_BASE_AIC->AIC_SVR4 = ADCC0_IrqHandler; AT91C_BASE_AIC->AIC_IECR = 1 << 4;
|
|
|
|
|
Aug 30 2012, 18:42
|

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

|
RabidRabbit, да, похоже, виновата была та ошибка в расчётах. Зеванул я  Поменял, пошло. Инициализация, хоть ручками, хоть через иаровские функции - всё равно. Они делают то же самое  . Теперь возьмусь за автозапуск по таймеру  . PS. Может кто скажет - SAMBA правда всего 100 раз работает?
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Aug 31 2012, 05:30
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(hd44780 @ Aug 30 2012, 22:42)  PS. Может кто скажет - SAMBA правда всего 100 раз работает? Откуда дровишки? GPNVM - давно уже исправили количество циклов перезаписи и Sam-ba то тут причем?
|
|
|
|
|
Aug 31 2012, 07:59
|

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

|
Цитата(DmitryM @ Aug 31 2012, 08:30)  Откуда дровишки? GPNVM - давно уже исправили количество циклов перезаписи и Sam-ba то тут причем? Дровишки фирмовые, с сайта атмел. Те, что идут в комплекте с прогой самбы. Проблем (тьфу-тьфу) с ними у меня пока не наблюдалось GPNVM биты меня на текущем этапе совершенно не волнуют, но я тут не раз читал (например - http://electronix.ru/forum/index.php?showtopic=81665 ), что самба переписывается во флэш всего 100 раз. Я перепрошил её уже наверное раз 30 (точно не считал). По ходу ещё вопрос - прога самбы всё время спрашивает про lock/unlock сектора 0. Что будет, если ему lock не сделать, как она предлагает? Сам ещё не пытался, т.к. у меня ещё по основным вещам некоторая кашица в голове  . JTAG вигглера пока валяется недоделанный в ящике, необходимости во внутрисхемной отладке пока не ощутил  . Поэтому по ходу и спросил. Загрузкой в RAM пока не баловался, не знаю, пойдёт-не пойдёт. Может они уже этти баги и исправили, но микросхема у меня древняя, ревизия А, 2006 года выпуска. Просто 6 лет в коробке провалялась  . Забыл я о ней .... По основной теме. Цитата(RabidRabbit @ Aug 31 2012, 09:21)  Работает отлично, ещё можно DMA зацепить, настраивается очень просто. Вот функции для настройки лично мне изучать лень, ведь даташит всё равно читать  Пример у меня есть - какая-то осциллографическая приставка на USB, там по таймеру старт идёт и программный опрос конца преобразования. DMA, т.е. PDC я ещё не изучал, но мне наверное не понадобится. Вообще моя цель - стерео FFT анализатор (может ещё осциллограмму некую рисовать) для звука. Т.е. мне надо будет цифровать по очереди два канала АЦП - таймер где-то на 22-24 кГц уже получился  . А умеет ли PDC сам переключать ему каналы я пока не знаю. 2 канала разом цифровать вроде нельзя - АЦП то один ... Пока планирую по таймеру запускать преобразование, в прерывании выгребать результат в буфер и перещёлкивать канал. Если можно решить это получше, буд рад любым советам. Дисплей графический есть. Я с ним на авре уже вроде освоился. Спасибо.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Aug 31 2012, 09:28
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(hd44780 @ Aug 31 2012, 11:59)  GPNVM биты меня на текущем этапе совершенно не волнуют Ограничение в 100 циклов перезаписи касалось только GPNVM, Lock-bits and Security. К Sam-ba отношения не имеют, но сами понимаете, если Sam-ba не сможет снять Lock с флэш, то и записать не сможет. В новых кристалах это уже исправлено, в Вашем нужно смотреть errata. Цитата По ходу ещё вопрос - прога самбы всё время спрашивает про lock/unlock сектора 0. Что будет, если ему lock не сделать, как она предлагает? Да не закрывайте флеш, если Вам не надо, это ж биты защиты от перезаписи.
|
|
|
|
|
Aug 31 2012, 09:49
|

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

|
Цитата(DmitryM @ Aug 31 2012, 12:28)  Ограничение в 100 циклов перезаписи касалось только GPNVM, Lock-bits and Security. К Sam-ba отношения не имеют, но сами понимаете, если Sam-ba не сможет снять Lock с флэш, то и записать не сможет. В новых кристалах это уже исправлено, в Вашем нужно смотреть errata. Понял, спасибо. В моём полный комплект этих глюков Цитата(DmitryM @ Aug 31 2012, 12:28)  Да не закрывайте флеш, если Вам не надо, это ж биты защиты от перезаписи. Ясно. Сегодня вечером попробую не лочить его. Вообще радует, что меня эти 100 раз вроде не касаются  .
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Aug 31 2012, 10:49
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040

|
Цитата(hd44780 @ Aug 31 2012, 11:59)  Вообще моя цель - стерео FFT анализатор (может ещё осциллограмму некую рисовать) для звука. Т.е. мне надо будет цифровать по очереди два канала АЦП - таймер где-то на 22-24 кГц уже получился  . А умеет ли PDC сам переключать ему каналы я пока не знаю. 2 канала разом цифровать вроде нельзя - АЦП то один ... Пока планирую по таймеру запускать преобразование, в прерывании выгребать результат в буфер и перещёлкивать канал. Если можно решить это получше, буд рад любым советам. Согласно даташиту после каждого запуска АЦП по очереди оцифровывает сигналы тех каналов, для которых стоят "галочки" в ADC_CHER, поэтому в случае нескольких каналов, по-моему, будет удобно использовать ДМА, тем более что для FFT вроде понадобится больше одного сэмпла на канал.
|
|
|
|
|
Aug 31 2012, 14:31
|

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

|
Цитата(RabidRabbit @ Aug 31 2012, 13:49)  для FFT вроде понадобится больше одного сэмпла на канал. Да, там вроде 2 кила на канал надо. Я когда-то на компе, на C# делал, гляну, вспомню. Потом с DMA поиграюсь. АЦП с автозапуском от таймера заработал, но я ещё не понял, как там частоту запусков задавать  .
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Sep 1 2012, 19:05
|

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

|
Цитата(DmitryM @ Sep 1 2012, 10:56)  Ну как сказать не касаются, если бы Вы работали (шили) через jtag не затрагивая Lock-bits, то да, а активируя каждый раз вывод ERASE & TST Lock-bits модифицируются. Sam-ba не просто так спрашивает Unlock flash. Спасибо. Если сдохнет, допаяю этот виглер  .. Цитата(RabidRabbit @ Sep 1 2012, 19:46)  Ну как же - один пинок от таймера - один запуск АЦП, за один запуск будет последовательно выполнено столько преобразований, сколько битов установлено в ADC_CHER. Ну, во всяком случае это я так даташит понимаю, несколько каналов оцифровывать не было необходимости  Спасибо. Частоту я вроде нашёл задавать как - http://electronix.ru/forum/index.php?showtopic=99786Завтра проверю и дисплеем займусь.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|