با سلام
دوستان عزیز یه مشکل یا به عبارتی سوالی در مورد ارتباط یوزارت مطرح میشه اینه که بر فرض مثال فرستنده چندتا کاراکتر رو پشت سر هم میفرسته
ریسور هم براش دستور getchar() رو نزده باشیم تکلیف این سه 4 تا کاراکتر چی میشه؟
آیا از بین میرن یا داخل رجیستری ذخیره میشن؟
اگر از بین میرن تکلیف چیه
اگر که ذخیره میشن چجوری میشه بازبابیشون کرد و به چه ترتیبی میشه خارجشون کرد؟
اگر کسی این موضوع رو برای من روشن کنه ممنون میشم
با سلام
دوستان عزیز یه مشکل یا به عبارتی سوالی در مورد ارتباط یوزارت مطرح میشه اینه که بر فرض مثال فرستنده چندتا کاراکتر رو پشت سر هم میفرسته
ریسور هم براش دستور getchar() رو نزده باشیم تکلیف این سه 4 تا کاراکتر چی میشه؟
آیا از بین میرن یا داخل رجیستری ذخیره میشن؟
اگر از بین میرن تکلیف چیه
اگر که ذخیره میشن چجوری میشه بازبابیشون کرد و به چه ترتیبی میشه خارجشون کرد؟
اگر کسی این موضوع رو برای من روشن کنه ممنون میشم
اگه با Getchar کار میکنید ومیکرو هم در پورت سریالش FIFO نداره بایتها رو از دست میدید، میتونید روی وقفه دریافت در سریال یک FIFO نرم افزاری بنویسید و هر موقع که لازم بود اطلاعات رو از اون بخونید ولی اگه پر بشه باز هم اطلاعات از دست میره.
این FIFO که میگین رو تابع براش هست یا باید خودمون براش تابعی تعریف کنیم که مثلا کاراکتر اول رو دریافت کرد ذخیره کنه بعد بره سراغ کاراکتر بعدیو........
یه سوال دیگه ای که داشتم این بود که وقتی کاراکتری ارسال میشه و بعد از اون دیگه دیتایی از طرف فرستنده نیاد باید دقیقا همون لحظه getchar زده بشه یا اگه مثلا چند لحظه بعد از اینکه دیتایی فرستاده شد دستور getchart زده بشه اون دیتا خونده میشه یا بازم از بین میره؟
ببخشید سوالام زیاد شد،وقتی دیتایی فرستاده بشه روتین اینتراپت یوزارت گیرنده اجرا میشه که میشه اونجا کاراکترارو ذخیره کرد،درسته؟
اون وقت این وقفه اولویتش نسبت به بقیه وقفه ها مثه تایمر ADC اینا چجوریه
ممنون از توجهتون
این FIFO که میگین رو تابع براش هست یا باید خودمون براش تابعی تعریف کنیم که مثلا کاراکتر اول رو دریافت کرد ذخیره کنه بعد بره سراغ کاراکتر بعدیو........
یه سوال دیگه ای که داشتم این بود که وقتی کاراکتری ارسال میشه و بعد از اون دیگه دیتایی از طرف فرستنده نیاد باید دقیقا همون لحظه getchar زده بشه یا اگه مثلا چند لحظه بعد از اینکه دیتایی فرستاده شد دستور getchart زده بشه اون دیتا خونده میشه یا بازم از بین میره؟
ببخشید سوالام زیاد شد،وقتی دیتایی فرستاده بشه روتین اینتراپت یوزارت گیرنده اجرا میشه که میشه اونجا کاراکترارو ذخیره کرد،درسته؟
اون وقت این وقفه اولویتش نسبت به بقیه وقفه ها مثه تایمر ADC اینا چجوریه
ممنون از توجهتون
FIFO رو که باید خودتون بنویسید و با استفاده از اون دیگه نیازی به Getchar نیست. در وقفه FIFO پر میشه و در روتین برنامه یا هرجا که بخونیدش خالی میشه.
وقتی از Getchar استفاده میکنید، اون تابع تا زمان دریافت یک کاراکتر صبر میکنه، در نتیجه برنامه در اون تابع اونقدر چرخ میزنه تا یک کاراکتر در پورت سریال دریافت بشه که به روش Polling معروفه، ولی برای استفاده از پورت سریال و اجرای همزمان برنامه چندین روش وجود داره که روش وقفه و FIFO تنها یکی از اونهاست. با استفاده از این روش در زمان دریافت، اطلاعات به صورت ترتیبی در FIFO قرار میگیرند و هر موقع که مثلا تابع FIFO_Read رو به جای Getchar فراخوانی کنید دیگه منتظر دریافت نخواهید موند و بایتها رو به ترتیب دریافت میکنید تا FIFO خالی بشه، اگر هم خالی شد اون تابع FIFO_Read مقدار بازگشتیش، حالا مثلا اگه با بولین تعریف کرده باشید، به شما این امکان رو میده که متوجه خالی بودن FIFO بشید و از اون قسمت رد بشید و منتظر دریافت بایت بعدی مثل Getchar نمونید، هر موقع هم که بایت جدیدی اومد دوباره همه مراحل تکرار میشه.
مثلا اگه بین دوبار فرخوانی Getchar فاصله ای پیش بیاد و در اون زمان بایتهایی به پورت سریال فرستاده بشن، اگه FIFO نباشه اون بایتها روی بافر تک بایتی پورت سریال Overwrite میشن و از بین میرن.
درسته، در وقفه دریافت کافیه بایت دریافتی رو در FIFO بریزید.
اولویت وقفه ها در دیتاشیت کامپایلرها مشخصه، مثلا در IAR در Vector Table جدولی که مشخص کننده ترتیب و اولویت وقفه ها هست مشخص شده که به چه ترتیبی هست. میشه مشخصات اون جدول رو دستکاری کرد و اولویت ها رو جا به جا کرد، یکم تخصصی میشه و کار میبره چون در فایلهای مربوط به تنظیمات کامپایلره و در اختیار کاربر به صورت عادی نیست.
واقعا ممنون که انقدر با حوصله و دقیق پاسخ میدید
به عنوان آخرین سوالم من همین الان تو تنظیمات کد ویزارد کدویژن تنظیمات مربوط به یوزارت رو زدم تیک Interrupt رو هم فعال کردم انتظار داشتم تو برنامم یه روتینی مثه روتینای تایمر در اختیارم بذاره ولی اینجوری نشد
میشه بگید چجوری میشه به روتین وقفه یوزارت دسترسی پیدا کرد
واقعا ممنون که انقدر با حوصله و دقیق پاسخ میدید
به عنوان آخرین سوالم من همین الان تو تنظیمات کد ویزارد کدویژن تنظیمات مربوط به یوزارت رو زدم تیک Interrupt رو هم فعال کردم انتظار داشتم تو برنامم یه روتینی مثه روتینای تایمر در اختیارم بذاره ولی اینجوری نشد
میشه بگید چجوری میشه به روتین وقفه یوزارت دسترسی پیدا کرد
به نظر میرسه در CV از همون روش FIFO استفاده شده چون در تنظیمات مقدار Receiver Buffer رو هم میگیره، در مورد وقفه هم گزینه موردنظر در تنظیمات هست، کدش هم اینجا نمونش هست:
سلام وقتتون بخیر باشه :agree:
بخشی از پروژه ی پایانی من در مورد ارتباط سریال دو میکرو میباشد که قصد دارم موج سینوس رو از میکرو اول به میکرو دوم بفرستم ،همزمان دامنه و فرکانس رو از میکرو دوم به میکروی اول ارسال کنم.(و البته از دو تا کلید مخصوص به فرکانس ،یکی برای کم کردن و یکی برای زیاد کردن و 2تا کلید برای کم و زیاد کردن دامنه استفاده کردم ،که متصل هستند به میکروی دوم)
مشکلی که دارم اینه که اولا این کار رو با تابع وقفه ی خود usart نمیتونم انجام بدم ، دوم اینکه وقتی بدون تابع وقفه این کار رو میکنم برای ارسال فرکانس جواب میده اما برای دامنه مشکل داره،یعنی فرکانس با فشردن کلید ها کم و زیاد میشه اما دامنه با فشردن کلید ها تغییری نمیکنه :sad:
مشکل کجاس؟
Reveng will surely come... Your hard time are ahead
// - - - - - - - - - -
برگه های کتاب به منزله بالهایی هستند که روح ما را به عالم نور و روشنایی پرواز میآ*دهند. فرانسوا ولتر
// - - - - - - - - - -
اگر برای هرچیزی به غیر از علاقه ی شدیدتان به الکترونیک تلاش کنید ، خیلی دور نخواهید رفت / خیلی هم خوب نخواهید شد.
// - - - - - - - - - -
دیدگاه