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

 
 
> LPC2478. Запуск АЦП по таймеру. Перенёс из В помощь начинающему
Oleg_IT
сообщение Jan 19 2014, 17:54
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



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

Код
    T1MCR = (3 << 0);
    T1MR0 = TCNT - 1;
    T1TCR = 1;

Для АЦП

Код
    PINSEL3 |= (3 << 26);
    T0MCR = (1 << 4);  // MR1: Reset
    T0MR1 = 0x00100000;
    T0EMR = (1 << 1) |     // MAT0.1  P1[29]
                     (3 << 6);      //
    T0TCR = 1;

На выходе P1.29 имею меандр, частота управляется (T0MR1).

Инициализирую АЦП, взято из примера

Код
    PCONP |= (1 << 12);
    AD0CR = ( 0x01 << 0 ) |     /* SEL=1,select channel 0~7 on ADC0 */
        ( ( Fpclk / ADC_Clk - 1 ) << 8 ) |  /* CLKDIV = Fpclk / 4000000 - 1 */
        ( 1 << 16 ) |         /* BURST = 1, BURST */
        ( 0 << 17 ) |          /* CLKS = 0, 11 clocks/10 bits */
        ( 1 << 21 ) |          /* PDN = 1, normal operation */
        ( 0 << 22 ) |          /* TEST1:0 = 00 */
        ( 4 << 24 ) |          /* MAT0.1 */
        ( 1 << 27 );        /* EDGE = 1 */

    /* If POLLING, no need to do the following */
    AD0INTEN = 0x1FF;        /* Enable interrupts */
    install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY );


Процедура прерывания АЦП, взято из примера

Код
__irq void ADC0 (void) {

    IENABLE;            /* handles nested interrupt */

    val = AD0DR0;                           // Read A/D Data Register
    SendBuff[NumSBuff][cnt] = ((val >> 5) & 0x3FF);          // Extract AD00 Value
    cnt++;
    if (cnt == SENDLEN)
    {
        cnt = 0;
        BuffFull = 1;
        NumSBuff ^= 1;
    }
    IDISABLE;
    VICVectAddr = 0;
}


С АЦП данные идут правильные, проверил в отладчике.
BURST и нулём и единицей делал, запрещал MAT0.1 выходить наружу (PINSEL3 &=~ (3 << 26); ). Ни чего не помогает. Прерываний или вообще нет или они всё забивают.

Дайте пример правильной инициализации АЦП и таймера.

Ещё одно. Таймер для АЦП программирую для инверсии выхода T0EMR = (3 << 6);, следовательно, частота таймера должна быть в два раза больше необходимой частоты отсчёта, т.к. запуск АЦП программируется только на спад или фронт. А как программно изменить состояние MATx.x не знаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
Mihey_K
сообщение Jan 20 2014, 16:02
Сообщение #2


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

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



BURST = 0 точно надо сделать, т.к. запуск по таймеру, а не потоком

С примером завтра может получится

Почитайте эррату, страница 7, хотя запуска по MAT это не должно касаться


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 21 2014, 08:48
Сообщение #3


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Oleg_IT @ Jan 19 2014, 21:54) *
Ещё одно. Таймер для АЦП программирую для инверсии выхода T0EMR = (3 << 6);, следовательно, частота таймера должна быть в два раза больше необходимой частоты отсчёта, т.к. запуск АЦП программируется только на спад или фронт. А как программно изменить состояние MATx.x не знаю?


Простым изменением битов EMx, в данном случае - первого бита T0EMR.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jan 21 2014, 18:03
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата
С примером завтра может получится
Может получится с примером?

Цитата
Простым изменением битов EMx, в данном случае - первого бита T0EMR.
Спасибо, снять уровень получилось.

У меня какая-то общая проблема с прерываниями, включил прерывание от нулевого таймера и они всё забивают.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 21 2014, 18:11
Сообщение #5


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Oleg_IT @ Jan 21 2014, 22:03) *
включил прерывание от нулевого таймера и они всё забивают.

А Вы их чистите?

Да, и кстати зачем Вам вложенные прерывания? Кроме того Вы неправильно их используете! в ARM7 нельзя просто так разрешить вложенные прерывания, нужен или wrapper или указать компилятору (у IAR __nested)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jan 22 2014, 05:13
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата
Да, и кстати зачем Вам вложенные прерывания?
Не нужны они мне. Почти весь код беру из примеров, наверное пока не до конца со всем разобрался. Вот потому и прошу правильные примеры.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 22 2014, 05:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а по мануалу?
попасть в прерывание, снять флаг, обработать что-то выйти?
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jan 22 2014, 09:45
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата
попасть в прерывание, снять флаг, обработать что-то выйти?

Делаю для нулевого таймера (всё беру из примеров) T0IR = 1; VICVectAddr = 0; Или ещё что-то нужно? Обнулял конкретный номер прерывания VICVectAddrX = 0;, прерывание возникает только один раз.

Код
__irq void Timer0 (void) {
    T0IR = 1;
    T0EMR |= (1 << 1);     // MAT0.1  P1[29]
//   VICVectAddr4 = 0;
    VICVectAddr = 0;
}


Примерчик бы рабочий
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Jan 25 2014, 12:19
Сообщение #9


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

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



Пришлось доставать старую плату SK-MLPC2478. Ниже прикреплен рабочий тестовый пример под Keil для 3го канала АЦП с запуском по таймеру. Все работает, проверил.
Прикрепленные файлы
Прикрепленный файл  Demo.zip ( 38.6 килобайт ) Кол-во скачиваний: 10
 


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post

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

 


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


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