·
همانطور كه ميدانيد وظيفه رجيستر در ميكرو نگهداري اطلاعات است، رجيسترهاي حافظه RAM در AVR از نوع هشت بيتي هستند و شما ميتوانيد اطلاعتتان را در قالب 8 بيت دران اين رجيسترها به عنوان حافظه موقت قرار بدهيد و از آنها استفاده كنيد. اما اين 32 رجيستر تفاوتي با بقيه رجيسترهاي RAM شما و رجيسترهاي با كاربرد خاص دارند و تفاوت اين هست كه اين 32 رجيستر مستقيما با ALU ميكرو در ارتباط هستند و شما براي انجام محاسبات نياز به اين داريد كه اطلاعات را در آنها قرار بدهيد تا بتوانيد به واحد ALU ارسال كنيد و از طريق همين رجيسترها هم بايد اطلاعات را از ALU دريافت كنيد، به عنوان مثال اگر شما ميخواهيد عدد 10 را با 20 جمع كنيد بايد حتما اين اعداد را از طريق اين رجيسترها به ALU ارسال كنيد، در بعضي از ميكروها فقط يك رجيستر هست كه مستقيما با ALU در ارتباط هست كه معمولا به Accumulator يا Working Register معروف هست و اين بستگي به نوع معماري تراشه دارد. در AVR اين 32 رجيستر نقش Accumulator را دارند. · در بعضي از دستورات شما ميتوانيد مستقيما از همه 32 رجيستر استفاده كنيد و آنها را كنترل كنيد . اما در بعضي از دستورات شما فقط به نيمه بالايي يعني از R16 تا R31 دسترسي داريد. مثلا در دستوراتي مانند SBR , CBR كه براي صفر و يك كردن بيتي رجيستر ها به كار ميروند محدوديت وجود دارد و شما نميتوانيد اين دستورات را براي رجيسترهاي R0 تا R15 هم مانند 16 رجيستر R16 تا R31 مستقيما به كار ببريد.
· بعضي از اين رجيسترها علاوه بر كاربرد اصلي كاربردهاي ديگري هم دارند، مثلا رجيسترهاي R31 , R30 را ميشود با هم به عنوان يك رجيستر 16 بيتي با نام Z در نظر گرفت و در آدرس دهي از آن استفاده كرد ( البته كاربردهاي ديگه هم دارد )، رجيستر هاي R29 , R28 هم ميتوانند با هم تركيب بشوند و همچنين رجيسترهاي R27 , R26 هم به همين صورت، رجيسترهاي ديگري هم در بعضي موارد كابردهاي خاص ديگري انجام ميدهند.
· مي توان گفت كه اگر ما فرض كنيم ALU به عنوان شاه در نظر گرفته شود ، اين شاه فقط به 32 نفر اعتماد دارد و اطلاعات را از اين 32 نفر مستقيما دريافت ميكند، كه در AVR اين 32 نفر همان 32 رجيستر R0 تا R31 هستند و ALU نميتواند مستقيما اطلاعات را از يك خانه از حافظه RAM بردارد و پردازش كند ، شما اگر بخواهيد يك عدد را هم وارد ALU كنيد بايد حتما آن عدد را در اين رجيسترها قرار بدهيد و از اين طريق عدد را براي پردازش به واحد محاسبه و منطق كه همان ALU هست ارسال كنيد. در زبان هاي سطح بالا مثل بيسيك يا زباني مثل C بيشتر اين كارها را كامپايلر براي شما انجام ميدهد و شما لازم نيست زياد وارد جزئيات كار اين رجيسترها بشويد، زماني كه شما يك متغيير را در زباني مثل C تعريف ميكنيد يك خانه از حافظه موقت به آن اختصاص داده ميشود ( كامپايلر براي آن در نظر ميگيرد ) و اگر شما دستوري مانند PORTB = 25 را بنويسيد كامپايلر خودش كدي را توليد ميكند كه ابتدا عدد 25 در يكي از اين رجيسترها كه اشاره شد ريخته شده و بعد از آنجا روي پورت B قرار گيرد ، در حالي كه در زبان اسمبلي كه يك زبان سطح پايين هست شما بايد حتما ابتدا اين عدد را در ثباتي مثل R16 بريزيد و سپس آن را روي پورت بريزيد، مثلا به اين صورت:
· LDI R16,25
· OUT PORTB,R16
· همانطور كه ميبينيد در خط اول مقدار 25 در رجيستر R16 كه نقش واسط را دارد ريخته شده و بعد از آن از رجيستر R16 خوانده شده و در رجيستر PORTB قرار ميگيرد. زماني كه شما يك خط دستور براي اينكار در C بنويسيد كامپايلر حداقل كاري كه براي آن انجام ميدهد اين است كه زمان اسمبل كردن برنامه اين دو خط را براي آن ايجاد ميكند . حالا اگر دستوراتي مثل دستور جمع يا ضرب و تقسيم هم مد نظر باشد روال كار همين است و شما از هر زباني كه استفاده كنيد به خاطر معماري تراشه اين اطلاعات بايد حتما توسط رجيسترهاي R0 تا R31 به ALU وارد بشوند و شما چه متوجه بشيود، چه نشويد و چه بخواهيد چه نخواهيد AVR براي اينكه بتواند عمليات محاسباتي شما را روي داده ها انجام دهد بايد از اين 32 رجيستر كمك بگيرد تا بتواند اطلاعاتتان را براي پردازش وارد بخش محاسبه و منطق كند ( ALU )
· تمام موارد فوق به معماري تراشه برمي گردد و معمولا براي برنامه نويسان اسمبلي مهم هست، كمتر پيش مي آيد كه برنامه نويسان زبان سطح بالا خودشان را با اين موارد درگير كنند و براي صرفه جويي در وقت اين كار به كامپايلر سپرده ميشود.
· در ميكروهايي مانند PIC ها شما همين كار را از طريق رجيستري با نام W انجام ميدهيد ( به خاطر نوع معماري و ساختمان داخلي متفاوت )، و هر عملياتي كه بخواهيد انجام بدهيد بايد اطلاعات از طريق اين رجيستر وارد ALU گردد و مثلا اگر بخواهيد مثال بالا را انجام بدهيد به اين صورت انجام مي شود:
· MOVLW .25
· MOVWF PORTB
· در خط اول مقدار 25 دسيمال در ثبات w قرار ميگيرد و در خط بعدي اين مقدار از w به PORTB منتقل ميشود.
· از اين لحاظ معماري AVR در اين قسمت نسبت به PIC اين برتري را دارد كه شما به جاي يك رجيستر در بيشتر موارد 32 رجيستر در اختيار داريد كه ميتوانند مستقيما با ALU در ارتباط باشند، البته معماري PIC هم اصولي تر از اين حرفهاست كه از اين بابت كمبودي احساس بشه !
· خلاصه: اين 32 رجيستر، رجيسترهاي مهمي هستند كه ALU فقط از آنها اطلاعاتش را ميگيرد و پردازش ميكند و مي توان گفت در هر برنامه اي كه نوشته بشه عدم استفاده از آنها به نوعي محال هست، البته در زبانهاي سطح بالا تقريبا اين موارد اصلا مطرح نيست و شما فقط متغير را تعريف ميكنيد و كامپايلر خودش زحمت اين كارها را ميكشد اما اگر بخواهيد كمي حرفه اي تر به قضيه نگاه كنيد در همان زبان ها نيز براش شما مهم ميشود كه متغيري كه تعريف ميكنيد در كجا قرار ميگيرد و چگونه كدي كه مينويسيد كامپايل ميشود، يكي از فاكتورها ضعف و قدرت كامپايلر ها اين هست كه به متغيرها مكان مناسبي اختصاص بدهند تا بتوانند دستور العمل ها را به بهترين شكل انجام دهند و كد اضافي توليد نكنند. به نظر من شما اگر با زبان هاي سطح بالا كار ميكني حتما به اين نكات هم دقت كن چون اگر حالا چندان هم داراي اهميت نباشد بعدها اهميت زيادي پيدا ميكند.