اطلاعیه

Collapse
No announcement yet.

ساخت ساعت زنگ دار با AVR

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ساخت ساعت زنگ دار با AVR

    سلام به همه ی دوستان.من می خوام یه ساعت بسازم با ATMEGA 16 که ین ساعت قسمت setting هم داشته باشه.من فعلا کد مر بوط به ساعت را نوشتم و از تامر 2 استفاده کردم،اما وقتی میخام تو قسمت setting برم مجبور هستم که از تابع
    interrupt [TIM2_OVF] void timer2_ovf_isr(void) خارج بشم و به تابع setting برم که در این صورت تایمر متوقف می شه و مثلا اگر بخوام تو setting آلارم ساعت رو تنظیم کنم تنظیم ساعت به هم می خوره.حلا می خوام لطف کنید و یه راه حل بم نشون بدید که چطور می تونم در حالی که به قسمت setting رفته باشم تایمر هم کار کنه و متوقف نشه.همچنین من زیاد به کار تایمر های میکرو آشنا نیستم لطفا به زبون ساده توضیح بدید.اگر مثال ساده ای از یک تایمر با setting دارید بزارید رو سایت .با تشکر فراوان.

    #2
    پاسخ : ساخت ساعت زنگ دار با AVR

    سلام ..................

    منظور دقیقتون از اینکه میفرمایید تایمر متوقف میشه چی هست؟ شما اگه از تایمر دو استفاده میکنید، معنیش این هست که از کریستال ساعت برای پایه های TOSC1 وTOSC2 استفاده کردید .. اگه از این کریستال استفاده کردید، معنیش این هست که باید در روال وقفه متغییری که Increment میشه رو تعریف کنید .. اگه متغییر رو در روال وقفه تعریف کردید ، دیگه نباید نگران توقف اجرای برنامه در موقعی که کار دیگه ای انجام میدید باشید .. اگه برای تنظیمات دستورات لازمه یا نمونه کدی لازم دارید، بفرمایید با چه کامپایلری کار میکنید، تا همینجا با کمک دوستان روی طرحتون صحبت کنیم .. موفق باشید ..
    دوستان! مدتی کمتر به سایت میام ..

    دیدگاه


      #3
      پاسخ : ساخت ساعت زنگ دار با AVR

      سلام
      می دونی که نحوه برنامه نویسی و کنترل زیربرنامه ها تو این مسئله مهمه. یه مسئله دیگه اینکه چه جوری از وقفه ها استفاده کنی. فکر کنم برای تغییر و تنظیم ساعت از وقفه خارجی استفاده کردی. اگه درست باشه می دونی که اولویت وقفه خارجی از تمام وقفه های داخلی بالاتره. به این معنی که در صورت هزمانی وقفه ها به وقفه خارجی اول پاسخ داده می شه. بعد از فراخوانی بدنه تابع وقفه و در هنگام ورود به آن ممکنه در اون بیت وقفه سراسری غیر فعال بشه و در انتها قبل از ترک تابع دوباره فعال بشه. در این صورت تازمانی که در بدنه تابع وقفه خارجی هستی در حالت طبیعی به وقفه داخلی (که اینجا تایمر باشه) پاسخ داده نمی شه چون وقفه سراسری غیر فعال شده.
      پیشنهاد اینکه تغییر ساعت رو در وقفه انجام نده و در بدنه اصلی برنامه نویسی کن و یا اگر می خوای این کار و بکنی و اصرار داری، از وقفه خارجی فقط برای گرفتن کلید استفاده کن. بقیه کنترلها رو در بدنه اصلی انجام بده. بنابراین برنامه ات رو بذار تا بهتر روش بحث کنیم. برای مشکل تنظیم آلارم و تغییر ساعت راه حل اینه که متغیرهای جدا در نظر بگیری. رو الگوریتم برنامه بیشتر باید فکر کنی.
      موفق باشی.

      دیدگاه


        #4
        پاسخ : ساخت ساعت زنگ دار با AVR

        راه ساده تری هم وجود داره ...
        برای من چنین مشکلی زیاد پیش اومده .
        کافیه ابتدای روتین وقفه خارجی با استفاده ازدستور SEI بیت I از MCUCR رو یک کنی که بقیه ی وقفه ها غیر فعال نشند .
        That`s It ...I`m out of here

        دیدگاه


          #5
          پاسخ : ساخت ساعت زنگ دار با AVR

          سلام.اول باید یک تشکر کنم از حسن توجه دوستان.این پروژه را امروز تکمیل کردم.اما هنوز اون اشکال اصلی رو داره.اولا وقتی دکمه ی مربوط به
          Setting رو می زنم باید حد اقل 1 تا 2 ثانیه نگه دارم تا بره تو منو.و دوم اینکه وقتی وارد setting و یا بقیه ی قسمت ها می شم تایمر وا میسه و تنظیم ساعت به هم می خوره.کد برنامه به همراه شماتیک اون رو گذاشتم.لطف کنید ببینید و به من کمک کنید.جویای نظرا تون در باره ی شکل برنامه نویسی و طراحی مدار هم هستم.من این برنامه رو تو code vision 2.03.4 نوشتم.راستی من دانشجوی ترم 3 مهندسی کامپیوتر هستم و چون علاقه ی زیادی به این چیزا دارم دنبالش اومدم و این 1 پروژه ی درسی نیست و از این رو خواستم بگم که زیاد به اصطلاحات الکترونیکی و مدارات اون ,وارد نیستم و خواستم خواهش کنم یک جوری بگید که منم بفهمم.با تشکر ففراوان.
          http://www.4shared.com/file/77655210/ad60cc92/Timer_Alarm.html

          راستی آقای erfanea من با C برنامه نوشتم و نمی دونم این دستوراتی که شما دادید چی هست و مر بوط به چه زبانی هست.لطفا کامل تر توضیح بدین.

          دیدگاه


            #6
            پاسخ : ساخت ساعت زنگ دار با AVR

            اون دستور یه دستور اسمبلیه که خیلی راحت میتونی توی C ازش استفاده کنی :
            کد:
            #asm(sei)
            That`s It ...I`m out of here

            دیدگاه


              #7
              پاسخ : ساخت ساعت زنگ دار با AVR

              برنامتون رو دانلود کردم ....
              ولی توی پروتئوس هیچ چیزی روی lcd نشون نمیده ..
              لطفا چک کنید ..
              That`s It ...I`m out of here

              دیدگاه


                #8
                پاسخ : ساخت ساعت زنگ دار با AVR

                برنامتون رو کامپایل کردم روی ال سی دی نوشت ...
                راجع به مشکل وقفه هم باید بگم که روش برنامه نویسیتوت اصلا جالب نیست ..
                اجرای تابع Main برا خارج شدن از وقفه کار هر کسی نیست .

                تمام مشکلات برنامه ی شما از این تابع هست که نباید با استفاده از حلقه ی While(1) بنویسی :
                کد:
                void menuSetting()
                {
                 while(!PINB.0){}
                 lcd_clear();//for display new page
                 
                 while(1)
                 {
                 lcd_gotoxy(1,0);
                 lcd_putchar(1);//display check mark
                 lcd_gotoxy(2,0);
                 lcd_putsf("SET Time");
                 lcd_gotoxy(1,1);
                 lcd_putchar(2);//display Uncheck mark
                 lcd_gotoxy(2,1);
                 lcd_putsf("SET Date");
                 lcd_gotoxy(0,1);      
                 lcd_putchar(3);//display down arrow       
                 lcd_gotoxy(19,1);      
                 lcd_putchar(4);//display select symbol       
                  
                 if(!PINB.1)
                  setTime();
                 else if(!PINB.0)
                 {
                  while(1)
                  {
                  delay_ms(200);
                  lcd_gotoxy(1,1);
                  lcd_putchar(1);//display check mark
                  lcd_gotoxy(1,0);
                  lcd_putchar(2);//display Uncheck mark
                   
                  if (!PINB.1)
                   setDate();
                  else if(!PINB.0)
                  {
                   lcd_clear();//for display new page
                   while(1)
                   {
                   delay_ms(200);
                   lcd_gotoxy(1,0);
                   lcd_putchar(1);//display check mark
                   lcd_gotoxy(2,0);
                   lcd_putsf("SET Alarm");
                   lcd_gotoxy(19,1);      
                   lcd_putchar(4);//display select symbol       
                    
                   if(!PINB.1)
                    setAlarm();
                   else if(!PINB.0)
                    main();
                   }
                  }
                  } 
                 }  
                 }
                }


                روتین برنامه رو به این ترتیبی که میگم بنویس هیچ مشکلی پیش نمیاد ..

                اول از همه برای وارد شدن به setting از وقفه یه خارجی استفاده کن .
                بعد یه متغیر سراسری به مثلا به اسم menu_mode تعریف کن که ابتدای تابع ستینگ مقدارش رو یک و هنگام خارج شدن از تابع ستینگ مقدارش رو صفر کن .
                در ابتدای تابع ستینگ دستور Sei رو به ترتیبی که توی پست قبل گفتم استفاده کن.

                در ابتدای این قسمت از برنامه نیز از Sei استفاده کن :

                کد:
                lcd_clear();    
                sprintf(lcd_buff,"Time = %d:%d:%d",hour, minute, second);
                lcd_gotoxy(4,0);
                lcd_puts(lcd_buff);
                sprintf(lcd_buff,"Date = %d/%d/%d",year,month,day);
                lcd_gotoxy(3,1);
                lcd_puts(lcd_buff);
                lcd_gotoxy(0,1);
                lcd_putchar(0);//display setting simbol
                و مهمتر از همه اینکه تابع ستینگت رو بدون while باید بنویسی .
                یعنی هر دو کلید از وقفه ی خارجی استفاده کنند و پس از رخ دادن وقفه این اتفاقات بیوفته


                پ ن :
                این برنامه رو میشه ماست مالی کرد و راه انداخت . ولی این روش برنامه نویسی شما اصلا جالب نیست .. یکم دیگه که برنامه طولانی بشه به مشکل بر میخورید . خواستم با روش درست برنامه نویسی مبتنی بر وقفه آشنا بشید ..

                خودم هم چند سال پیش چنین برنامه ای نوشتم (ساعت زنگدار با AVR و منو )
                That`s It ...I`m out of here

                دیدگاه


                  #9
                  پاسخ : ساخت ساعت زنگ دار با AVR

                  آقا erfanea سلام.همون طور که قبلا گفتم من تازه کارم و نباید ازم انتظار زیادی داشته باشید که مثل شما برنامه بنویسم :cry2: oo:.حالا بریم سر اصل مطلب:
                  1-منظورتون از"اجرای تابع Main برا خارج شدن از وقفه کار هر کسی نیست ." چیه؟چون من دیدم این راحت ترین کاره و شانسی جواب داد!!! : جز این کار چه کاری باید بکنم؟؟؟؟eek:
                  2-اینکه میگید برای وارد شدن به منو setting از وقفه ی خارجی استفاده کن چطوریه؟میشه یه مثال کوچیک بزنید؟ :question:
                  3-استفاده از اون متغیر سراسری که باید 0 و1 بشه چیه؟
                  4-اگر بخوام مثلا هر بار که یک ثانیه میشماره 1 LED به مدت 50ms روشن و خاموش بشه موجب به هم خوردن تنظیم ساعت نمیشه؟
                  5-لطفا اصلاح شده ی قسمت setting را برام بزارید.
                  6-من فلسفه ی این sei وcli رو نمیدونم فقط میدونم اولی برای فعال کردن interrupt و دوی برای غیر فعال کردنشه.لطفا کمی توضیح بیشتری بدین.اگر اون پروژه خودتونم دارین لفا بزارید تا ببینم چطوری شما نوشتید.
                  میدونم جواب دادن به این سوالات براتون زحمته اما برای من یه کاری بکنید :nerd: با تشکر. :bye

                  دیدگاه


                    #10
                    پاسخ : ساخت ساعت زنگ دار با AVR

                    1- چون برای این کار خیلی چیز ها رو باید در نظر بگیری ..
                    نمیدونم میدونید stack pointer چیه یا نه ؟ چون اگه چند بار این اتفاق بیوفته (مثلا 60 بار ) میکروتون هنگ میکنه .. اون مجبورید میکرو رو ریست کنید .
                    میتونید امتحان کنید :nice:


                    2- منظورم از وقفه ی خارجی همون External interrupt ه که کلید ها رو به پایه های INT0 یا INT1 یا INT2 وصل کنید .

                    3- شما قراره برنامتون توی وقفه گیر نکنه (while (1) نداشته باشید . یعنی اینکه هنگامی که توی منو ها هستید تایمر دو کار خودش رو انجام بده و از کار نیوفته . برای همین یه متغیر سراسری (Global variable ) تعریف میکنید که هر موقع وارد منو شدید مقدار این متغیر یک بشه . با استفاده از این متغیر میتونید تشخیص بدین که الان توی منو هستید و نباید ساعت و تاریخ هر یک ثانیه یکبار اتفاق بیوفته

                    4- این طور که برنامه نوشتید مشکل پیش میاد ولی اگه برنامتون رو اصلاح کنید هیچ زمانی کم نمییاد .

                    5- ........

                    6- میدونید که هنگامی که شما وارد یک وقفه شدید کامپایلر به صورت اتوماتیک با استفاده از CLI وقفه های دیگه رو غیر فعال میکنه . برای همینه که وقتی وارد ستینگ میشید دیگه تایمر دو کار نمیکنه . برای رفع این مشکل میتونید ابتدای روتین وقفتون از SEI استفاده کنید که وقفه های دیگه غیر فعال نشه .

                    اینم پروژه ی من . به برنامه دقت کنید ببینید میتونید منو رو مثل من پیاده کنید ؟

                    http://www.4shared.com/file/77784588...arm_Clock.html

                    موفق باشید :job:
                    That`s It ...I`m out of here

                    دیدگاه


                      #11
                      پاسخ : ساخت ساعت زنگ دار با AVR

                      سلام آقا عرفان.بالاخره تونستم از INT0 برای وارد شدن به setting استفاده کنم.البته بلد نبودم رجیستری هاشو تنظیم کنم اما یادم اومد که codevision خودش تو wizard درست میکنه.اون کد (asm(sei رو هم اونجا هایی که گفته بودی اضافه کردم.اما مشکل اینجاست که وقتی (while(1 رو تو setting بر میدارم ضرف 1 ثانیه از تابع بیرون میاد.فکر کنم مشکل از اون متغییر سراسری هست که باید 0 و 1 بشه.اما سوال اینه که روال کار برنامه باید چطور باشه؟یعنی باید یه شرط بزارم در تابع تایمر که هر یک ثانیه چک کنه که آیا اون متغییر 0 یا 1 هستش؟و اگر 1 بود بره تو تابع setting ؟؟؟اما وقتی(1) while باشه در تابع setting دیگه مشکل بیرون اومدن را نداره اما تایمر متوقف میشه!!! اصلا بم بگید که هیچ (1) while نباید در برنامم باشه؟؟؟؟ :question: راستی وقتی از sei در تابع setting استفاده میکنم نتنها سریعا بر میگرده به تابع تایمر بلکه اونا صفر هم میکنه!!! :cry2: همچنین برا INT0
                      Mode=low level هست.

                      دیدگاه


                        #12
                        پاسخ : ساخت ساعت زنگ دار با AVR

                        کم کم داری برنامه نویسی یاد میگیری :applause:
                        درستش اینه که از ستینگ بیرون بیاد .ولی روی lcd دیگه اطلاعات ریفرش نشه ..(با استفاده از متغیر سراسری) یعنی همون ستینگ روی صفحه بمونه .حالا تنها کاری که باید انجام بدی تعریف حالت های مختلف برای ستینگه ... یعنی تعیین کنی توی هر حالت کلید ها چه کاری انجام میدهند ...
                        اگه میتونی برنامه ی جدیدت رومجددا پلود کن تا بگم چجوری ادامش بدی :rolleyes:
                        That`s It ...I`m out of here

                        دیدگاه


                          #13
                          پاسخ : ساخت ساعت زنگ دار با AVR

                          سلام.آقا این مدت که نبودم درگیر امتحانات بودم.اما این پروژه را یه جورایی کامل کردم.البته باید بگم که اگه کمک های بی دریغ آقا عرفان نبود بعید بود که بتونم و در اینجا جا داره که یه تشکر حسابی ازش بکنم.اما خوب تو پروتئوس جواب نمیده ولی اگر تو میکرو بریزیم جواب میده.ولی من دو تا سوال برام پیش اومده:
                          1-من تو تاریخ متغیر های روز و ماه رو تو EEPROM میریزم اما وقتی برا اولین بار بعد از پروگرام کردن فراخوانی می شن به صورت اعداد منفی هستن ولی برا بار بعد که تنظیم میکنیم درست میشن حالا مشکل از کجاست و باید چطوری حلش کرد؟
                          2- من برای اینکه اعداد ساعت رو 2رقمی چاپ کنم باید یک شرط رو به 9 حالت بنویسم چون دستور مستقیمی برای چاپ اعداد متغییر رو LCD بلد نیستم.لطفا اگر راهی هست به منم بگید.با تشکر. :job:
                          اینم تکمیل شده ی پروژه:
                          http://www.4shared.com/file/83807872/6d2f9fda/Alarm_clock.html

                          دیدگاه


                            #14
                            پاسخ : ساخت ساعت زنگ دار با AVR

                            سلام ...............

                            شما یه متغییر تعریف کنید از نوع
                            کد:
                            *char
                            و بعد هم یه متغییر دیگه از نوع
                            کد:
                            char
                            بعد از این مرحله یه دستوری هست توی CodeVision به نام
                            کد:
                            itoa(char,char*)
                            که با اجرا کردن اون شما تونستید کاراکتر رو در داخل رشته قرار بدید .. بعد از این مرحله با دستور
                            کد:
                            lcd_puts(char*)
                            داده ی متغییرتون رو نمایش بدید .. اگه بد توضیح دادم بفرمایید تا یه مثال عملی براتون بزنم .. موفق باشید ..
                            دوستان! مدتی کمتر به سایت میام ..

                            دیدگاه


                              #15
                              پاسخ : ساخت ساعت زنگ دار با AVR

                              نوشته اصلی توسط hamid_P200
                              سلام.آقا این مدت که نبودم درگیر امتحانات بودم.اما این پروژه را یه جورایی کامل کردم.البته باید بگم که اگه کمک های بی دریغ آقا عرفان نبود بعید بود که بتونم و در اینجا جا داره که یه تشکر حسابی ازش بکنم.اما خوب تو پروتئوس جواب نمیده ولی اگر تو میکرو بریزیم جواب میده.ولی من دو تا سوال برام پیش اومده:
                              1-من تو تاریخ متغیر های روز و ماه رو تو EEPROM میریزم اما وقتی برا اولین بار بعد از پروگرام کردن فراخوانی می شن به صورت اعداد منفی هستن ولی برا بار بعد که تنظیم میکنیم درست میشن حالا مشکل از کجاست و باید چطوری حلش کرد؟
                              2- من برای اینکه اعداد ساعت رو 2رقمی چاپ کنم باید یک شرط رو به 9 حالت بنویسم چون دستور مستقیمی برای چاپ اعداد متغییر رو LCD بلد نیستم.لطفا اگر راهی هست به منم بگید.با تشکر. :job:
                              اینم تکمیل شده ی پروژه:
                              http://www.4shared.com/file/83807872/6d2f9fda/Alarm_clock.html

                              سلام ... امیدوارم که امتحاناتتون رو با موفقیت پشت سر گزاشته باشید .
                              من برنامتون رو دیدم .. چند تا مشکل کوچیک توش بود .
                              1- علت اینکه متغیر های EEPROM با اول مقدار درستی نشون نمیدند اینه که initialize نشدند . یعنی اینکه مقدار اولیه براشون تعریف نکردید. کافیه به یه مقدار اولیه براشون تعریف کنید
                              2- میتونی یه تابع تعریف کنید که براتون یه عدد رو چاپ کنه . در این صورت فقط یک if لازم خواهد بود . ورودی این تابع char و یک پرینت اف . ( هم دستوراتی دوستمون آقای حسام الدین گفتند )
                              3- دلیل اینکه توی پروتئوس جواب نمیده یکی از باگ های کدویژنه که با دستور printf مشکل داره .. کافیه وارد project >configure >c compiler بشید و مقدار (s)printf futures رو به long width تغییر بدید . و مجددا پروژتون رو کامپایل کنید تا توی پروتئوس هم اجرا بشه .
                              That`s It ...I`m out of here

                              دیدگاه

                              لطفا صبر کنید...
                              X