hbaocr
Full Member level 4
lpc2148 adc example
on my code propram loop forever at row which is bold below? Why my program do that when AD1GDR still display the result voltage on P0.6 and DONE bit on this register =1.
while((AD1DR0 & 0x80000000) == 0); // wait ADC convert complete
Code:
#include "LPC214x.H" // LPC2148 MPU Register
#include <stdio.h> // For Used Function printf
/* pototype section */
void init_serial0 (void); // Initil UART-0
int putchar (int ch); // Put Char to UART-0
int getchar (void); // Get Char From Uart-0
void delay(unsigned long int); // Delay Time Function
unsigned int val; // ADC Result (HEX)
float volt; // ADC Result Volt
int main(void)
{
init_serial0(); // Initial UART0 = 9600,N,8,1
printf("Input Voltage 0-3.3V to P0.6 For Test\n"); // Call prinff Function
// xxxx xxxx xxxx xxxx xx11 xxxx xxxx xxxx
PINSEL0 |= 0x00003000;// chon ADC1.0 Connect P0.6(pin30)
// Initial ADC8 (ADCR=0x01210601)
AD1CR &= 0x00000000;// reset all cotrol bit
AD1CR |= 0x00000001;// chon ADC1.0
AD1CR |= 0x00000600;// ADC Clock = VBP(PCLK) / 7
AD1CR |= 0x00010000;// Busrt = 1 cho phep lap lai convert A->D voi CLK adc da chon o tren
AD1CR &= 0xFFF1FFFF;// CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
AD1CR |= 0x00200000;// PDN = 1 cho phep ADC Module tich cuc
AD1CR &= 0xF7FFFFFF;// EDGE = 0 = Conversion on Falling Edge
// Start Test Read ADC8 and Display on UART0 //
while(1) // Loop Continue
{
AD1CR |= 0x01000000; //now start conversation
while((AD1DR0 & 0x80000000) == 0); // wait ADC convert complete
val = ((AD1DR0 >> 6) & 0x03FF);
printf("gia tri tra ve: %o",val);
}
}
/******************************/
/* Initial UART0 = 9600,N,8,1 */
/* VPB(pclk) = 60.00 MHz */
/******************************/
void init_serial0 (void)
{
PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)
U0LCR &= 0xFC; // Reset Word Select(1:0)
U0LCR |= 0x03; // Data Bit = 8 Bit
U0LCR &= 0xFB; // Stop Bit = 1 Bit
U0LCR &= 0xF7; // Parity = Disable
U0LCR &= 0xBF; // Disable Break Control
U0LCR |= 0x80; // Enable Programming of Divisor Latches
// U0DLM:U0DLL = 60.00 MHz / [16 x Baud]
// = 60.00 MHz / [16 x 9600]
// = 390.6 = 391 = 0187H
U0DLM = 0x01; // Program Divisor Latch(391) for 9600 Baud
U0DLL = 0x87;
U0LCR &= 0x7F; // Disable Programming of Divisor Latches
U0FCR |= 0x01; // FIF0 Enable
U0FCR |= 0x02; // RX FIFO Reset
U0FCR |= 0x04; // TX FIFO Reset
U0FCR &= 0x3F;
}
/****************************/
/* Write Character To UART0 */
/****************************/
int putchar (int ch)
{
if (ch == '\n')
{
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
U0THR = 0x0D; // Write CR
}
while (!(U0LSR & 0x20)); // Wait TXD Buffer Empty
return (U0THR = ch); // Write Character
}
/*****************************/
/* Read Character From UART0 */
/*****************************/
int getchar (void)
{
while (!(U0LSR & 0x01)); // Wait RXD Receive Data Ready
return (U0RBR); // Get Receice Data & Return
}
/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}
while((AD1DR0 & 0x80000000) == 0); // wait ADC convert complete