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

 
 
> ацп at91sam7s256
sergey sva
сообщение Jan 2 2009, 18:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Возникло несколько вопросов по поводу использования ацп с PDC.
Использую 4 канала ацп, один буфер, вопрос собственно в порядке записи
результатов измерения в буфер, результат измерения будет записываться сначала с
одного канала потом с другого, или сначала буфер заполнится с одного канала, после
будет прерывание по заполнению буфера?
Код
//------------------------------------------------------------
unsigned char ADCBUFER[4] = {0,0,0,0};

void InitADC(void){
p_PMC->PMC_PCER = BV(AT91C_ID_ADC);
/* razreshenie tactirovanija ADC  */
p_ADC->ADC_CR = AT91C_ADC_SWRST;
/* sbros ADC  */
p_ADC->ADC_CHER = AT91C_ADC_CH1 | AT91C_ADC_CH2 | AT91C_ADC_CH3 | AT91C_ADC_CH4;
/* razreshenie kanalov 1 2 3 4 */
p_ADC->ADC_MR = AT91C_ADC_LOWRES_10_BIT   |  ( (MCK/2/ADC_CLK - 1) << 8 )   |  (5 << 24);
/* razreshenie 8 ili 10 bit; chastota sinh ADC; wrema viborki hranenija;   */
p_AIC->AIC_SVR[AT91C_ID_ADC] = (unsigned long)Func_Irq_Adc;
/*  vector programm prer. ADC */
p_AIC->AIC_SMR[AT91C_ID_ADC] = 0x05;
/* prioritet prer. ot T0 0 7  */
p_AIC->AIC_IECR = BV(AT91C_ID_ADC);
/* razreshenie prer. ot ADC */
p_ADC->ADC_RPR = (unsigned long)(ADCBUFER);
/*  ukazatel na bufer priema */
p_ADC->ADC_RCR =  sizeof(ADCBUFER);
/* razmer bufera priema */
p_ADC->ADC_RNPR = 0;
/*  ukazatel na bufer 2 priema */
p_ADC->ADC_RNCR = 0;
/* razmer bufera 2 priema */
p_ADC->ADC_PTCR = AT91C_PDC_RXTEN;
/* razreshenie priema peredachi */
p_ADC->ADC_IER = AT91C_ADC_ENDRX; /*| AT91C_ADC_EOC3; */
/* Prerivanie po zapolneniu bufera */
// p_ADC->ADC_CR = AT91C_ADC_START;
}
//------------------------------------------------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Jan 3 2009, 07:05
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Как запретить все прерывния на время ?

В Svsr mode можно так:
Код
static __inline U32 __ILock(void)
{
    U32 r, iStatus;
     __asm { MRS iStatus, CPSR }
     __asm { ORR r, iStatus, #0xC0 }  // Disable FIQ + IRQ
     __asm { MSR CPSR_c, r}
     return iStatus;
}

static __inline void __IUnlock(U32 iStatus)
{
     __asm { MSR CPSR_c, iStatus}
}



В user mode можно так:
Код
static __inline U32 __ILock(void)
{
    U32 iMask = AT91C_AIC_IMR;
    AT91C_AIC_IDCR = 0xFFFFFFFF; // disable all interrupt sources
    return iMask;
}

static __inline void __IUnlock( U32 iMask)
{
    AT91C_AIC_IECR = iMask;  // restore interrupt sources
}



Пользовать и то и другое одинаково:
Код
{
    U32 iStatus = __ILock();
       ... тут прерывания запрещены
    __IUnlock( iStatus );
       ... тут восстановлены
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 15:15
Рейтинг@Mail.ru


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