Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 9 months ago.
finite loop that is only looping once instead of 500 times
HI guys, I'm working on the LPC1768. trying to make a loop iterates 500 times reading the 5 ADC channels and spitting out the results in serial. My obvious choice was a for loop, but it is not working as intended, it's only reading all 5 channels and then it stops, short changing me with 499 solid loops. Could any of you lovely people please throw a kind suggesting my way as to how best I could tackle this. Thanks a lot.
include the mbed library with this snippet
#include "mbed.h" /* adc input using control register */ Serial pc(USBTX, USBRX); // variable declarations char channel; // ADC channel 1 int ADCdata; // this will hold result of the conversion int DigOutData = 0; // a buffer for the output display pattern int ADCout[4]; int count = 0; // function prototype void delay(void); // define addresses of control registers, as pointers to volatile data //(i.e the memory contents) #define PINSEL3 (*(volatile unsigned long *)(0x4002C00C)) #define PINSEL1 (*(volatile unsigned long *)(0x4002C004)) #define PCONP (*(volatile unsigned long *)(0x400FC0C4)) #define ADOCR (*(volatile unsigned long *)(0x40034000)) #define ADOGDR (*(volatile unsigned long *)(0x40034004)) #define FIO2DIR0 (*(volatile unsigned long *)(0x2009C040)) #define FIO2PIN0 (*(volatile unsigned long *)(0x2009C054)) int main() { // intilialize the ADC PINSEL1 = 0x150000; // set bits 17-16, 19-18, 20-21 to 01 to enable AD0.1, AD0.2, AD0.3 (mbed pin 16,17,18) PINSEL3 = 0xF0000000; // sets bits 29-28, 31-30 to 11 to enable AD0.4, AD0.5 (mbed pin 19, 20) PCONP |= (1 << 12); // enable ADC clock while(1) { for(count = 0; count <= 500; count ++) { for(channel =1; channel <=5; channel += 1) { ADOCR = ( 1 << channel)|( 1 << 8)|(0 << 16)|(1<<21)|(1<<24); // enable ADC clock, select channel, divide incoming by (1+1), giving 4.8MHz, BURST = 0, conversation under software control, PDN =1, enables power, START = 1 start A/D conversion now ADOCR = ADOCR | 0x01000000; // start conversion by setting bit 24 to 1 by ORing // wait for the conversion to finish by polling the ADC DONE bit while((ADOGDR & 0x80000000) == 0) { // test DONE bit, wait till it's 1 } ADCdata = ADOGDR; // get data from ADOGDR ADOCR &= 0xF8FFFFFF; // stop ADC by setting START bits to zero // shift data 4 bits to right justify, and 2 more to give 10-bit ADC // value given a between 0 & 1024 = 2^8 ADCdata=(ADCdata>>6)&0x03FF; // and mask DigOutData = 0x00; // clear the output buffer //displaying the data pc.printf("ADC reading in channel %d is %d \n", channel, ADCdata); ADCout[channel-1] = ADCdata; // write read data to array for output } channel = 1; } } }
1 Answer
10 years, 9 months ago.
You have 5 channels but ADCout is only a 4 element array. Writing to ADCout[4] will overwrite the next variable which happens to be count.
Does it work without your custom ADC stuff (or just with AnalogIn)? Your loop looks correct, so I wonder if it for example hangs on the while part.
posted by Erik - 23 Feb 2014