سلام به همه ی دوستان
من یک برنامه ی ساعت و دماسنج با lm35 پیدا کردم و بسته به نیازم خلاصه کردمش ولی هر کاری میکنم با دیاگرامی که دیتاشیت lm35 داده دمای منفی نمیده
با کلی تغییر تو برنامه و سر و کله زدن با مدار در حال حاضر دمای 0 تا 19 درسته ولی 20 که میشه 1 درجه بالاتر نشون میده
![Sad Sad](https://www.iranled.com/forum/images/smilies2/sad.gif)
مشکل اصلی دمای منفی هست که به ازای -1 مقدار 3276 میده !!!
![Amaze Amaze](https://www.iranled.com/forum/images/smilies2/my.gif)
اگر دوستان لطف کنن در مورد 12 ساعته کردن ساعتش هم راهنمایی کنن ممنون میشم
![Wink Wink](https://www.iranled.com/forum/images/smilies2/wink.gif)
کاری که خودم به ذهنم برای 12 ساعته کردن رسید این بود که شرط بزارم زمان 13 شدن ساعت روی lcd 01 نشون که تو تنظیمات 24 ساعته تنظیم بشه ولی زمان نمایش 12 ساعته بده ولی ظاهرا دستورم غلط بود
![Confused Confused](https://www.iranled.com/forum/images/smilies2/confused.gif)
اگر دوستان راهنمایی کنن ممنون میشم
![008 008](https://www.iranled.com/forum/images/smilies/pack1/2008.gif)
در عین حال بگم که من تقریبا مبتدی هستم ولی با بیسک و نحوه ی کار با میکرو تا حدودی آشنا ام و خوب در حال یادگیری بیشترم
![Biggrin Biggrin](https://www.iranled.com/forum/images/smilies2/biggrin.gif)
فایل ساعت هم پیوست شد
سلام
فایل ها رو تو خود سایت اتچ کن که همیشه موجود باشه
lm35 رو نمی دونم چه جوری بستی ولی ولتاژ منفی نباید تولید کنه چون میکرو نمی تونه بخونتش باید مثلا برای صفر درجه ۲ ولت بده تا بتونی ولتاژ منفی رو بخونی توی میکرو هم باید یه عدد ازش کم کنی تا منفی بشه
برای ساعت هم باید باقی مانده رو بر ۱۲ به دست بیاری اگه ۲۴ ساعته بود که خوشو نشون بده اگه ۱۲ ساعته بود باقیماندش رو به ۱۲
lm35 موجود تو بازار که منفیو اندازه نمیگیرن 0-100 درجه هستن !!
از lm335 استفاده کنید حالت زنری داره
سلام.
براي دماي منفي ، بايد دماي صفر رو براي ولتاژ 2.5 ولت روي ADC كاليبرهه كني ...
اينطوري بالاي 2.5 ، + و پايين 2.5 ، - مي شن ... .
روشي هم كه شما گفتي ، احتمالا با كم كردن از يه عدد ثابت باز بشه بهش رسيد ... ( اما مطمئن نيستم ... )
سادهه هست ، فقط بايد چندتا روش رو تست كني ... .
براي 12 ساعته كردن ، وقتي ساعت 24 ساعته هست ، اگر بيشتر از 12 شد بايد اين مقدار از عدد ثابت 12 كم بشه ...
مثلا 1=12-13 و 2=12-14 و ...
به همين سادگي ...
من برنامه اتون رو نگاه نكردم ، اما اگر ذهنتون رو با برنامه هاي آمادهه تنبل نكنيد و تنها روش رو ازشون ياد بگيريد ، خيلي راحت مي تونيد اين مشكلات رو رفع كنيد و ذهنتون رو قوي تر كنيد ...
موفق باشيد.
يا علي.
ممنون از همه ی دوستان
مشکلم حل شد
![Happy Happy](https://www.iranled.com/forum/images/smilies2/happy.gif)
راه حل هم مینویسم که اگر کسی مشکل من رو داشت بتونه استفاده کنه
مدار رو طبق FIGURE 7 داخل دیتاشیت lm35 ببندید
سیم مثبت و منفی رو به 2 تا adc جدا بدید
مقدار منفی خوانده شده رو از مثبت کم کنید و جواب رو به 4 تقسیم کنید
بعد از بستن مدار سنسور رو با یک تکه یخ و یک مولتی ترن یا پتانسیومتر کالیبره کنید
نتیجه ی دمای بدست اومده دقت خیلی بالا و خوبی داره که البته به Reference و نویز برق هم بستگی داره.
![Wink Wink](https://www.iranled.com/forum/images/smilies2/wink.gif)
(۲۲-بهمن-۱۳۹۰, ۱۲:۳۹:۳۵)ha_60 نوشته است: [ -> ]سلام
فایل ها رو تو خود سایت اتچ کن که همیشه موجود باشه
lm35 رو نمی دونم چه جوری بستی ولی ولتاژ منفی نباید تولید کنه چون میکرو نمی تونه بخونتش باید مثلا برای صفر درجه ۲ ولت بده تا بتونی ولتاژ منفی رو بخونی توی میکرو هم باید یه عدد ازش کم کنی تا منفی بشه
برای ساعت هم باید باقی مانده رو بر ۱۲ به دست بیاری اگه ۲۴ ساعته بود که خوشو نشون بده اگه ۱۲ ساعته بود باقیماندش رو به ۱۲
چشم الان اصلاح میکنم فایل رو
![Shy Shy](https://www.iranled.com/forum/images/smilies2/shy.gif)
در مورد lm35 هم اگر طبق دیتاشیت مدار بسته بشه و مثبت و منفی جدا به میکرو داده بشه برای دماهای زیر 0 خروجی سیم مثبت 0 میشه و سیم منفی دارای مقدار متناسب با دما و برای دمای بالای 0 برعکس هست.
واسه ساعت هم ممنون
با این که یکم جابجا بود نوشتتون ولی گرفتم چی شد
![Tongue Tongue](https://www.iranled.com/forum/images/smilies2/tongue.gif)
(۲۲-بهمن-۱۳۹۰, ۱۳:۰۳:۳۲)maxn@morteza نوشته است: [ -> ]lm35 موجود تو بازار که منفیو اندازه نمیگیرن 0-100 درجه هستن !!
از lm335 استفاده کنید حالت زنری داره
میگیره دوست عزیز
به توضیحی که نوشتم عمل کنی نتیجه میگیرید
![Smile Smile](https://www.iranled.com/forum/images/smilies2/smile.gif)
در مورد lm335 هم اطلاعاتم کمه ممنون از این که اشاره کردید
حتما دیتاشیتشو میخونم
(۲۲-بهمن-۱۳۹۰, ۱۳:۲۴:۰۲)sharin نوشته است: [ -> ]سلام.
براي دماي منفي ، بايد دماي صفر رو براي ولتاژ 2.5 ولت روي ADC كاليبرهه كني ...
اينطوري بالاي 2.5 ، + و پايين 2.5 ، - مي شن ... .
روشي هم كه شما گفتي ، احتمالا با كم كردن از يه عدد ثابت باز بشه بهش رسيد ... ( اما مطمئن نيستم ... )
سادهه هست ، فقط بايد چندتا روش رو تست كني ... .
براي 12 ساعته كردن ، وقتي ساعت 24 ساعته هست ، اگر بيشتر از 12 شد بايد اين مقدار از عدد ثابت 12 كم بشه ...
مثلا 1=12-13 و 2=12-14 و ...
به همين سادگي ...
من برنامه اتون رو نگاه نكردم ، اما اگر ذهنتون رو با برنامه هاي آمادهه تنبل نكنيد و تنها روش رو ازشون ياد بگيريد ، خيلي راحت مي تونيد اين مشكلات رو رفع كنيد و ذهنتون رو قوي تر كنيد ...
موفق باشيد.
يا علي.
ممنون از راهنماییتو دوست عزیز
در مورد دما متاسفانه کاری که گفتین رو انجام دادم ولی نتیجه نداد
دما خیلی با واقعیت تفاوت داشت
![Sad Sad](https://www.iranled.com/forum/images/smilies2/sad.gif)
ولی به هر حال مشکلم حل شد ممنون
در مورد ساعت هم ممنون نزدیک 10 خط برنامه ای که من نوشته بودم رو به 1 خط تغییر داد
سلام
دوستان من برنامه با ز نوشتم برای lm35 که تو پروتئوس درست اجرا میشه ولی پروگرام که میکنم کار نمیکنه
اینم بدنامه:
کد:
[align=left]#include <mega32.h>
#include <delay.h>
#define ADC_VREF_TYPE 0xC0
int o;
unsigned int read_adc(unsigned char adc_input)
{
float t;
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
t=((ADCW*2.56)/1023)*100;
return t;
}
void main(void)
{
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
DDRD=0b11111111;
while (1)
{
o=read_adc(0);
if(o<5)
{
PORTD.0=1;
PORTD.1=0;
PORTD.7=0;
}
if(o>=5 & o<10)
{
PORTD.1=1;
PORTD.2=0;
PORTD.0=0;
}
if(o>=10 & o<15)
{
PORTD.3=0;
PORTD.2=1;
PORTD.1=0;
}
if(o>=15 & o<20)
{
PORTD.3=1;
PORTD.4=0;
PORTD.2=0;
}
if(o>=20 & o<25)
{
PORTD.4=1;
PORTD.5=0;
PORTD.3=0;
}
if(o>=25 & o<30)
{
PORTD.5=1;
PORTD.6=0;
PORTD.4=0;
}
if(o>=30 & o<35)
{
PORTD.6=1;
PORTD.5=0;
PORTD.7=0;
}
if(o>35)
{
PORTD.7=1;
PORTD.6=0;
PORTD.0=0;
}
}
}
[/align]
مدار دو هم عینه تو پروتئوس رو بردبستم ولی کار نمیکنه
پروتئوس رو من چند بار دیگم گفتم خیلی از چیز ها رو چک نمی کنه بنابراین معتبر نیست مثلا ممکنه سنیور شما توانایی اندازه گیری دمای منفی رو نداشته باشه ولی پروتئوس به شما نشون بده
کار نمی کنه یعنی چی تیکه تیکه باید بری جلو برنامه اصلا اجرا می شه؟
سلام ببخشید سیستمم خراب شد دیر رسیدم
نه گمونم برنامه اجرا میشه ولی از سنسو lm35 سیگنالی که میاد خونده نمیشه اخه همیشه دما صفر در میاد سنسور رو عوض کردم بازم بازم نشد و یه سوال هم داشتم پورت انالوگ رو باید فعال کرد یا اگه کد مربوط به انالوگ رو بنویسی خودش فعال میشه؟
شما يه ولت متر بردار و ببين پايه ي ADC اي كه سنسور بهش وصل هست چند ولت هست...
شما پايه هاي GND و VCC سنسور رو وصل كن و ولتاژ پايه ي وسط ( data ) رو نسبت به GND اندازه بگير.
اگر رو ولتمتر مقدار داشتي ، پس احتمال 99% سنسور سالم هست.
حالا به ميكرو وصل كن و ويژگي ADC پورت A رو فعال كن و ولتاژ پايه ي ميكرو هم بگير ( اوني كه به سنسور وصله )
بعد تو برنامه مقدارش رو روي LCD كاراكتري نشون بدهه ... ( جدا از اين برنامه اي نوشتي ... )
اگر سنسور سالمه و عددي نشون نداد ، يا كد نويسيت مشكل دارهه يا ميكرو .
راستي مي دوني كه ولتاژ بيشتر از 5 به ADC نبايد بدي وگرنه ADC مي رهه هوا ، ( اين كار رو كه نكردي ... ؟ )
موفق باشي.
يا علي.
راستي اگر از ولتاژ مرجع داخلي براي ADC استفاده مي كني ، كه فكر كنم اين كار رو كردي ، پايه ي AREF رو با يه خازن به زمين وصل كن ... احتمال 90% مشكلت همينجاست ...
يا علي.
سلام
من با دوتا سنسور امتحان کردم البته یه بار پایه های هر دو رو اشتباه زدم ولی فکر نکنم سوخته باشن
قبلا هم برنامه نوشتم ولی با پورت انالوگ اصلا کار نکردم
این کدمه
#include <mega32.h>
#include <delay.h>
#define ADC_VREF_TYPE 0xC0
int o;
unsigned int read_adc(unsigned char adc_input)
{
DDRD=0b11111111;
PORTD.1=1;
delay_ms(200);
PORTD.1=0;
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
DDRD=0b11111111;
while (1)
{
PORTD.0=1;
delay_ms(250);
o=read_adc(0);
o=((o*2.56)/1023)*100;
if(o==0)
{
PORTD.5=0;
PORTD.6=1;
PORTD.7=0;
goto e;
}
if(o<10)
{
PORTD.5=1;
PORTD.6=0;
PORTD.7=0;
goto e;
}
if(o>=10)
{
PORTD.5=0;
PORTD.6=0;
PORTD.7=1;
goto e;
}
e:
}
}
ویژگی انالوگ رو چجوری فعال میکنن
بعد خازن رو هم عدسی 104 به زمین زدم ولی بازم نشد
تو برمانه سه تا ال ای دی هست که اگه دما صفر بشه وسطی ، زیر 10 سمت چپ و بالای 10 سمت راستی روشن میشه و همیشه وسطی روشنه حتی وقتی سنسور رو درمیارم
میکرو هم mega32 هست زیاد باهاش ور نرفتم سالمه
اگر VCC و GND رو اشتباهي جاي همديگه زدي ،كه سوخته ...
![Biggrin Biggrin](https://www.iranled.com/forum/images/smilies2/biggrin.gif)
دوست عزيز ،شما ولتاژ پايه data ي سنسور رو بگير ، حله ...
اصلا جاي سنسور ، يه ولتاژ دستي به پايه ي ADC بدهه ،مي توني با پتانسيومتر هم ولتاژ متغيير رو ايجاد كني ...
باز مي گم ، براي تست برنامه و اشكال يابي ،بايد برنامه رو بشكوني و پله پله همه رو چك كني ،همش با هم نمي شه ...
براي تست ،كد برنامه ات رو سادهه كن ...
نمايش مقدار روي LCD خوبه ...
چون توي پروتوس جواب دادهه ،احتمالا config اش درست بودهه ...
براي خازن هم ،نمي دونم دقيقا با چه ظرفيتي بايد باشه ، اما اگر از مرجع داخلي استفادهه مي كني ،حتما بايد باشه ...
با 1uf هم امتحان كن ...
تيكه ، تيكه حركت كن ...
موفق باشي.
يا علي.