اطلاعیه

Collapse
No announcement yet.

راهنمایی در حل تمرین

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

    راهنمایی در حل تمرین

    سلام بچه ها

    باز من مزاحمتون شدم
    بابا به خدا استاد یاد نمیده و فقط میگه اینو برید انجام بدید

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


    اولین سوالم اینه




    میخوام با زدن Switch
    ah+al کنه اما به چه صورت به این صورت که مثلا al داریم 1111 اون بیت چهارم یعنی چپ ترین 1 به عنوان علامت عدد باشه
    و همچنین برای ah بیت چهارمش بیت علامت در نظر بگیریم


    بعد در جوابشم باید بیت چهارم یعنی ال ای دی چپ به عنوان علامت عمل کنه



    سوال دومم



    که اون سویچ ها به int0 و int1 وصل هستن و یه شمارنده داریم که مقدار اولیه اون صفر است
    و با هر بار زدن سویچ پایین که به int1 وصل هست اگر لبه بالارونده بود به شمارندمون یک واحد اضاف بشه
    و با هر بار زدن کلید بالا که به int0 وصل هست اگر در لبه پایین رونده بود یک واحد از شمارنده کم بشه

    لطفا کمک کنید



    #2
    پاسخ : راهنمایی در حل تمرین

    برای شما که رشته تون نرم افزارا باید راحت بتونید الگوریتم بنویسید، کمی هم AVR بلد باشید دیگه همه چی حله.
    اینم مد نظر داشته باش اگر ورودیات باشن 0111، اونوقت سر ریز خواهی داشت.
    راه سادش اینه که هر چی میگی بنویسی :

    1. دو تا ورودی داری. یکی به 4 بیت کم ارزش وصله و دیگری به 4 بیت پرارزش. خوب اینارو که می تونی بخونی. بعد بیا و دو تا عدد و دو تا متغیر (یا بیت) برای علامتشون نگه دار.
    کد:
    .
    .
    .
    char AL,AH ;
    char AL_sign,AH_sign;
    .
    .
    if (PINB.0) {
    	AL=PINA & 0x07 ;
    	AH=PINA & 0x70 ;
    	AL_sign=PINA.3 ;
    	AH_sign=PINA.7 ;
    	delay_ms(100) ;
    .
    .
    .
    خوب الان دو تا عدد داری با علامتاشون. بقیه اش دیگه برنامه خالی برای خروجی هستش.

    2. وقفه رو توی همون کدویزارد تنظیم کن روی همون مدی که میخوای. (بالارونده یا برعکس) . توی تابع وقفه یکی به PORTA اضافه یا کم کن.
    ---------
    .
    .
    ...........

    دیدگاه


      #3
      پاسخ : راهنمایی در حل تمرین

      عزیزم منی که کار نکردم اصلا

      چیجور باید بلد باشم

      اون وقفه رو لطفا بازش کن و مفصل تر بهم بگین

      در ضمن ویزارد نباد باشه
      باید کد بنویسیم

      دیدگاه


        #4
        پاسخ : راهنمایی در حل تمرین

        بچه ها لطفا کمکم کنید
        :sad:

        دیدگاه


          #5
          پاسخ : راهنمایی در حل تمرین

          متاسفانه با راهنماییتون نتونستم

          چون تا حالا انجام ندادم از اینتراپت

          وقتی انجام نداده باشم و آشنایی نداشته باشم

          راهنمایی کردن به چه دردم میخوره

          :sad:

          دیدگاه


            #6
            پاسخ : راهنمایی در حل تمرین

            بچه هاااااااااااااااااااااا؟؟؟؟

            :cry2:

            دیدگاه


              #7
              پاسخ : راهنمایی در حل تمرین

              شما که تا حالا با وقفه کار نکردین بهتر بود با کد ویزارد کدتون را می نوشتید بعد رجیستر های مربوط به وقفه را که براتون مقدار دهی شده بود را نگه میداشتید.اگه هم نخواید از کد ویزارد استفاده کنین که باید برین دیتاشیت مگا 8 را بخونید و با توجه به جدول هاش خودتون مقادیر ریجیستر را استخراج کنید، که بازم به همون مقادیری می رسید که کد ویزارد به شما داده بود.
              به هر حال بعد از تنظیم کردن دو تا وقفه روی لبه ی بالارونده سه تا رچیستر این مقادیر را به خودشون میگیرن
              کد:
              GICR|=0xC0;
              MCUCR=0x0F;
              GIFR=0xC0;
              که این سه خط باید توی تابع main قبل while باشه.دو تا تابع وقفه هم اضافه میشه بالای main
              کد:
              interrupt [EXT_INT0] void ext_int0_isr(void)
              {
              // Place your code here
              
              }
              
              // External Interrupt 1 service routine
              interrupt [EXT_INT1] void ext_int1_isr(void)
              {
              // Place your code here
              
              }
              حالا اگه وقفه صفر فعال بشه برنامه هر جا باشه میاد توی تابع اولی و دستورات داخلش را انجام میده و میره ادامه ی کاری که داشته انجام میداده را از سر میگیره و اگه وقفه 1 فعال بشه هم همینطور.
              یعنی شما کافیه توی تابع اولی شمارنده را کم کنید و توی تابع دومی شمارنده را افزایش بدید.
              یه کار دیگه هم که باید بکنین اینه که وقفه سراسری را فعال کنید.یعنی یه قسمتی از رجیستر ها میاد مشخص میکنه که کلا وقفه ها اجازه رخ دادن دارند یا نه.در حالت کلی غیر فعاله.یعنی هیچ وقفه ای نمیتونه رخ بده.واسه فعال کردنش تز دستور
              کد:
              #asm("sei")
              و برای غیر فعال کردنش هم
              کد:
              #asm("cli")
              که #asm نشان دهنده ی اینه که اسمبلی اند.
              sei یعنی set i
              cli یعنی clear i
              i هم همون بیت مربوط به وقفه سراسریه.وقتی set میشه یعنی 1 شده و وقفه فعال میشه.
              پس شما تو همون main دستور اولی را هم میزنین
              آیا جهالت نیست که آدمی ساعات شیرین امروز را فدای روزهای آینده کند؟

              دیدگاه


                #8
                پاسخ : راهنمایی در حل تمرین

                ممنون دوست عزیز

                این جواب شما باعث شد بهتر بتونم سرچ کنم و یه چی پیدا کردم که بدردم میخوره ظاهرا

                فقط اگه میشه شماره ای از خودتون در پیام خصوصی بذارید تا اگه مشکلی داشتم خبرتون کنم بیاید نت بهم کمک کنید البته این یه خواهش هست

                دیدگاه

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