سلام دوستان
اگه میشه راهنماییم کنید چطوری تو یه برنامه از دو تا کانال بخونم.
البته از روی فیلم آموزشی یه کد نوشتم که از دو تا ADC بخونم و روی LCD نشون بدم و باقی کارا، تا جایی که شد خیلی دست تو کدای اصلی نبردم که خرابکاری نکنم، اما وقتی کد رو به این صورت مینویسم که یه تابع ADC_Read تعریف میکنم با آرگومان Channel و یه بار 6 قرارش میدم و یه بار 7، اول با آرگومان 6 میخونه و سر خط فراخونی تابع با آرگومان 7 میمونه.
ینی دستورات تا این خط اجرا میشه current_value = ADC_Read(7); و دیگه اجرا نمیشه.
وقتیم به این صورت مینویسم و دو تا تابع تعریف میکنم یعنی یه تابع ADC_Read و یه تابع ADC_Read1 و هر کدومو جدا فراخونی میکنم هر دو رو میخونه ولی فقط یه بار، و حلقه بسته ای که گذاشتم که مرتب ADCها رو بخونم و بعد هر بار خوندن تو LCD نشون بدم این حلقه دیگه تکرار نمیشه.
البته برنامه نه ارور میده و نه وارنینگ.
اگه میشه راهنماییم کنید چطوری تو یه برنامه از دو تا کانال بخونم.
البته از روی فیلم آموزشی یه کد نوشتم که از دو تا ADC بخونم و روی LCD نشون بدم و باقی کارا، تا جایی که شد خیلی دست تو کدای اصلی نبردم که خرابکاری نکنم، اما وقتی کد رو به این صورت مینویسم که یه تابع ADC_Read تعریف میکنم با آرگومان Channel و یه بار 6 قرارش میدم و یه بار 7، اول با آرگومان 6 میخونه و سر خط فراخونی تابع با آرگومان 7 میمونه.
ینی دستورات تا این خط اجرا میشه current_value = ADC_Read(7); و دیگه اجرا نمیشه.
کد:
unsigned short ADC_Read(unsigned char channel) { unsigned int i; //----------------------------- if (channel == 6) LPC_PINCON->PINSEL0 |= 2 << 6; /* p0.3 select as ADC0.6 */ else if (channel == 7) LPC_PINCON->PINSEL0 |= 2 << 4; /* p0.2 select as ADC0.7 */ LPC_SC->PCONP |= (1 << 12); // Enable power to AD block LPC_ADC->ADCR |= 1<<channel; //select AD0.4 TO AD0.5 depend adc channel nomber LPC_ADC->ADCR |= 0x0100; // ADCLK is 12.5 MHz //LPC_ADC->ADCR |= 0x10000; // BURST bit 1 << 16 LPC_ADC->ADCR |= 0x200000; //Power up, 1 << 21 //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal. // 1 << 27 //----------------------------- LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion do { switch (channel) { case 6: i = LPC_ADC->ADDR6; // Read A/D Data Register break; case 7: i = LPC_ADC->ADDR7; // Read A/D Data Register break; } } while ((i & 0x80000000) == 0); // Wait for end of A/D Conversion return (i >> 4) & 0x0FFF; // bit 4:15 is 10 bit AD value } int main (void) { unsigned short current_value; unsigned int l = 0; unsigned int r = 0; unsigned int m = 0; char h[100]; char p[100]; unsigned int n; LPC_GPIO0->FIODIR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10)); LPC_GPIO0->FIOMASK = 0; LPC_GPIO0->FIOCLR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10)); //LCD_4 BIT MODE lcd_init_4bit(); SystemInit(); command(0x01); lcd_putsf(" NavaBehdasht 2 "); Delay(10000); command(0x01); command(0x0c); while(1){ l=0; for(n=0;n<=10;n++) { Delay(1000); current_value = ADC_Read(6); l=l+current_value; } l=l/10; sprintf(h,"%i",l); command(0x80); lcd_putsf("L: "); command(0x82); lcd_putsf(h); delay(11000); r=0; for(n=0;n<=10;n++) { Delay(1000); current_value = ADC_Read(7); r=r+current_value; } r=r/10; sprintf(p,"%d",r); command(0x88); lcd_putsf(" R: "); command(0x8b); lcd_putsf(p); delay(11000); m=l-r; sprintf(p,"%i",m); command(0xc0); lcd_putsf(" Diff: "); command(0xc8); lcd_putsf(p); delay(11000); } }
کد:
unsigned short ADC_Read(unsigned char channel) { unsigned int i; //----------------------------- if (channel == 6) LPC_PINCON->PINSEL0 |= 2 << 6; /* p0.3 select as ADC0.6 */ else if (channel == 7) LPC_PINCON->PINSEL0 |= 2 << 4; /* p0.2 select as ADC0.7 */ LPC_SC->PCONP |= (1 << 12); // Enable power to AD block LPC_ADC->ADCR |= 1<<channel; //select AD0.4 TO AD0.5 depend adc channel nomber LPC_ADC->ADCR |= 0x0100; // ADCLK is 12.5 MHz //LPC_ADC->ADCR |= 0x10000; // BURST bit 1 << 16 LPC_ADC->ADCR |= 0x200000; //Power up, 1 << 21 //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal. // 1 << 27 //----------------------------- LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion do { switch (channel) { case 6: i = LPC_ADC->ADDR6; // Read A/D Data Register break; case 7: i = LPC_ADC->ADDR7; // Read A/D Data Register break; } } while ((i & 0x80000000) == 0); // Wait for end of A/D Conversion return (i >> 4) & 0x0FFF; // bit 4:15 is 10 bit AD value } unsigned short ADC_Read1(unsigned char channel) { unsigned int i; //----------------------------- LPC_PINCON->PINSEL3 = 3 << 28; /* p1.30 select as ADC0.4 */ LPC_PINCON->PINSEL3 <<= ((channel-4)*2); //select AD0.4 & AD0.5 pin depend channel nomber LPC_SC->PCONP |= (1 << 12); // Enable power to AD block LPC_ADC->ADCR |= 1<<channel; //select AD0.4 TO AD0.5 depend adc channel nomber LPC_ADC->ADCR |= 0x0100; // ADCLK is 12.5 MHz //LPC_ADC->ADCR |= 0x10000; // BURST bit 1 << 16 LPC_ADC->ADCR |= 0x200000; //Power up, 1 << 21 //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal. // 1 << 27 //----------------------------- LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion do { switch (channel) { case 4: i = LPC_ADC->ADDR4; // Read A/D Data Register break; case 5: i = LPC_ADC->ADDR5; // Read A/D Data Register break; } } while ((i & 0x80000000) == 0); // Wait for end of A/D Conversion return (i >> 4) & 0x0FFF; // bit 4:15 is 10 bit AD value } int main (void) { unsigned short current_value; unsigned int l = 0; unsigned int r = 0; unsigned int m = 0; char h[100]; char p[100]; unsigned int n; LPC_GPIO0->FIODIR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10)); LPC_GPIO0->FIOMASK = 0; LPC_GPIO0->FIOCLR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10)); //LCD_4 BIT MODE lcd_init_4bit(); SystemInit(); command(0x01); lcd_putsf(" NavaBehdasht 2 "); Delay(10000); command(0x01); command(0x0c); while(1){ l=0; for(n=0;n<=10;n++) { Delay(1000); current_value = ADC_Read(6); l=l+current_value; } l=l/10; sprintf(h,"%i",l); command(0x80); lcd_putsf("L: "); command(0x82); lcd_putsf(h); delay(11000); r=0; for(n=0;n<=10;n++) { Delay(1000); current_value = ADC_Read1(4); r=r+current_value; } r=r/10; sprintf(p,"%d",r); command(0x88); lcd_putsf(" R: "); command(0x8b); lcd_putsf(p); delay(11000); m=l-r; sprintf(p,"%i",m); command(0xc0); lcd_putsf(" Diff: "); command(0xc8); lcd_putsf(p); delay(11000); } }
البته برنامه نه ارور میده و نه وارنینگ.