TGViewer
KnowledgePlus.ir KnowledgePlus.ir @knowledgeplus · 5.51K subscribers
Post #801 7.65K
حداکثر فرکانس قابل تولید بصورت نرم افزاری روی پین های غیر 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
More from @knowledgeplus
  1. Oct 15, 2026درباره بازار کار بِکر مرتبط با رفع نیازهای مدارات سوئیچینگ @KnowledgePlus
  2. Aug 19, 2026در بخش پایانی فیلم Amadeus ساختهٔ سال ۱۹۸۴ برای نمایش نبوغ موتزارت، سکانسی دربارهٔ ساخت بخ…
  3. Jul 17, 2026چکیده ای از گفتگوی انجام شده در تاریخ ۱۴۰۵/۴/۲۵ با موضوعات: ۱- بیان مشکلات فعلی ۲- اهمیت ح…
  4. Feb 11, 2026با توجه به گران شدن بیش از حد قلع و سیم لحیم، به این نکته توجه کنید که وزن قرقره ها در نمو…
  5. Dec 12, 2025بعضی از پر بازدیدترین پست های کانال از ۱۰ سال پیش تاکنون: زرنگی در دو نسخه شباهت عملکرد مغ…
  6. Nov 26, 2025بخش هایی از گفتگوی انجام شده در تاریخ ۱۴۰۴/۹/۳ با موضوع نحوه قیمت گذاری پروژه ها @Knowledg…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →