PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : درخواست کمک در مورد Adc



msmut7020
10-03-2012, 19:16
سلام بر همگی.من جدیدا به یه مشکلی برخوردم که داره اعصابم را خورد میکنه.
ببینید مسئله خیلی ساده هست.من Adc میکرو را روشن کردم و به کانال صفر و یک اون دوتا پتانسیومتر وصل کردم.حالا میخوام مقدار کانال صفر روی خط اول lcd و مقدار کانال 1 روی خط دوم نمایش داده بشه.
اما مشکل اینجاست که اگه فقط بخام یه کانال را روی lcdنمایش بدم،این کار راحت انجام میشه.و با تغییر پتانسیومتر اون کانال ،مقدار adc هم تغییر میکنه.
اما وقتی تعداد کانالهای که میخام روی lcd نمایش بدم از 1 عدد بیشتر بشه،اونوقت با تغییر پتانسیومتر یه کانال،مقدار adc کانالهای دیگه هم تغییر میکنه..
در برنامه هم مقدار خوانده شده از هر کانال را توی 2 تا رشته مجزا میریزم و ته رشته ها رو هم میبندم.در عمل هم هیچگونه اتصالی بین کانالهای مختلف وجود نداره.
شبیه سازیش هم درست جواب میده ولی در عمل مشکل داره.
راستی این مشکل فقط در نمایش روی lcdبوجود میاد و مثلا اگر بخام مقدار هر دو کانال را از طریق پورت سریال بفرستم به کامپیوتر ،بدون هیچ مشکلی این کار انجام میشه و مشکلی که در بالا عرض کردم دیگه وجود نداره.

چقدر حرف زدم .خواهش می کنم اگه کسی میتونه کمک کنه.

agape
10-03-2012, 19:20
خوب دایی جان اینجوری که نمیشه نظری داد !
لطف کنید برنامه رو ضمیمه کنید تا بشه بیشتر بررسی کرد

msmut7020
10-03-2012, 20:05
خوب دایی جان اینجوری که نمیشه نظری داد !
لطف کنید برنامه رو ضمیمه کنید تا بشه بیشتر بررسی کرد
خب بله.درس میفرماین.حالا این برنامه که چیزی نداره.



#include <mega16.h>
#include <delay.h>
#include <delay.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#include <alcd.h>

char str[16] ;

char str1[16] ;

char str2[16] ;

unsigned long int i,i1,i2,i4,k;
float i3 ;

int u;

#define ADC_VREF_TYPE 0x20

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}


// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0x80;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 4000.000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;


// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: Free Running
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA2;
SFIOR&=0x1F;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{


lcd_gotoxy(0,0);
sprintf(str2,"%3.0d%c",read_adc(0),0);
lcd_puts(str2);

lcd_gotoxy(1,1);
sprintf(str1,"%3.0d%c",read_adc(1),0);

lcd_puts(str1);
delay_ms(100);

}
}

msmut7020
11-03-2012, 19:48
سلام.من برنامه را هم گذاشتم.کسی مشکلی توی برنامه من میبینه؟؟؟اصلا آیا تا حالا کسی به این مشکلی که من عرض کردم برخورده؟

agape
12-03-2012, 16:09
برنامه که ظاهراً درست هست ! میزان تغییرات چقرده !
برای این که مطمئن بشیم شما یکی از ورودی ها رو یا زمین کن یا ماکزیمم - بعد ورودی دوم رو تغییر بده ، ببین بازم ورودی اول تغییر میکنه یا نه !
من که تا حالا چنین مشکلی نداشتم !

Ma3ood
12-03-2012, 16:31
درود بر شما دوست عزیز




lcd_gotoxy(0,0);
sprintf(str2,"%3.0d%c",read_adc(0),0);
lcd_puts(str2);

تا اونجایی که من کار کردم
چنین عبارتی برای "%3.0d%c" ندیدم همیشه % قبل از d می اید مثلا "temp=2%d c"
در ضمن کامپایلر هم خطا نمی گیره !

ali_h
12-03-2012, 17:13
رشته هاتون به صورت آرایه unsigned char تعریف کنید ببنید فرقی می کنه

msmut7020
12-03-2012, 19:46
برنامه که ظاهراً درست هست ! میزان تغییرات چقرده !
برای این که مطمئن بشیم شما یکی از ورودی ها رو یا زمین کن یا ماکزیمم - بعد ورودی دوم رو تغییر بده ، ببین بازم ورودی اول تغییر میکنه یا نه !
من که تا حالا چنین مشکلی نداشتم !

سلام.کارهایی که دایجون فرموده بودن انجام دادم.من یکی از کانال ها را صفر کردم و دیگری را تغییر دادم.جالب اینجاست که در این حالت adc نمایش داده شده برای کانالی که پتانسیومتر متصل به اون را تغییر میدم،دایما در حال تغییره.یعنی حتی اگه من پتانسیومترش را تغییر ندم هم بازم تغییر میکنه. و در مورد اون کانالی که صفر شده هم این موضوع وجود داره فقط تغییرات آهسته تره.بعضی موقع ها هم صفر میشه.یه نکته دیگه که فهمیدم اینه که اگه مثلا کانال اول صفر باشه اونوقتن فقط زمانی روی lcd مقدار این کاانال صفر نمایش داده میشه که کانال دوم را هم صفر کننم.برای مقدار 255 هم این مسئله وجود داره


تا اونجایی که من کار کردم
چنین عبارتی برای "%3.0d%c" ندیدم همیشه % قبل از d می اید مثلا "temp=2%d c"
در ضمن کامپایلر هم خطا نمی گیره !

مهندس یخورده بیشتر به اون عبارتی که من نوشتم دقت کنید.من هم % را قبل از d گذاشتم نه بعدش.اگه غلطه شما صحیحش را بفرماین



رشته هاتون به صورت آرایه unsigned char تعریف کنید ببنید فرقی می کنه

این مورد را هم انجام دادم.هیچ تغییری حاصل نشد.

sadeghmojtaba
12-03-2012, 20:07
پین های adc رو پول آپ کنید ببینید درست میشه؟

Ma3ood
12-03-2012, 21:43
خوب مث اینکه حق با شما هستش :lol:
اما % دوم برای چیهii998)
شما که همه چی رو امتحان کردی کد زیر رو هم امتحان کن



lcd_gotoxy(0,0);
sprintf(str2,"temp1=%2d c",read_adc(0));
lcd_puts(str2);

lcd_gotoxy(0,1);
sprintf(str1,"temp2=%2d c",read_adc(1));
lcd_puts(str1);
delay_ms(100);



با توجه به پست اول شما فک نمی کنم که پایه های مربوط به adc رو اشتباه وصل کرده باشید ولی جهت اطمینان پایه AVCC را به 5 ولت پایه aref رو به یه منبع ثابت وصل کنید ,و یه خازن 100 نانو از این منبع به زمین!
در ضمن همیشه وقتی برنامه ات رو میگذاری کامل بزار نه اینکه فقط اونجایی که شما فک میکنی غلطه بگذاری !
موفق باشی:wink:

msmut7020
12-03-2012, 23:04
ا
در ضمن همیشه وقتی برنامه ات رو میگذاری کامل بزار نه اینکه فقط اونجایی که شما فک میکنی غلطه بگذاری !
موفق باشی:wink:

خب من هم تمام برنامه را گذاشتم.شاید شما منظورتون اینه که پروژه ای که با کدویژن ساختم را بذارم.ولی در هر صورت برنامه همینه.خواهش میکنم هر وقت متوجه شدین که % دومی برای چیه بیاین و سعی کنین به خیال خودتون از من مچ گیری کنین.:o

Ma3ood
13-03-2012, 00:24
خب من هم تمام برنامه را گذاشتم.شاید شما منظورتون اینه که پروژه ای که با کدویژن ساختم را بذارم.ولی در هر صورت برنامه همینه.خواهش میکنم هر وقت متوجه شدین که % دومی برای چیه بیاین و سعی کنین به خیال خودتون از من مچ گیری کنین.:o

