Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADC AT91SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
hd44780
Запускаю АЦП sm.gif .
Сделал программный старт с программным ожиданием конца завершения. Работает sm.gif .
Пытаюсь сделать то же самое, но с прерыванием от АЦП - глухо sad.gif , прерывания нету. Может где-то с инициализацией намутил, не знаю.

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


В прерывании переключается светодиодик. Но он молчит.
Хотя в других местах он срабатывает.

Подскажите кто может. Полный проект под ИАР прикладываю.

Спасибо.
Genadi Zawidowski
Вот тут лежит проект (на который я уже раз сто показываю по разным поводам), где сделан программный запуск АЦП с AT91SAM7S и считывание по одному результату в прерываниях от АЦП (аналог атмеги такой). Там же и под ATSAM3S4 и разные варианты атмег. GCC. Файл hardware.c
RabidRabbit
По поводу
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/ADCClock

SHT = 2 / 8MHz = 250 нс, минимальное Sample & Hold Time опять же по даташиту = 600 нс
Со Start Up Time та же ботва, там в формуле ADCClock, а у Вас в расчётах MCK sm.gif

Не уверен, что достаточно просто объявить функцию, чтобы она при выходе правильно вернулась из режима IRQ, хотя с IAR не работал sm.gif
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;
hd44780
RabidRabbit, да, похоже, виновата была та ошибка в расчётах. Зеванул я sm.gif Поменял, пошло.
Инициализация, хоть ручками, хоть через иаровские функции - всё равно. Они делают то же самое sm.gif .

Теперь возьмусь за автозапуск по таймеру sm.gif .

PS.
Может кто скажет - SAMBA правда всего 100 раз работает?
DmitryM
Цитата(hd44780 @ Aug 30 2012, 22:42) *
PS.
Может кто скажет - SAMBA правда всего 100 раз работает?

Откуда дровишки?
GPNVM - давно уже исправили количество циклов перезаписи и Sam-ba то тут причем?
RabidRabbit
Цитата(hd44780 @ Aug 30 2012, 22:42) *
Теперь возьмусь за автозапуск по таймеру sm.gif .

Работает отлично, ещё можно DMA зацепить, настраивается очень просто.
Вот функции для настройки лично мне изучать лень, ведь даташит всё равно читать sm.gif
hd44780
Цитата(DmitryM @ Aug 31 2012, 08:30) *
Откуда дровишки?
GPNVM - давно уже исправили количество циклов перезаписи и Sam-ba то тут причем?


Дровишки фирмовые, с сайта атмел. Те, что идут в комплекте с прогой самбы. Проблем (тьфу-тьфу) с ними у меня пока не наблюдалось rolleyes.gif

