PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : LCDN96 Problem with Runing ADC!!!



m.elexal
27-03-2013, 20:07
با سلام بچه ها من عنوان رو انگلیسی میزنم تا این سایت در سرچ های گوگل بصورت انگلیسی هم بیاد . بگذریم
آقا من یه مشکل کانفیلیکتی پیدا کردم
ADC که روشن میشه داخل حلقه While دیگه عدد ADC رو نمایش نمیده
کسی میدونه مشکل کجاست ؟
با تشکر

#include <lpc17xx.h>
#include "delay.h"
#define family_lpc17xx
#define TFTLCD_DATAPORT_1
#define TFTLCD_DATAPORT_OFFSET 15
#define TFTLCD_CONTROLPORT_0

#define TFTLCD_RST 26
#define TFTLCD_RS 23
#define TFTLCD_CS 22
#define TFTLCD_RD 25
#define TFTLCD_WR 24
#define PORTRAIT
#include "tftlcd_functions.h"
//#include "Font_24x16.h"
//#include "image.h"

int x=0;
int main(){
int a;
short s;
SystemInit();
LPC_PINCON->PINSEL3 |= (3UL<<30); /* P1.31 is AD0.5 */
LPC_SC->PCONP |= (1<<12); /* Enable power to ADC block 12bit */
LPC_ADC->ADCR = (1<< 5) | /* select AD0.5 pin */
(4<< 8) | /* ADC clock is 25MHz/5 */
(1<<21); /* enable ADC */

SystemInit();
tftlcd_init();
tftlcd_clear();

tftlcd_gotoxy(0,0);
tftlcd_puts("Start ADC Convertor",Yellow,Red,0);
delay_ms(500);
while(1)
{
unsigned char str[10];
LPC_ADC->ADCR &= ~(7<<24); /* stop conversion */
LPC_ADC->ADCR |= (1<<24); /* start conversion */
while (!(LPC_ADC->ADGDR & (1UL<<31))); /* Wait for Conversion end */
a = (LPC_ADC->ADGDR>>4 & 0xfff);
s=LPC_ADC->ADGDR/2;

sprintf(str,"%d",s);
tftlcd_gotoxy(0,1);
tftlcd_puts(str,Yellow,Red,0);
delay_us(5);
}


}


خودم احساس میکنم مشکل از شیفت هایی است که خورده !!
چون هم ADC رو پورت 1 هم LCD
همانطور که میبینید ADC خورده به P1.31
نمیخوام هم عوض کنم جاش رو یعنی نمیتونم
با تشکر

