اطلاعیه

Collapse
No announcement yet.

سوال در مورد وقفه خارجی

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

    سوال در مورد وقفه خارجی

    سلام دوستان
    میخواستم بدونم که رجیستر MCUCR چیکار میکنه؟ آخه من یه برنامه دارم که یه بار این رجیستر رو 2 کرده و یه بار 3. میخوام ببینم این 2 و 3 کردن چیکار میکنه؟
    کد:
    interrupt [EXT_INT0] void ext_int0_isr(void){
      count++;
      if(h2==0){
        if(bitcount < 11 && bitcount > 2){
         data=(data >> 1);
         if(PIND.7==1)
           data=(data|0b10000000);//bargh20.com
        }
        MCUCR=3;
        h2=1;
      }
    
      if(h2==1){
        MCUCR=2;
        h2=0;
        if(--bitcount==0){
         out=data;
         bitcount=11;
        }
      }
    }
    یه سوال دیگه ای که دارم اینه که توی اتمگا 128 این رجیسترای وقفه خارجی اسمای دیگه ای دارند!! رجیستراش ایناس:
    EICRA=0x08;
    EICRB=0x80;
    EIMSK=0x82;
    EIFR=0x82;

    چطوریه؟ oo:
    www.gam-co.blogsky.com

    #2
    پاسخ : سوال در مورد وقفه خارجی

    آقا طی تحقیقاتی که به عمل اوردم (!!) اینا رو متوجه شدم:
    رجیستر های EICRA و EICRB در Atmega128 همان وظیفه رجیستر MCUCR در Atmega32 را برعهده دارد.
    رجیستر EIMSK در Atmega128 همان وظیفه GICR در Atmega32 برعهده دارد.
    رجیستر EIFR در Atmega128 همان وظیفه GIFR در Atmega32 را برعهده دارد.

    ولی وظیفه رجیستر MCUCSR توی اتمگا 128 بر عهده چه رجیستریه؟
    من برنامه بالا که برای اتمگا 32 نوشته شده رو بخوام به اتمگا 128 تبدیل کنم باید بجای MCUCR که یک بار 2 و یک بار 3 شده چی بنویسم؟؟


    www.gam-co.blogsky.com

    دیدگاه


      #3
      پاسخ : سوال در مورد وقفه خارجی

      خب شما چک کنید ببینید مثلا اون 2 و3 کردن چه کار میکنه که حدس میزنم حساسیت به لبه ها رو تغییر میده...توی سری مگا 32 و 16 و ...
      توی این سری از رجیسترهای MCUCR و MCUCSR واسه تغییر نوع حساسیت ها استفاده میشه...
      باید دیتاشیت مگا 128 رو چک کنید ببینید اون اعداد چه لبه هایی رو تعیین میکنن..
      تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

      www.intelart.ir


      ساخت کنترلر دما PID فازی با AVR [آموزشی]

      دیدگاه


        #4
        پاسخ : سوال در مورد وقفه خارجی

        آخه خود کدویژن رجیستر ها رو بصورت هگز مقدار دهی میکنه. ولی اینجا مقدارشو فقط 2 و 3 کرده. آیا این 2 و 3 معادل همون 0x02 و 0x03 هستش؟

        یه سوال دیگه: من بجای D.0 از F.0 استفاده کردم و همونطور که میدونید دسترسی بیتی به پورت f و g نداریم. حالا من بجای این عبارت چی باید بنویسم:؟
        کد:
        if(PIND.7==1)
        www.gam-co.blogsky.com

        دیدگاه


          #5
          پاسخ : سوال در مورد وقفه خارجی

          MCUCR=2 مربوط به لبه falling برای int0 هست
          MCUCR=3 مربوط به لبه rising برای int0 هست
          .
          معادلش برای atmega128 میشه>
          EICRA=0X02
          EICRA=0X03
          ضمنا رجیستر EIMSK باید برابر 0x01 باشه.معادل همون GICR تو مگا32 هست برای فعال کردن INT0

          دیدگاه


            #6
            پاسخ : سوال در مورد وقفه خارجی

            سوال دوم رو کسی پاسخ نمیده؟؟؟
            یه سوال دیگه: من بجای D.0 از F.0 استفاده کردم و همونطور که میدونید دسترسی بیتی به پورت f و g نداریم. حالا من بجای این عبارت چی باید بنویسم:؟
            کد: [انتخاب]

            if(PIND.7==1)
            www.gam-co.blogsky.com

            دیدگاه


              #7
              پاسخ : سوال در مورد وقفه خارجی

              آیا این 2 و 3 معادل همون 0x02 و 0x03 هستش؟
              نه اینطور نیست...شما باید اعداد رو به باینری تبدیل کنید تا بدونید کدوم بیت ها تغییر میکنند...
              البته مقدار دهی به اینصورت که بنویسیم 2 یا بنویسیم 0xfa اصلا اصولی نیست و بعدا وقتی کسی بخاد برنامه رو چک کنه مثل الان سردرگم میشه!
              لینک زیر توضیحاتی در مورد این مقدار دهی ها گذاشتم
              http://www.eca.ir/forum2/index.php?topic=86792.msg535228#msg535228
              تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

              www.intelart.ir


              ساخت کنترلر دما PID فازی با AVR [آموزشی]

              دیدگاه


                #8
                پاسخ : سوال در مورد وقفه خارجی

                آیا این 2 و 3 معادل همون 0x02 و 0x03 هستش؟
                نه اینطور نیست...شما باید اعداد رو به باینری تبدیل کنید تا بدونید کدوم بیت ها تغییر میکنند...
                البته مقدار دهی به اینصورت که بنویسیم 2 یا بنویسیم 0xfa اصلا اصولی نیست و بعدا وقتی کسی بخاد برنامه رو چک کنه مثل الان سردرگم میشه!
                لینک زیر توضیحاتی در مورد این مقدار دهی ها گذاشتم
                http://www.eca.ir/forum2/index.php?topic=86792.msg535228#msg535228
                تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                www.intelart.ir


                ساخت کنترلر دما PID فازی با AVR [آموزشی]

                دیدگاه


                  #9
                  پاسخ : سوال در مورد وقفه خارجی

                  نوشته اصلی توسط vahidabedi
                  سوال دوم رو کسی پاسخ نمیده؟؟؟
                  واسه همینه که میگن از دستورات استاندارد استفاده کنید...
                  اصلا این دسترسی بیتی یه چیزیه که تو خود کدویژن تعریف شده و در زبان برنامه نویسی c هیچ اساسی نداره!
                  میتونید از ماکروهای زیر استفاده کنید :

                  [code=c]#define gbi(port,bit) ( ( (port) & (1 << (bit) ) ) >> (bit) )
                  #define cbi(port, bit) (port) &= ~(1 << (bit))
                  #define sbi(port, bit) (port) |= (1 << (bit))
                  [/code]
                  تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                  www.intelart.ir


                  ساخت کنترلر دما PID فازی با AVR [آموزشی]

                  دیدگاه


                    #10
                    پاسخ : سوال در مورد وقفه خارجی

                    ممنون از پاسختون.
                    من خودم وقتی میخوام یه پین رو یک کنم اینجوری یک میکنم:
                    کد:
                         PORTG |= (1<<4);//یک کردن پین 4
                    حالا فقط میخوام بدونم بصورت شیفتی مثل بالا، چطور باید اینو بنویسم:
                    کد:
                    if(PINF.4==){
                    
                    }
                    میدونم این دستور بالا توی کدویژن درست نیس. من بصورت همین شیفت دادن چی باید بنویسم بجاش؟

                    نه اینطور نیست...شما باید اعداد رو به باینری تبدیل کنید تا بدونید کدوم بیت ها تغییر میکنند...
                    البته مقدار دهی به اینصورت که بنویسیم 2 یا بنویسیم 0xfa اصلا اصولی نیست و بعدا وقتی کسی بخاد برنامه رو چک کنه مثل الان سردرگم میشه!
                    لینک زیر توضیحاتی در مورد این مقدار دهی ها گذاشتم
                    حالا توی برنامه اومده 2 و 3 گذاشته این به چه معناست؟ بالاخره برنامش داره کار میکنه دیگه پس اشتباه نیس ولی اصولی نیس! اگه 2 همون لبه پایین رونده و 3 همون لبه بالا رونده باشه پس این 2 و 3 با توجه کدویژن معادل 0x02 و 0x03 میشه.
                    www.gam-co.blogsky.com

                    دیدگاه


                      #11
                      پاسخ : سوال در مورد وقفه خارجی

                      من بصورت همین شیفت دادن چی باید بنویسم بجاش؟
                      از همون دیفاین GBI در بالا گذاشتم استفاده کنید...اینم بگم که در اسمبلی هم همینطوریه و میتونید از sbi , cbi , gbi استفاده کنید....

                      بله درسته 2 با 0x02 برابره...منظورم این بود که به باینری ببینید چی میشه...مثلا 3 میشه 0b11 خب حالا ببینید دوبیت کم ارزش توی اون رجیستر نماینده چی هستن اگه اون دو بیت یک بشن اینتراپت روی چه مدی کانفیگ میشه...حالا همون کانفیگ رو روی میکرو مد نظر خودتون پیاده کنید...
                      تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                      www.intelart.ir


                      ساخت کنترلر دما PID فازی با AVR [آموزشی]

                      دیدگاه


                        #12
                        پاسخ : سوال در مورد وقفه خارجی

                        نوشته اصلی توسط vahidabedi
                        حالا توی برنامه اومده 2 و 3 گذاشته این به چه معناست؟ بالاخره برنامش داره کار میکنه دیگه پس اشتباه نیس ولی اصولی نیس! اگه 2 همون لبه پایین رونده و 3 همون لبه بالا رونده باشه پس این 2 و 3 با توجه کدویژن معادل 0x02 و 0x03 میشه.
                        داداش شما برای مقدار دادن به یه رجیستر حتما نباید از مبنای دسیمال استفاده کنی.مثلا عدد 2 با 00000010 با 0x02 هیچ فرقی نداره و قانون خاصی برای مقدار دادن به رجیست یا متغیر یا پورت نمیشه گذاشت.
                        مثلا این 3تا شبیه هم هستن.
                        PORTA=2
                        PORTA=0X02
                        PORTA=00000010

                        دیدگاه

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