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

 
 
> FIQ на таймер, как сконфигурировать
bullit
сообщение May 19 2009, 13:34
Сообщение #1


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Доброго времени суток!

Стоит задача: необходимо каждые 2 мкс, опрашивать АЦП. И так в течении 2 милисек. Т.е. сделать 1000 отсчетов.
Исходные данные: LPC2194, компилятор IAR, 60 МГц.
Ввиду того, что других прерываний воопче нет, поставил на обработчик прерываний таймера FIQ опрос АЦП. Но опрос происходит всего один раз, при запуске программы.
Как мне настроить прерывания на FIQ от таймера? И как реализовать опрос 1000 раз?-Так как после оцифровки мне нужно обработать данные.
Сейчас я в программе обработки прерывания, поставил счетчик и просто слежу за ним.
И как отследить окончание оцифровки в основной программе?

Интересует именно код....

Заранее большое спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bullit
сообщение May 19 2009, 16:36
Сообщение #2


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Во время опроса АЦП, мк не выполняет ни каких операций - только работа на прерывания.
Да забыл уточнить - опрос не встроенного АЦП, а внешнего.
CODE
void ReadADC(void)
{
u8 mb;
u8 sb;
u8 *ptr1 = (u8 *)&data[0];
u8 *ptr2 = (u8 *)&data2[0];
for (u16 i = 0; i<=999; i++) {
CONV_START
READ_LOWBYTE1
READ_LOWBYTE2
CONV_STOP
while(BUSY_ADC1 == 1){}; //Ждем Busy
// Чтение с первого канала
START_READ1
START_READ1
mb = FIO0PIN0;
*ptr1++ = (mb);
READ_HIGHBYTE1
START_READ1
sb = FIO0PIN0;
*ptr1++ = (sb);
STOP_READ1
// Чтение со второго канала
START_READ2
mb = FIO0PIN0;
*ptr2++ = (mb);//& 0xff
READ_HIGHBYTE2
sb = FIO0PIN0;
*ptr2++ = (sb);
STOP_READ2
}// конец for
CONV_STOP
}


Вот этот for и вставлен в прерывание (точнее его содержимое), а затем if-ом проверяю счетчик (думается самое слабое место)... остальные переменные объявленны как глобальные....
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 19 2009, 18:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(bullit @ May 19 2009, 19:36) *
Вот этот for и вставлен в прерывание (точнее его содержимое), а затем if-ом проверяю счетчик (думается самое слабое место)... остальные переменные объявленны как глобальные....

Как то у вас всё сумбурно получается.
Из первого поста можно понять, что вы каждый опрос ацп пытаетесь запустить от таймера. При этом сам цикл измерения составляет 2 мкс.
В приведенной цитате вы пишите о том, что вы в обработчик запихиваете for с опросом 990 раз. Причём в каждом опросе вы минимум 3 раза читаете порт. Предполагаю, что минимум 2 раза в него пишите чтобы запустить преобразование. (Предполагаю, так как не вижу раскрытых макросов).
То есть само прерывание у вас довольно громоздко.

Тем не менее сам принцип я попробую описать.
У меня это выглядит так.
Инициализация

// Если мастер, то регенерация экрана осуществляется по таймеру
T0IR = (uint32_t)-1; // сбросить флаги прерываний
T0TCR = (1<<1)|(1<<0); // разрешить работу таймера
T0TCR = (1<<0); // разрешить работу таймера
T0PR = 0; // прескалер = 1

T0MR0 = PCLK / (FREGENER*8*7); // Частота прерываний FREGENER герц * 8 строк * 8 градаций яркости (-1)
T0MCR = (1<<1)|(1<<0); // режим перезагрузки и прерывание

вызов прерывания
__fiq __arm void FIQ_Handler() // Отображение картинки Master, Slave

завершение
T0IR = (unsigned)-1; // сбросить флаги прерываний таймера



Да забыл ещё в инициализации это
VICIntSelect = (1<<VIC_TIMER0); // Прерывание от таймера 0 = FIQ
VICIntEnable = (1<<VIC_TIMER0)|(1<<VIC_UART0); // Разрешить прерывание от таймера 0 и от USART0
Go to the top of the page
 
+Quote Post



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

 


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


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