m.elexal
28-03-2013, 04:16
کلا کد رو عوض کردم که یه وقت شیفت نده رو پای های lcd
در ضمن lcd رو هم کلا بردم رو پورت 1 و دیگه مساله کانفیلیکت نداره
adc هم روی پورت 0 پین 23
بازم نشون نمیده مقدار ADC رو :(
دیباگ کردم میره اینجا میمونه

HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDPکد فعلی هم اینه

#include <lpc17xx.h>
#include "delay.h"
#define family_lpc17xx
#define TFTLCD_DATAPORT_1
#define TFTLCD_DATAPORT_OFFSET 15
#define TFTLCD_CONTROLPORT_1

#define TFTLCD_RST 1// 26
#define TFTLCD_RS 9// 23
#define TFTLCD_CS 10 //22
#define TFTLCD_RD 4// 25
#define TFTLCD_WR 8//24
#define PORTRAIT
#include "tftlcd_functions.h"
//#include "Font_24x16.h"
//#include "image.h"

int read_adc(void)
{
int i;

LPC_ADC->ADCR |=0X01000000;//start conversation
do
{
i=LPC_ADC->ADDR0;//read AD data register
}
while((i&0x80000000)==0);//wait for end of AD conversation
return (i>>6) & 0x03ff;//bit 6:15 are 10 bit ad value
}

int main()
{
int value;


LPC_SC->PCONP |=(1<<12);//return ADC on with set bit12
LPC_PINCON->PINSEL1=0x4000;//set p0.23 as adc input
LPC_ADC->ADCR=0x00200301;
SystemInit();
tftlcd_init();
tftlcd_clear();
tftlcd_gotoxy(0,0);
tftlcd_puts("Start ADC",Yellow,Red,0);
//delay_ms(500);
while(1)
{
unsigned char str[10];

sprintf(str,"%d",read_adc());
tftlcd_gotoxy(0,1);
tftlcd_puts(str,Yellow,Red,0);
tftlcd_gotoxy(0,2);
tftlcd_putchar(value,Yellow,Red,0);
//delay_us(5);
}
}








خسته شدم دیگه از صبح سر یه adc که راه انداختم قبلا گیر کردم
تو lcd کاراکتری راه انداختم مثل هلو اینجا نمیدونم چرا اصلا جواب نمیده :(
از sprintf پایین تر نمیره اصلا که چاپ شه خود sprintf هم دیباگ زدم نمیرسه میره تو startup_lpc17xx گیر میکنه
یکی بگه چیکار کنم :unh:

Aghaeifar
28-03-2013, 10:13
سلام.
1- اونجاکه نوشتی
i>>6 نباید به جای 6 عدد 4 می ذاشتی؟ نتایج در بیتهای 4 تا 15 ذخیره می شن. (البته مشکل کارتون این نیست.)

2- الان نوشته های که روی LCD می زنی بنویسه رو نشون می ده؟ ( قبل شروع while)

3- برات اگر دردسر نداره در تابع read_adc بعد از خط

while((i&0x80000000)==0);//wait for end of AD conversation
مثلا یه LED یه هر چیزی روشن کن ببین این خط طی میشه یا نه. به ما هم بگو نتیجه چی شد.

4- یک بار دیگه با رجیستر AD0GDR نتایج تبدیل رو بخون

m.elexal
28-03-2013, 14:49
سلام.
1- اونجاکه نوشتی
i>>6 نباید به جای 6 عدد 4 می ذاشتی؟ نتایج در بیتهای 4 تا 15 ذخیره می شن. (البته مشکل کارتون این نیست.)

2- الان نوشته های که روی LCD می زنی بنویسه رو نشون می ده؟ ( قبل شروع while)

3- برات اگر دردسر نداره در تابع read_adc بعد از خط

while((i&0x80000000)==0);//wait for end of AD conversation
مثلا یه LED یه هر چیزی روشن کن ببین این خط طی میشه یا نه. به ما هم بگو نتیجه چی شد.

4- یک بار دیگه با رجیستر AD0GDR نتایج تبدیل رو بخون

سلام مهندس جان بابت کمک ممنون
بله قبل از while روی lcd مینویسه حتی تو while هم مینویسه چک کردم
اما بعد از sprint f دیگه اجرا نمیشه نمیدونم چرا
اینهم کدی که فرمودید یه led وصل کردم به p0.16
اینهم روشن نمیشه
خیلی جالبه برام Vref هم حتی وصل کردم بازهم فرقی نکرد
اینهم تغییراتی که فرمودید

#include <lpc17xx.h>
#include "delay.h"
#define family_lpc17xx
#define TFTLCD_DATAPORT_1
#define TFTLCD_DATAPORT_OFFSET 15
#define TFTLCD_CONTROLPORT_1

#define TFTLCD_RST 1// 26
#define TFTLCD_RS 9// 23
#define TFTLCD_CS 10 //22
#define TFTLCD_RD 4// 25
#define TFTLCD_WR 8//24
#define PORTRAIT
#include "tftlcd_functions.h"
//#include "Font_24x16.h"
//#include "image.h"

int read_adc(void)
{
int i;

LPC_ADC->ADCR |=0X01000000;//start conversation
do
{
i=LPC_ADC->ADDR0;//read AD data register
}
while((i&0x80000000)==0);//wait for end of AD conversation
return (i>>4) & 0x03ff;//bit 6:15 are 10 bit ad value
}

int main()
{
int value;


LPC_SC->PCONP |=(1<<12);//return ADC on with set bit12
LPC_PINCON->PINSEL1=0x4000;//set p0.23 as adc input
LPC_ADC->ADCR=0x00200301;
SystemInit();
tftlcd_init();
tftlcd_clear();
tftlcd_gotoxy(0,0);
tftlcd_puts("Start ADC",Yellow,Red,0);
//delay_ms(500);
LPC_GPIO0->FIODIR=0x00010000;
while(1)
{
value=read_adc();
if (value>450)
{
LPC_GPIO0->FIOCLR=0x00010000;
}
else
{
LPC_GPIO0->FIOSET=0x00010000;
}
// unsigned char str[10];

// sprintf(str,"%d",read_adc());
// tftlcd_gotoxy(0,1);
// tftlcd_puts(str,Yellow,Red,0);
// tftlcd_gotoxy(0,2);
// tftlcd_putchar(value,Yellow,Red,0);
//delay_us(5);
}
}










دیگه چی کار کنم ؟
تو این کد هم تا value=read_adc(); میره بعدش دیگه نمیره و باز میره روی B تو کد پایین گیر میکنه



HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
:unh:

m.elexal
28-03-2013, 14:58
آقا این اصلا adc نمیخونه vref رو چه به گراند میزنم چه به 3.3 هیچ عکس العملی نداره
چرااااااا آخههههههه ؟
اصلا پین p0.23 که adc هست رو مستقیم زدم به 3.3 شرطمم زدم read_adc(); بزرگتر از 1 شد led رو روشن کن !!!!! دیگه از این ضایع تر ؟
روشن نمیشه آقا جان :sa:

m.elexal
28-03-2013, 15:34
درست شد اما چراشو خودمم نفهمیدم کسی فهمید مارو هم خبر کنه !!!
الان روی lcd چاپ میکنه
هم Adc رو پورت 1 هم lcd !!!!!!!!!!!!!!!!!!!
خیلی هم خوب کار میکنه
اما میخوام دلیلش رو بدونم lov:


#include <lpc17xx.h>
#include "delay.h"
#define family_lpc17xx
#define TFTLCD_DATAPORT_1
#define TFTLCD_DATAPORT_OFFSET 15
#define TFTLCD_CONTROLPORT_1

#define TFTLCD_RST 1// 26
#define TFTLCD_RS 9// 23
#define TFTLCD_CS 10 //22
#define TFTLCD_RD 4// 25
#define TFTLCD_WR 8//24
#define PORTRAIT
#include "tftlcd_functions.h"
//#include "Font_24x16.h"
//#include "image.h"

int main()
{
short a;
unsigned char str[10];
short s;
SystemInit();
tftlcd_init();
LPC_PINCON->PINSEL3 |= (3UL<<30); /* P1.31 is AD0.5 */
LPC_SC->PCONP |= (1<<12); /* Enable power to ADC block 12bit */
LPC_ADC->ADCR = (1<< 5) | /* select AD0.5 pin */
(4<< 8) | /* ADC clock is 25MHz/5 */
(1<<21); /* enable ADC */

tftlcd_gotoxy(0,0);
tftlcd_puts("Start ADC",Yellow,Red,0);
delay_ms(500);

while(1)
{

LPC_ADC->ADCR &= ~(7<<24); /* stop conversion */
LPC_ADC->ADCR |= (1<<24); /* start conversion */
while (!(LPC_ADC->ADGDR & (1UL<<31))); /* Wait for Conversion end */
a = (LPC_ADC->ADGDR>>4 & 0xfff);

sprintf(str,"%d",a);
tftlcd_gotoxy(10,7);

tftlcd_puts(str,Yellow,Red,0);
delay_ms(2);

}
}

Aghaeifar
29-03-2013, 03:07
در کدی که نوشتی درست شد فقط اومدی به جای رجیستر addr0 از رجیستر جایگزین adgdr (بند چهارم چیزی که بالا گفتم ) استفاده کردی.
برای اطمینان فقط یک بار بیا در همین کد (عوضش نکنید مثل بالایی بشه) جای این دوتا رجیستر رو مجدد عوض کنید ببینید نتیجه چطور میشه که بشه یه جمع بندی در موردش کرد.