اطلاعیه

Collapse
No announcement yet.

سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

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

    سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

    سلام و عرض ادب خدمت دوستان گرامی

    1 - در ATMEGA32 کدوم رجیسترها در برنامه نوشتن با قرار دادن 1 بر روی فلگ یا فلگ هاشون که از قبل 1 کردیم یا 1 شده اند؛ صفر میشن؟مثلا : در رجیستر PORTA اگر پین شماره صفر را 1 کرده باشیم آیا با دستور (PORTA =(1<<PORTA0 خروجی صفر میشود ( و LED خاموش میشود؟) ؟
    واسه رجیستر PORT ها و DDR ها که انجام دادم فلگ های 1 با نوشتن 1 بصورت بالا 0 نشدند: حالا سوال اینه که مگه قرار نیست همه فلگ رجیسترها با نوشتن 1 روی 1 هاشون صفر بشن؟؟

    2 - در برنامه نویسی زبان سی در محیط کدویژن؛ تاگل کردن پایه های پورت ها به چه صورت هست؟ (PORTA ^=(1<<PORTA5 دقیقا چجوری باعث تاگل میشن؟
    و چه تفاوتی بین دستورهای ^ و ! و ~ برای تغییر وضعیت بیت و بایت وجود داره ؟ ( چون دیدم بعضی فقط روی بیت و بعضی روی بایت جواب میده!)

    3 - (TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10 با
    (TCCR1B = (1 << WGM12)|(1 << CS11)|(1 << CS10 از لحاظ دستوری چه تفاوتی دارند ؟ ( با و بدون علامت | )

    4- آیا volatile کلاس حافظست؟ ( مثلا volatile int x ) در چه مواقعی کاربرد داره؟ (لطفا ساده توضیح بدین چون یسری مطالب از سایتها خوندم ولی متوجه نشدم) اگرpfd یا سایتی که توضیح جامع دادن معرفی کنین ممنون میشم.

    پیشاپیش تشکر واسه پاسخگویی دوستان

    #2
    پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

    نوشته اصلی توسط milad.mohammadi373 نمایش پست ها
    سلام و عرض ادب خدمت دوستان گرامی

    1 - در ATMEGA32 کدوم رجیسترها در برنامه نوشتن با قرار دادن 1 بر روی فلگ یا فلگ هاشون که از قبل 1 کردیم یا 1 شده اند؛ صفر میشن؟مثلا : در رجیستر PORTA اگر پین شماره صفر را 1 کرده باشیم آیا با دستور (PORTA =(1<<PORTA0 خروجی صفر میشود ( و LED خاموش میشود؟) ؟
    واسه رجیستر PORT ها و DDR ها که انجام دادم فلگ های 1 با نوشتن 1 بصورت بالا 0 نشدند: حالا سوال اینه که مگه قرار نیست همه فلگ رجیسترها با نوشتن 1 روی 1 هاشون صفر بشن؟؟

    2 - در برنامه نویسی زبان سی در محیط کدویژن؛ تاگل کردن پایه های پورت ها به چه صورت هست؟ (PORTA ^=(1<<PORTA5 دقیقا چجوری باعث تاگل میشن؟
    و چه تفاوتی بین دستورهای ^ و ! و ~ برای تغییر وضعیت بیت و بایت وجود داره ؟ ( چون دیدم بعضی فقط روی بیت و بعضی روی بایت جواب میده!)

    3 - (TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10 با
    (TCCR1B = (1 << WGM12)|(1 << CS11)|(1 << CS10 از لحاظ دستوری چه تفاوتی دارند ؟ ( با و بدون علامت | )

    4- آیا volatile کلاس حافظست؟ ( مثلا volatile int x ) در چه مواقعی کاربرد داره؟ (لطفا ساده توضیح بدین چون یسری مطالب از سایتها خوندم ولی متوجه نشدم) اگرpfd یا سایتی که توضیح جامع دادن معرفی کنین ممنون میشم.

    پیشاپیش تشکر واسه پاسخگویی دوستان
    سلام
    1-ببینید همه ی رجیستر ها که حاوی فلگ نیستند / بعضی رجیستر ها حاوی فلگ هستند که با این خاصیتی که شما اشاره کردید میشه صفرشون کرد . (فکر میکنم برای شما این اشتباه پیش اومده که تمام بیتهای رجیستر ها از نوع فلگ هستند- منتها توجه کنید که فقط بعضی از بیتهای رجیستر هایی که تو دیتاشیت اشاره شده ،فلگ هستند)
    اما رجیستر پورت حاویبیت های فلگ نیست که بشه با نوشتن یک روی بیتی که یک هست اونا صفر کنید .
    این پست از استاد کینژاد هست:
    نکته مهم در کدنویسی برای پاک کردن فلگ های AVR:
    استفاده از عملیات Read-Modify-Write برای پاک کردن فلگ های مختلف در رجیسترهایی که بیش از یک فلگ در آنها وجود دارد، می تواند منجر به پاک کردن ناخواسته سایر فلگ ها شود. برای درک بهنر، فرض کنیم که در یکی از شماره های AVR مانند mega32 از تایمر 0 به این صورت استفاده شده باشد که فلگ سرریز تایمر 0 در رجیستر TIFR بررسی شود و بعد از یک شدن، با نوشتن یک در محل آن پاک شود. اگر برای پاک کردن فلگ سرریز تایمر 0 مانند کد C زیر عمل شود:
    TIFR|=(1«TOV0);
    این روش یعنی خواندن رجیستر و OR کردن آن با یک عدد و نوشتن مجدد حاصل OR در محل رجیستر، می تواند باعث پاک کردن ناخواسته سایر فلگ های موجود در رجیستر TIFR شود. زیرا اگر بصورت همزمان مثلا TOV1 هم برابر یک باشد، نوشتن مقدار حاصل از OR به دلیل وجود قبلی یک در محل این بیت باعث پاک شدن TOV1 خواهد شد. بنابراین استفاده از اپراتور =| در صورت استفاده همزمان از سایر فلگ های موجود در آن رجیستر یک عمل اشتباه است که می تواند منجر به نتایج ناخواسته شود.
    روش صحیح برای پاک کردن هر فلگ بدون اینکه تغییری در بقیه فلگ ها ایجاد شود، استفاده از اپراتور = است که در این حالت هر فلگی که در محل آن یک نوشته شود، پاک می شود و بقیه فلگ ها در صورتی که یک باشند، با نوشته شدن صفر در محل آنها تغییری نمی کنند و همچنان یک باقی می مانند. روش درست مقداردهی برای این مثال به این صورت است:

    TIFR=(1«TOV0);

    در سایر زبان های برنامه نویسی هم برای چنین شرایطی باید از عملیات Read-modify-write خودداری شود و رجیستر بصورت مستقیم با عدد مناسب مقداردهی شود. این مطلب برای سایر میکروکنترلرهایی مانند XMEGA که برخی فلگ های آن با نوشتن یک پاک می شوند، برقرار است.
    knowledgePlus@
    اتمام نقل قول از استاد کینژاد
    2-تو کدویژن هم تاگل کردن اینجوری هست :PORTA.1=!PINA.1
    با این عبارت بیت یکم از پورت A تاگل میشه /
    ! و ~ :این دو علامت برای نات کردناستفاده میشن /اولی برای نات کردن یک بیت و دومی برای نات کردن یک بایت (یا بیشتر بستگی به نوع متغیر داره)
    PORTA.1=!PINA.1
    PORTA=~PINA
    --
    عملگر ^ هم هملیات Xor را انجام میده .
    (PORTA ^=(1<<PORTA5
    این عبارت میاد و عدد 1 را 5 بیت به چپ شیفت میده و با کل بیتهای پورتA ، ایکس اور میکنه / با توجه به جدول صحت عملگر ایکس اور ، فقط بیت 5 از پورت A را نات میکنه و بقیه ی بیت ها دست نخورده باقی میمونن.
    4-
    https://www.eca.ir/forums/thread15078.html

    موفق باشی
    جدیدترین ویرایش توسط mohamad0; ۲۰:۴۲ ۱۳۹۶/۱۱/۰۵.
    محمد.م

    دیدگاه


      #3
      پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

      نوشته اصلی توسط mohamad0 نمایش پست ها
      روش صحیح برای پاک کردن هر فلگ بدون اینکه تغییری در بقیه فلگ ها ایجاد شود، استفاده از اپراتور = است که در این حالت هر فلگی که در محل آن یک نوشته شود، پاک می شود و بقیه فلگ ها در صورتی که یک باشند، با نوشته شدن صفر در محل آنها تغییری نمی کنند و همچنان یک باقی می مانند.
      تشکر میکنم واسه پاسخ های جامعی که دادین .
      متعاقبا پرسشی دارم :از لحاظ ریز دستورالعمل اگر TIFR = 0b0000 0101 یعنی اینکه TOV0 و TOV1 هر دو 1 باشندّا دستور TIFR = (1<<TOV1 چطور هردو رو صفر میکنه ؟
      مگر غیر از اینه که TIFR= TIFR | 0b0000 0100 ؟ *****فکر میکنم از لحاظ باینری متوجه دستور شیفت دادن تو رجیسترها نمیشم!******
      -- اگر که درست متوجه شده باشم، واسه رجیسترهایی مثل TIFR بهتره ازاپراتور = و برای رجیسترهایی مثل PORT و DDR ، از اپراتور =| استفاده بشه؟ ( البته خیلیم متوجه نشدم)
      -- (کتاب زبان C قمی + جزوه آقای سپاس یار + آموزشهای اینترنت + زبان C فراردس خوندم ولی باز متوجه خیلی از کدنویسهای کدویژن نمیشم مخصوصا شیفت و OR ،، اگر علاوه بر پاسخگویی منبع جامعتری هم واسه زبان C در کدویژن معرفی کنید ممنون میشم .)

      دیدگاه


        #4
        پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

        سلام
        فلگ ها برعکس بیت های عادی با نوشتن 0 پاک نمیشن،بلکه با موشتن 1 پاک میشن .
        فرض کنید مقدار داخل TIFR بعد از سرریز تایمر صفر باشه 0b00000001 و شما میخواهید پرچم سرریز تایمر صفر را صفرش کنید . اگه بنویسید TIFR=0b00000000 این عبارت باعث صفر شدن پرچم نمیشه ،چون پرچم ها(پرم هایی که یک شدن )را فقط با نوشتن یک روشون میشه صفر کرد.شما باید بنویسید TIFR=0b00000001 تا پرچم را صفر کنه . بعد از اجرای این خط ،مقدار TIFR برابر با صفر خواهد بود (یعنی پرچم صفر شده)
        حالتی را فرض کنید که مقدار داخل TIFR بعد از سرریز تایمر صفر باشه 0b00000001 و شما میخواهید پرچم سرریز تایمر صفر را صفرش کنید . اما در همین حین تایمر یک هم سر ریز میشه و مقدارTIFR برابر میشه با 0b00000101 حالا شما اگه بنویسید TIFR=0b00000001 این باعث میشه که تاخل فلگ سرریز تایمر صفر فقط عدد1 نوشته بشه و اونا پاک کنه و فلگ های دیگه دست نخورده باقی بمونن .
        اما اگه بنویسید TIFR|=0b00000001 این دستور میاد و اول مقدار رجیستر TIFR را با عدد 0b00000001 اور میکنه که حاصلش میشه :0b00000101 , و در نهایت عدد 0b00000101 را داخل TIFRقرار میده که این عدد هم باعث پاک شدن فلگ سر ریز تایمر صفر میشه (مطابق میل ما ) و هم باعث پاک شدن فلگ سر ریز تایمر یک میشه (بصورت پیش بینی نشده و دور از انتظار ما ) که در این صورت دیگه سر ریز تایمر یک دیده نخواهد شد .
        راستی یک نکته این که فلگ ها خودشون توسط سخت افزار یک میشن و شما اونا را با نوشتن یک داخلشون صفر میکنید . نه اینکه شما فلگ ها را مقدار دهی کنید . (مثل پورت ها که شما داخلشون عدد مینویسید و اونا را مقدار دهی میکنید نیست ،چون کار برد فلگ ها اینه که شما را از وقوع یک عمل یا رویداد مطلع میکنن (مثلا سر ریز یا اتفاق وقفه یا.......) )

        متعاقبا پرسشی دارم :از لحاظ ریز دستورالعمل اگر TIFR = 0b0000 0101 یعنی اینکه TOV0 و TOV1 هر دو 1 باشندّا دستور TIFR = (1<<TOV1 چطور هردو رو صفر میکنه ؟
        مگر غیر از اینه که TIFR= TIFR | 0b0000 0100 ؟ *****فکر میکنم از لحاظ باینری متوجه دستور شیفت دادن تو رجیسترها نمیشم!******
        TIFR = (1<<TOV1 این عبارت با TIFR= TIFR | 0b0000 0100 معادل نیست ،از این جهت که تو حالت اول مقدار TIFR با 0b0000 0100 مقدار دهی میشه و در نتیجه فقط tov1 پاک میشه / اما تو عبارت دوم ، اول مقدار TIFR خونده میشه و با 0b0000 0100 اور میشه که در صورتی که بیت TOV0 هم یک باشه نتیجه ی عملیات اور 0b0000 0101 میشه که باعث میشه بیت TOV0 هم بطور نا خواسته صفر بشه .

        یک کتابی که من خودم از روش کار کردم کتاب مرجع کامل میکرو کنترلر های AVR هست- نوسنده: پرتوی فر -مظاهریان -بیانلو / کتاب خوبی هست و مفصل توضیح داده .

        فیلم هایی که توسط استاد کینژاد هم تهیه شده را حتما ببین ،جواب سوالاتتو توش پیدا میکنی .
        اینا فیلم های آموزش avr هست / تو شاخه آموزش آموزش های بسیار خوبی هست (برای ایکس مگا و مباحث آنالوگ )


        موفق باشید
        جدیدترین ویرایش توسط mohamad0; ۱۱:۴۳ ۱۳۹۶/۱۱/۰۶.
        محمد.م

        دیدگاه


          #5
          پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

          خیلی ممنون کااااملا متوجه شدم

          دیدگاه


            #6
            پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

            سلام مجدد خدمت دوستان
            سوالی ذهنمو درگیر کرده ء فلگ ها اگر که 1 باشند با نوشتن 1 روشون صفر میشن، سوالم اینه که حالا اگر فلگ 0 باشه اگرکه روشون بصورت نرم افزاری 1 بنویسیم 1 میشن ؟
            مثلا : (ADCSRA = (1<<ADIF یا TIFR = (1<< TOV0 اگر فلگشون صفر باشه و روشون 1 بنویسیم چی میشه؟

            دیدگاه


              #7
              پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

              نوشته اصلی توسط milad.mohammadi373 نمایش پست ها
              سوالی ذهنمو درگیر کرده ء فلگ ها اگر که 1 باشند با نوشتن 1 روشون صفر میشن، سوالم اینه که حالا اگر فلگ 0 باشه اگرکه روشون بصورت نرم افزاری 1 بنویسیم 1 میشن ؟
              مثلا : (ADCSRA = (1<<ADIF یا TIFR = (1<< TOV0 اگر فلگشون صفر باشه و روشون 1 بنویسیم چی میشه؟
              منبع set کردن Flag، سخت افزار است و نوشتن 1 در محل بیتی که از قبل 0 است تاثیر خاصی را ایجاد نمی کند.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : سوال : چه رجیسترهایی فلگ با 1 صفر میشوند؟؟ (+ چند سوال پایه!)

                نوشته اصلی توسط طراح نمایش پست ها
                منبع set کردن Flag، سخت افزار است و نوشتن 1 در محل بیتی که از قبل 0 است تاثیر خاصی را ایجاد نمی کند.
                مرسی جناب کی نژاد،، فیلمهای آموزش AVR رو دارم میبینم تشکر ویژه هم دارم واسه این آموزشها

                دیدگاه

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