باشه شما مهندسین و همچی تموم :hi:
اگه فقط برنامه همینه که نمیدونم شاید ما یه خورده گیج میزنیم تایمر یک فعال کلی متغییر و چیزای دیگه ولش اصلا
اگه هم خیلی بلدی خودت حل کن وقت ما رو هم نگیر بیخودی سوال نکن و تایپک نزن
در ضمن % دومی هم برای اینهکه به خیال خودت خواستی ته ارایه تو بندی با صفر (ما هیچی بلد نیستیم:() و برای ......
در ضمن منظور من این نبود که نمی دونم % برای چیه گفتم با این کارا فک نکنی جواب میگیری برای صفر کردن و یا نکردن نیست تو عمل ببین چیکار میکنی

mmojtabaa
13-03-2012, 00:33
خب من هم تمام برنامه را گذاشتم.شاید شما منظورتون اینه که پروژه ای که با کدویژن ساختم را بذارم.ولی در هر صورت برنامه همینه.خواهش میکنم هر وقت متوجه شدین که % دومی برای چیه بیاین و سعی کنین به خیال خودتون از من مچ گیری کنین.:o



باشه شما مهندسین و همچی تموم :hi:
اگه فقط برنامه همینه که نمیدونم شاید ما یه خورده گیج میزنیم تایمر یک فعال کلی متغییر و چیزای دیگه ولش اصلا
اگه هم خیلی بلدی خودت حل کن وقت ما رو هم نگیر بیخودی سوال نکن و تایپک نزن
در ضمن % دومی هم برای اینهکه به خیال خودت خواستی ته ارایه تو بندی با صفر (ما هیچی بلد نیستیم:() و برای ......
در ضمن منظور من این نبود که نمی دونم % برای چیه گفتم با این کارا فک نکنی جواب میگیری برای صفر کردن و یا نکردن نیست تو عمل ببین چیکار میکنی





لطفا با هم بحث نكنيد

mmojtabaa
13-03-2012, 00:41
لطفا با هم بحث نكنيد
با هم مهــــــــــــــــــربان باشيد

من بی صدا اشک میریزم ، برای عکاسم می خندم ، دورم را شلوغ کردم ، خنده هایم مصنوعی ،اما بلند .... ... تا تو خیالت راحت باشد ... و همین که صدای خنده هایت را از دور می شنوم، کافیست .... تو فریاد اشک های مرا نشنو...

mmojtabaa
13-03-2012, 13:58
خب من هم تمام برنامه را گذاشتم.شاید شما منظورتون اینه که پروژه ای که با کدویژن ساختم را بذارم.ولی در هر صورت برنامه همینه.خواهش میکنم هر وقت متوجه شدین که % دومی برای چیه بیاین و سعی کنین به خیال خودتون از من مچ گیری کنین.:o

زود آتشي شدي؟؟؟

msmut7020
13-03-2012, 15:53
باشه شما مهندسین و همچی تموم :hi:
اگه فقط برنامه همینه که نمیدونم شاید ما یه خورده گیج میزنیم تایمر یک فعال کلی متغییر و چیزای دیگه ولش اصلا
اگه هم خیلی بلدی خودت حل کن وقت ما رو هم نگیر بیخودی سوال نکن و تایپک نزن
در ضمن % دومی هم برای اینهکه به خیال خودت خواستی ته ارایه تو بندی با صفر (ما هیچی بلد نیستیم:() و برای ......
در ضمن منظور من این نبود که نمی دونم % برای چیه گفتم با این کارا فک نکنی جواب میگیری برای صفر کردن و یا نکردن نیست تو عمل ببین چیکار میکنی
جناب masoud70من از شما خواهش میکنم مشکلات منو حل نکنین.کسان دیگری هم هستن که به کمک شما نیاز دارن

agape
13-03-2012, 16:39
سلام دایی جان ! خواهش میکنم با هم مهربان باشید و به هم توهین نکنید ! هرکسی برای خودش کسی هست و نباید همو دست کم بگیریم !
خوب دایی جان شما چند تا کار بکنید ، اول این که اعداد دسیمال قسمت اعشاری ندارند چرا براش قسمت اعشازی قائل شدید کلید %3.0d رو میگم شما به این کلید رو به %3i تغییر بدید ، امید است که درست شود . اگر نشد ، به جای تابع read_adc یکی از کانال ها مقدار ثابت بذارید ببیند باز برنامه به همون صورت داره کار میکنه ! چون وقتی شما یکی از ورودی ها زمین کردید قطعاً نباید تغییر کنه !
در ضمن دایی جان اگه برات امکان داره شبیح سازیش کن تو پروئوس و اینجا قرار بده که بشه بهتر نظر داد! در ضمن نکته دیگه ای که ممکنه خیلی مرنبط نباشه ولی خوب احتمال هست دیگه ولتاژ vref رو از بیرون دارید تامین میکنید ، چقدر ثابت هست این ولتاژ رفرنس ؟

msmut7020
13-03-2012, 17:02
سلام دایی جان ! خواهش میکنم با هم مهربان باشید و به هم توهین نکنید ! هرکسی برای خودش کسی هست و نباید همو دست کم بگیریم !
خوب دایی جان شما چند تا کار بکنید ، اول این که اعداد دسیمال قسمت اعشاری ندارند چرا براش قسمت اعشازی قائل شدید کلید %3.0d رو میگم شما به این کلید رو به %3i تغییر بدید ، امید است که درست شود . اگر نشد ، به جای تابع read_adc یکی از کانال ها مقدار ثابت بذارید ببیند باز برنامه به همون صورت داره کار میکنه ! چون وقتی شما یکی از ورودی ها زمین کردید قطعاً نباید تغییر کنه !
در ضمن دایی جان اگه برات امکان داره شبیح سازیش کن تو پروئوس و اینجا قرار بده که بشه بهتر نظر داد! در ضمن نکته دیگه ای که ممکنه خیلی مرنبط نباشه ولی خوب احتمال هست دیگه ولتاژ vref رو از بیرون دارید تامین میکنید ، چقدر ثابت هست این ولتاژ رفرنس ؟

سلام دایجون خودم.
اوامر شما را اجرا میکنم و تا 5شنبه خبر میدم.آخه ممکنه یه مدت به کامپیوتر دسترسی نداشته باشم.به هرحال ممنون از راهنمایی هاتون

Ma3ood
13-03-2012, 18:20
جناب masoud70من از شما خواهش میکنم مشکلات منو حل نکنین.کسان دیگری هم هستن که به کمک شما نیاز دارن

درسته ما ادعامون نمی شه هر چی هم میگیم برای کمک هستش کسی هم وقت اضافه نداره برای کسی که نه اصلا میشناسه و ندیده و... وقت بذاره این وظیفه ما نیست داریم بهت لطف میکنیم(من خودم که مخلص برو بچه های ایران میکرویی هستم چون خیلی با معرفتن)!

msmut7020
13-03-2012, 21:01
درسته ما ادعامون نمی شه هر چی هم میگیم برای کمک هستش کسی هم وقت اضافه نداره برای کسی که نه اصلا میشناسه و ندیده و... وقت بذاره این وظیفه ما نیست داریم بهت لطف میکنیم(من خودم که مخلص برو بچه های ایران میکرویی هستم چون خیلی با معرفتن)!
خیلی خوب شما را به هرکی که می پرستی به ما لطف و مرحمت نکن.بذارین لطف و مرحمت شما شامل حال دیگران هم بشه.من شخصا از زحمات و الطاف شما تشکر میکنم.تو رو به خدا دست نوازشت را از سر ما بردار.از نظر من این بحث تموم شده هست و به احترام دایی جان و دوستان دیگری که ما را توصیه به مهربانی کردن دیگه ادامه نمی دم.

Ma3ood
13-03-2012, 22:20
خیلی خوب شما را به هرکی که می پرستی به ما لطف و مرحمت نکن.بذارین لطف و مرحمت شما شامل حال دیگران هم بشه.من شخصا از زحمات و الطاف شما تشکر میکنم.تو رو به خدا دست نوازشت را از سر ما بردار.از نظر من این بحث تموم شده هست و به احترام دایی جان و دوستان دیگری که ما را توصیه به مهربانی کردن دیگه ادامه نمی دم.

در جواب فقط سکـــــــــــــــــــــــ ـــــــــــــــــــــــــ ـوت می کنم

mmojtabaa
13-03-2012, 23:16
خیلی خوب شما را به هرکی که می پرستی به ما لطف و مرحمت نکن.بذارین لطف و مرحمت شما شامل حال دیگران هم بشه.من شخصا از زحمات و الطاف شما تشکر میکنم.تو رو به خدا دست نوازشت را از سر ما بردار.از نظر من این بحث تموم شده هست و به احترام دایی جان و دوستان دیگری که ما را توصیه به مهربانی کردن دیگه ادامه نمی دم.
كاش با يك جمله ي ممنونم مسئله رو تموم ميكرديد.
يا عْْْْْْْْْْْْْـــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــلـــــــ ــــــــــــــي