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

 
 
> 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



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

 


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


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