PDA

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



syamak
23-07-2013, 02:07
سلام دوستان
من میخوام اعداد 1 تا f رو روی 7seg نمایش بدم با ATMEGA16
3تا کلید دارم که میخوام با زدن کلید اول، یک واحد به عدد نمایش داده شده اضافه بشه و نمایش داده بشه
با زدن کلید دوم یک واحد کم شده و نمایش داده بشه
و با زدن کلید سوم، اعداد از صفر مجددا شمارش بدم
ممنون میشم کسی کمک کنه

vahidasm
23-07-2013, 02:31
سلام با کدوم کامپایلر؟؟
خودتون برنامه ای نوشتین؟؟؟؟؟

amiray
23-07-2013, 14:12
سلام
برای راه اندازی سون سگمنت دو روش وجود داره یکی این که با استفاده از 7447 (برای کاتد مشترک ها) اینکار رو انجام بدیم که اولا فقط چهار تا از پورت های میکرو رو اشغال میکنه دوما عدد رو مستقیما نشون میده یعنی اگه چهار پایه به پورت B0..3 وصل باشه اگه بنویسیم PORTB=8;
روی سون سگمنت 8 رو نشون میده.
البته این دیکودر فقط برای اعداد 1-9 هست.(البته تست نکردم)
روش بعدی هم اینه که مستقیما بیایم بیایم هفت پایه سون سگمنت رو به میگرو وصل کنیم. و بعد اگه اون پورت رو مثلا قرار 1111111 سون سگمنت عدد 8 رو نشون میده یعنی باید بیایم اعداد باینری متناظر هر عدد رو پیدا کنیم.(هر پایه متناظر با یکی از پایه هاست).
که یکم برنامه زیاد میشه.
:wink:

syamak
24-07-2013, 00:52
با کامپایلر کدویژن
مشکل من اینجاست که چطور باید کاری کنم که وقتی برنامه داره اعداد رو نشون میده، با زدن کلید، شمارش یک واحد به عقب یا جلو بیفته..
یا با زدن کلید صفر بشه..

dostajn
24-07-2013, 11:39
با کامپایلر کدویژن
مشکل من اینجاست که چطور باید کاری کنم که وقتی برنامه داره اعداد رو نشون میده، با زدن کلید، شمارش یک واحد به عقب یا جلو بیفته..
یا با زدن کلید صفر بشه..
سلام
بنده با کدویژن کار نکردم اما برای اینکه کارتون راه بیافته راه حل تقریبی رو می گم شاید بدردتون بخوره(اگه برای avr-gcc خواسته بودین راحتتر می تونستم راهنمایی کنم):
به صورت کلی یه متغییر counter تعریف میکنید که برای نشان دادنش هی باقیمانده تقسیم متغییر بر مضرب ده رو به عنوان یه عدد یک رقمی روی سگمنت نشون میدید،‌مثلا اگه 753 باشه:
753٪10==>عدد ۳ روی اولین سگمنت نمایش داده بشه
753٪100==>عدد۵ روی دومین سگمنت نمایش داده بشه
753٪1000==>عدد7 روی سومین سگمنت نمایش داده بشه
و....
در رابطه با کاهش یا افزایش این متغییر شما می تونید دو کار انجام بدید:

1- اگه بخواین با وقفه کارکتین باید از یک میکرو با ۳ تا اینتراپت (مثلا مگا۱۶)‌استفاده کنید و هر کدوم از کلید ها رو به این سه تا وقفه متصل کنید و در زیربرنامه وقفه تغییرات رو اعمال کنید
مثلا اگه
++ INT0==> counter
-- INT1==> counter
و...
2-به صورت معمول هم می تونید توی همون حلقه main چک کنید که ورودی تغییر کرده یانه :
مثل در نظر بگیرید هر کدوم از کلیدها به پین a میکرو متصله و مقاومت پول آپ هم فعال شده:

void check(void){
if(!(pina.0 and pina.1 and pina.2) ){
flag++;
if (flag==50){
if (!(pina.0))
counter++;
if (!(pina.1))
counter--;
if (!(pina.2))
counter=0;
flag=0;
}

}

}
یه نکته تو پایان بگم من از متغییر flagاستفاده کردم برای اینکه از نویز در امان باشم و از اینکه کلیدی فشرده شده مطمپن بشم یعنی کاربر حدودا ۳۰ تا ۴۰ میلی ثانیه پایه رو نگه داره تا درخواست تغییر داده بشه