حداکثر فرکانس قابل تولید بصورت نرم افزاری روی پین های غیر pwm در AVR:
حداکثر سرعت تغییرات روی پین ها بصورت نرم افزاری به زمان اجرای دستورالعمل های اسمبلی مرتبط در میکروکنترلر مورد نظر بستگی دارد. در AVR برای تغییر وضعیت پین های برخی از پورت ها بصورت بیتی می توان از دستورات اسمبلی sbi و cbi استفاده کرد. زمان اجرای این دستورالعمل ها در اکثر شماره های AVR معادل دو سیکل کلاک cpu و در سری Reduced Core tinyAVR تنها یک سیکل کلاک cpu است. بنابراین قابلیت تغییر بیتی پین ها در یک کلاک cpu معین در شماره ای مثل Attiny10 دو برابر سریعتر از مثلا ATmega2560 است. اگر از طریق این دستورالعمل ها وضعیت یک پین بصورت متوالی set و reset شود، فرکانس لحظه ای شکل موج ایجاد شده بسته به خانواده مورد استفاده Fcpu/4 یا Fcpu/2 خواهد بود. مثال برای ایجاد سه سیکل متوالی روی پین 0 از PORTB:
sbi portb,0
cbi portb,0
sbi portb,0
cbi portb,0
sbi portb,0
cbi portb,0
علاوه بر sbi و cbi وضعیت تمام بیت های یک پورت را می توان بصورت همزمان توسط دستور اسمبلی out تغییر داد که البته این دستورالعمل در برخی شماره ها روی همه پورت ها عمل نمی کند. از آنجایی که زمان اجرای دستورالعمل out برای همه خانواده ها تنها یک سیکل کلاک cpu است، پس با استفاده هوشمندانه از آن می توان سیکل های متناوبی با فرکانس لحظه ای Fcpu/2 را ایجاد کرد. مثال برای سه سیکل متوالی روی پین 0 از PORTB در شرایطی که بقیه پین ها 0 باشند:
clr r16
ldi r17,1
...
out portb,r16
out portb,r17
out portb,r16
out portb,r17
out portb,r16
out portb,r17
اما در صورت نیاز به ایجاد یک حلقه مسئله متفاوت است و پرشی که لازم است در انتهای حلقه قرار داده شود، زمان بندی را تغییر می دهد. حداقل زمان اجرای پرش، دو سیکل است که با لحاظ حداقل دو سیکل برای set و reset شدن پین می توان به شکل موجی با فرکانس Fcpu/4 رسید که بخش های Low و High آن متقارن نیستند:
loop:
sbi portb,0
cbi portb,0
rjmp loop
در مثال بالا اگر از خانواده ای استفاده شود که زمان اجرای دستورالعمل های sbi و cbi در آن دو سیکل باشد، فرکانس شکل موج نهایی Fcpu/6 خواهد بود. برای ایجاد تقارن باید تاخیری را بعد از set کردن پین اضافه کرد که باعث کاهش فرکانس می شود. نتیجه کلی اینکه با استفاده صحیح از دستورالعمل های cpu امکان تولید سیکل هایی با فرکانس تا حداکثر Fcpu/2 روی پین ها وجود دارد که در صورت استفاده از حلقه این فرکانس کاهش می یابد.
حال وقتی با زبان های سطح بالا مثل C و BASIC برنامه می نویسیم، بسته به اینکه کد را چطور بنویسیم و از چه کامپایلری استفاده کنیم و کامپایلر را در چه سطحی از Optimization قرار دهیم، کامپایلر دستورالعمل هایی را جایگزین خطوط برنامه سطح بالا می کند که می تواند منجر به زمان بندی متفاوتی شود. مثلا اگر در زبان C برای تولید یک شکل موج بصورت نرم افزاری نوشته شود:
while(1) PORTB^=0x01;
کامپایلر کد بالا را با معادل اسمبلی شبیه کد زیر جایگزین می کند:
loop:
ldi r16,1
in r17,portb
eor r17,r16
out portb,r17
rjmp loop
که خروجی این کد شکل موجی با فرکانس Fcpu/12 را روی PORTB0 ایجاد خواهد کرد.
از توضیحات بالا می توان نتیجه گرفت که رسیدن به حداکثر قابلیت های یک سخت افزار وابستگی کاملی به روش و ابزارهای کدنویسی دارد و در یک سخت افزار ثابت، استفاده از روش های نرم افزاری مختلف می تواند منجر به نتایج متفاوتی شود.
@KnowledgePlus
Post #801
7.65K