2015-06-16 2 views
0

это мой кодADC LPC1768 просто

#include "LPC17xx.h"     // Device header 
#include "GPIO_LPC17xx.h"    // Keil::Device:GPIO 
uint32_t voltag1 = 0 ; 
uint32_t voltag2 = 0 ; 
volatile uint32_t adstat; 
int blink=1; 
int main() 
{ 
    //Config timer 
    LPC_TIM1->MCR=2;       
    LPC_TIM1->MR0=20000000;     //Match Resgister 
    LPC_TIM1->TCR=1; 
    LPC_TIM1->EMR = 0x00000030 ; 

    //Config ADC 
    LPC_PINCON->PINSEL1 |= (1 << 14) | (1 << 16); // connect pin to ADC 
    LPC_SC->PCONP |= ((1 << 12));     //enable power of ADC 
    LPC_ADC->ADCR = 0x06202001;     //initialaze ADC 
    LPC_ADC->ADINTEN = 0x00000100;     // global interup  
    NVIC_EnableIRQ(ADC_IRQn); 
    GPIO_SetDir(3,25,GPIO_DIR_OUTPUT); 
    while(1) {} 
} 

void ADC_IRQHandler(void) 
{ 
    adstat = LPC_ADC->ADSTAT;  /* Read ADC clears interrupt */  
    blink++; 
    GPIO_PinWrite(3,25,blink%2); 
    voltag1 = (LPC_ADC->ADGDR >> 4) & 0xFFF; 
    //voltag2 = (LPC_ADC->ADDR1 >> 4) & 0xFFF; 
} 

когда я использую LPC_ADC-> ADGDR она работает нормально, но когда я использую LPC_ADC-> ADDR1 ее не работает, почему?
я использовал MAT для АЦП interup
и когда я использую LPC_ADC-> ADGDR все работает отлично
но когда я использую LPC_ADC-> ADDR1 для чтения ее не работает и не меняется с MAT края

ответ

0

Есть способ слишком много магических чисел в вашем коде. Пожалуйста, используйте соответствующие определения для всех этих бит. Этот код нечитабельно, как есть.

Существует неправильное комментарий в коде, флаг прерывания для ADGDR является не очищается от ADSTAT чтения. Только чтение ADGDR очищает его, и поэтому ваш код не работает с ADDR1.

Если вы использовали определение для установки ADINTEN, возможно, вы заметили свою ошибку раньше. Этот флаг называется ADGDINTEN и соответствует знаку только в ADGDR.

0

Вы должны включить прерывание от ch1 по:

LPC_ADC->ADINTEN = 1 << 1; //0x0002 
Смежные вопросы