PDA

View Full Version : سوال درباره ی avr با سی++



mahdieh721
چهارشنبه 15 مهر 1394, 11:40 صبح
یک دیتای 8 بیتی به طور مدام از پورت B بخواند و بررسی کند اگر عدد زوج است استیک پالس مربعی با فرکان 1 مگاهرتز و اگر فرد است فرکانس با 2 مگاهرتز باشد.
من توی خواندن یک مقدار از پورت مشکل دارم میشه راهنماییم کنید

MortezaZandi
شنبه 16 آبان 1394, 17:04 عصر
سلام
می توانید از وقفه سر ریز تایمر برای خواندن مقدار بیت های ورودی به پین موردنظر استفاده نمایید، مثلا با فرض این که باود ریت منبع پالس 9600 بیت در ثانیه باشد
مقدار سرریز تایمر را طوری تنظیم کنید که 9600 بار در ثانیه سرریز اتفاق بیافتد و کد وقفه در زمان های مناسب بیت های ورودی به پین را بردارد.

در روش دیگه میتوانید خروجی منبع پالس را به پایه وقفه خارجی متصل کنید و وضعیت تریگر وقفه خارجی را به AnyChange تغییر دهید، بدین صورت با هر تغییر بر روی پین ورودی (High ، Low) کد وقفه اجرا می شود و شما قادر خواهید بود تا مقدار پین را در آرایه موردنظر خود ذخیر نمایید، و با رسیدن تعداد مقادیر خوانده شده به 8 عدد آن را برای استفاده بعدی به تابع دیگری بسپارید.
این روش بندرت استفاده می شود و یکی از معایب آن این است که تعیین نرخ انتقال فقط توسط منبع بیرونی پالس صورت میگیرد و شما دخالتی در آن ندارید. و عیب دیگر آن این است که در صورتی که دو بیت مساوی پشت سر هم به پین وارد شود فقط یکبار وقفه خارجی Trig می شود. و بکار گیری مکانسیم های خارجی مانند Pullup و PullDown لازم است.
بنابراین بهترین روش استفاده از منبع تولید پالس داخلی جهت زمانبندی نمونه برداری از ورودی می باشد که به کمک سرریز تایمر قابل انجام است.

MrFassih
چهارشنبه 20 آبان 1394, 01:50 صبح
سلام
به صورت کلی اگه بخواهی کل ۸ بیت روی یه پورت رو بخونی باید اینجوری کد بنویسی‌:
char temp;
temp = PINA;

اگه هم بخواهی فقط بدونی یه بیت چنده باید اینجوری کد بنویسی :
if ( PINA.0 == 1 ) {

} else {

}

که واسه این کاری که میخوای بکنی فقط تک بیت کافیه
چون کم ارزش ترین بیت مشخص کننده ی فرد یا زوج بودن عدد هستش.
توی مثال بالا اگه وارد if بشیم عددی که روی پورت A هستش فرده اگه وارد else بشیم زوجه.