АЦП 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 для прерывания АЦП
и когда я использую LPC_ADC->ADGDR, все работает нормально
но когда я использую LPC_ADC->ADDR1 для чтения, он не работает и не меняется с краем MAT


person navid ansari    schedule 16.06.2015    source источник


Ответы (2)


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

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

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

person Turbo J    schedule 19.06.2015

Вы должны включить IRQ канала 1:

LPC_ADC->ADINTEN =  1 << 1;  //0x0002  
person rundekugel    schedule 03.09.2015