GPNVM биты меня на текущем этапе совершенно не волнуют, но я тут не раз читал (например - http://electronix.ru/forum/index.php?showtopic=81665 ), что самба переписывается во флэш всего 100 раз. Я перепрошил её уже наверное раз 30 (точно не считал).
По ходу ещё вопрос - прога самбы всё время спрашивает про lock/unlock сектора 0. Что будет, если ему lock не сделать, как она предлагает? Сам ещё не пытался, т.к. у меня ещё по основным вещам некоторая кашица в голове rolleyes.gif .

JTAG вигглера пока валяется недоделанный в ящике, необходимости во внутрисхемной отладке пока не ощутил biggrin.gif .
Поэтому по ходу и спросил. Загрузкой в RAM пока не баловался, не знаю, пойдёт-не пойдёт.
Может они уже этти баги и исправили, но микросхема у меня древняя, ревизия А, 2006 года выпуска. Просто 6 лет в коробке провалялась biggrin.gif . Забыл я о ней ....

По основной теме.

Цитата(RabidRabbit @ Aug 31 2012, 09:21) *
Работает отлично, ещё можно DMA зацепить, настраивается очень просто.
Вот функции для настройки лично мне изучать лень, ведь даташит всё равно читать sm.gif

Пример у меня есть - какая-то осциллографическая приставка на USB, там по таймеру старт идёт и программный опрос конца преобразования.
DMA, т.е. PDC я ещё не изучал, но мне наверное не понадобится.
Вообще моя цель - стерео FFT анализатор (может ещё осциллограмму некую рисовать) для звука. Т.е. мне надо будет цифровать по очереди два канала АЦП - таймер где-то на 22-24 кГц уже получился sm.gif . А умеет ли PDC сам переключать ему каналы я пока не знаю.
2 канала разом цифровать вроде нельзя - АЦП то один ...
Пока планирую по таймеру запускать преобразование, в прерывании выгребать результат в буфер и перещёлкивать канал.

Если можно решить это получше, буд рад любым советам.

Дисплей графический есть. Я с ним на авре уже вроде освоился.

Спасибо.
DmitryM
Цитата(hd44780 @ Aug 31 2012, 11:59) *
GPNVM биты меня на текущем этапе совершенно не волнуют

Ограничение в 100 циклов перезаписи касалось только GPNVM, Lock-bits and Security. К Sam-ba отношения не имеют, но сами понимаете, если Sam-ba не сможет снять Lock с флэш, то и записать не сможет. В новых кристалах это уже исправлено, в Вашем нужно смотреть errata.
Цитата
По ходу ещё вопрос - прога самбы всё время спрашивает про lock/unlock сектора 0. Что будет, если ему lock не сделать, как она предлагает?

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


Понял, спасибо. В моём полный комплект этих глюков biggrin.gif

Цитата(DmitryM @ Aug 31 2012, 12:28) *
Да не закрывайте флеш, если Вам не надо, это ж биты защиты от перезаписи.


Ясно. Сегодня вечером попробую не лочить его.

Вообще радует, что меня эти 100 раз вроде не касаются biggrin.gif .
RabidRabbit
Цитата(hd44780 @ Aug 31 2012, 11:59) *
Вообще моя цель - стерео FFT анализатор (может ещё осциллограмму некую рисовать) для звука. Т.е. мне надо будет цифровать по очереди два канала АЦП - таймер где-то на 22-24 кГц уже получился sm.gif . А умеет ли PDC сам переключать ему каналы я пока не знаю.
2 канала разом цифровать вроде нельзя - АЦП то один ...
Пока планирую по таймеру запускать преобразование, в прерывании выгребать результат в буфер и перещёлкивать канал.

Если можно решить это получше, буд рад любым советам.

Согласно даташиту после каждого запуска АЦП по очереди оцифровывает сигналы тех каналов, для которых стоят "галочки" в ADC_CHER, поэтому в случае нескольких каналов, по-моему, будет удобно использовать ДМА, тем более что для FFT вроде понадобится больше одного сэмпла на канал.
hd44780
Цитата(RabidRabbit @ Aug 31 2012, 13:49) *
для FFT вроде понадобится больше одного сэмпла на канал.


Да, там вроде 2 кила на канал надо. Я когда-то на компе, на C# делал, гляну, вспомню.
Потом с DMA поиграюсь.

АЦП с автозапуском от таймера заработал, но я ещё не понял, как там частоту запусков задавать sad.gif .
DmitryM
Цитата(hd44780 @ Aug 31 2012, 13:49) *
Вообще радует, что меня эти 100 раз вроде не касаются biggrin.gif .

Ну как сказать не касаются, если бы Вы работали (шили) через jtag не затрагивая Lock-bits, то да, а активируя каждый раз вывод ERASE & TST Lock-bits модифицируются. Sam-ba не просто так спрашивает Unlock flash.
RabidRabbit
Цитата(hd44780 @ Aug 31 2012, 18:31) *
АЦП с автозапуском от таймера заработал, но я ещё не понял, как там частоту запусков задавать sad.gif .

Ну как же - один пинок от таймера - один запуск АЦП, за один запуск будет последовательно выполнено столько преобразований, сколько битов установлено в ADC_CHER. Ну, во всяком случае это я так даташит понимаю, несколько каналов оцифровывать не было необходимости sm.gif
hd44780
Цитата(DmitryM @ Sep 1 2012, 10:56) *
Ну как сказать не касаются, если бы Вы работали (шили) через jtag не затрагивая Lock-bits, то да, а активируя каждый раз вывод ERASE & TST Lock-bits модифицируются. Sam-ba не просто так спрашивает Unlock flash.

Спасибо. Если сдохнет, допаяю этот виглер rolleyes.gif ..

Цитата(RabidRabbit @ Sep 1 2012, 19:46) *
Ну как же - один пинок от таймера - один запуск АЦП, за один запуск будет последовательно выполнено столько преобразований, сколько битов установлено в ADC_CHER. Ну, во всяком случае это я так даташит понимаю, несколько каналов оцифровывать не было необходимости sm.gif


Спасибо. Частоту я вроде нашёл задавать как - http://electronix.ru/forum/index.php?showtopic=99786
Завтра проверю и дисплеем займусь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.