PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : بررسی وقفه پورت سریال lpc2378



mzarkoob
15-12-2011, 16:17
این تایپیک را می زنم تا وقفه پورت سریال را بررسی کنیم. هم جاش خالیه هم کاربردیه. رجیسترهاش یه کم زیاده و گاهی وقتها آدم قاطیشون میکنه! مثل وقفه تایمر ساده فکر نکنم باشه. در آموزش های آقای تروشه پورت سریال بدون اینتراپت بررسی شده. اگر میکرو بخواهد دیتایی را دریافت کند به دستور scanf گیر می کند و این قدر منتظر می شود که تا بالاخره یه چیزی بیاد! خوب این جالب نیست که میکرو گیر کنه تا یه چیزی دریافت کنه.

صفحه 415 تا 418 دیتاشیت lpc2378 رجیسترهای وقفه را شرح داده است. از روی سیمولینک کیل که رجیسترها را نشان میده بهتر میشه فهمید چی به چیه که ضمیمه کردم.

از دوستانی که قبلا این قسمت را کار کردند، نظری ندارند؟

Aghaeifar
15-12-2011, 17:54
همونطور که در دیتاشیت می بینیم 5 تا منبع تولید وقفه برای پورت سریال هست
1- هنگام اتمام ارسال
2- هنگام اتمام دریافت
3- تایم اوت برای اتوباودریت
4- پایان اتوباودریت
5- و یکی هم وقفه ی مربوط به وضعیت خط Rx که من مفهومش را متوجه نشدم. ظاهرا مربوط به حالتی است که اگر در بیت توازن خطا رخ دهد یا داده ها over run شوند و یا در فریم دریافت داده خطایی باشد وقفه درخواست گردد.

در رابطه با scanf هم که عرض می کنید اینطور نیست، اگر به جای while از یک if استفاده کنیم دیگه اینقدر منتظر نمی ماند بلکه یه لحظه چک می کند اگر داده ای نبود به کارش ادامه می دهد با توجه به اینکه 16 بایت FIFO داریم اگر داده های زیادی از طریق پورت دریافت نشود و اینکه برنامه طولانی نباشد مشکل خاصی رخ نمی دهد.

mzarkoob
15-12-2011, 21:12
همونطور که در دیتاشیت می بینیم 5 تا منبع تولید وقفه برای پورت سریال هست
1- هنگام اتمام ارسال
2- هنگام اتمام دریافت
3- تایم اوت برای اتوباودریت
4- پایان اتوباودریت
5- و یکی هم وقفه ی مربوط به وضعیت خط Rx که من مفهومش را متوجه نشدم. ظاهرا مربوط به حالتی است که اگر در بیت توازن خطا رخ دهد یا داده ها over run شوند و یا در فریم دریافت داده خطایی باشد وقفه درخواست گردد.

رجیستر U0IER : با استفاده از این رجیستر 5 گزینه را می توان فعال کرد. در شکل قسمت Interrupt Enable مشخص می باشد:


You can see links before reply



1- RBR Interrupt Enable : بیت صفرم – با قرار گرفتن اولین خانه بافرFIFO در رجیستر RBR ، این وقفه فعال می شود.

2- THRE Interrupt Enable : بیت یکم - وقتی داده ای کامل ارسال شد و رجیستر ارسال خالی شد با یک شدن بیت THREاین وقفه فعال می شود.

3- RX Line Status Interrupt Enable : بیت دوم

4- ABEOIntEn : بیت هشتم – فعال ساز وقفه پایان اتوباودریت.

5- ABTOIntEn : بیت نهم - فعال ساز وقفه تایم اوت برای اتوباودریت.

خوب با این اوصاف اگه بخواهیم تا چیزی اومد وقفه فعال بشه و بره در زیر روال، باید RBR IE را فعال کنیم، یعنی : U0IER = 0x01 .

حالا ما این را تست می کنیم تا بعد بریم سراغ رجیستر U0IIR که تنظیم و تعیین نوع اینتراپت است.
اساتید اگه تجربهاشون را در اختیار قرار دهند بحث کامل تره میشه:hi:

mzarkoob
16-12-2011, 20:05
خوب یه کم دیر شد. من اومدم همه کارو با هم بکنم نشد. برای همین قدم قدم برم بهتره!

وقفه دریافت را فعال می کنیم:

U0IER= 0x01 // enable RBR IE
در حین اجرای برنامه، کاراکتری را ارسال می کنیم. برنامه به زیر روال وقفه می رود . خوب من این را تست کردم جواب میده! برای اینکه مطمئن باشیم، در زیر روال وقفه led1 روی برد را تنظیم می کنیم که تا یک چیزی فرستادیم و رفت در وقفه، روشن بشه. خوب اگه برنامه را دیباگ کنیم می بینیم که هیچ گاه از زیر روال وقفه بیرون نمی یاد چرا که در انتهای زیر روال باید وقفه ای که اومده را غیرفعال کنیم. این کار به راحتی با کلیک روی اینجا حاصل می شود:

You can see links before reply



با این کار بیت RDB هم که نشانه دریافت دیتایی است، غیر فعال می شود. ولی خوب این کارو چجوری میشه با رجیستر انجام داد؟

این جاست که یه کم گیر کردمcry::. چیزی که باعث این موضوع شده اینه که با دیباگ این دستور:

U0FCR=0x07;// enable RX fifo and TX fifo
به جای اینکه مقدار این رجیستر 0x07 بشه، میشه 0xC1 ! همین طور در قسمت Interrupt ID ، دو رجیسترU0IIR و U0FCRدر یک جا نشان داده شده است. وقتی وقفه بیاد مقدار این دو رجیستر میشه 0xC4 . حالا اگه بعد وقفه این رجیستر را بکنیم مثل قبل یعنی 0xC1، فلاک وقفه RDB میشه None ولی Rx Trigger میشه Level 3(14) ! خلاصه ما موندیم چطوری بعد اومدن وقفه، فلاگش را غیر فعال کنیم.8O

M.ABDOLLAHI
16-12-2011, 20:28
سلام من قبلا وقفه دریافت رو کار کردم انشاا... برنامه اش را میگذارم

mzarkoob
16-12-2011, 20:54
سلام من قبلا وقفه دریافت رو کار کردم انشاا... برنامه اش را میگذارم
آقا دست شما درد نکنه. اتفاقا قبلا دیدم در یک تایپیک گفتید که راش انداختید. می خواستم بهتون پیغام بدم که خودتون پیش قدم شدید. و اما در مورد مشکل گفته شده:

فکر کنم میشه این جوری این قضیه را سمبل کرد! دوباره در زیر روال وقفه قبل از خروج دستور:


U0FCR=0x07;

را می گذاریم. ولی اینجوری وقتی فقط یک کاراکتر کیبرد را فشار دهیم وقفه فعال می شود. ما می خواهیم تا یک مجموعه کاراکتر ارسال شد این وقفه فعال شود.

M.ABDOLLAHI
16-12-2011, 21:09
خواهش میکنم عزیزم نگاه کن اول این کتابخونه ها رو دانلود کن برای خیلی از تجهیزات LPC2378 برای دانلود برید به این پست pwm on LPC2378 - ایـــــــــران میـــــــکرو ™ (You can see links before reply)
بعد اینکه این هم یک مثال برای وقفه دریافت وقتی دیتا دریافت میشه LED حالتش برعکس میشه.
این هم لینک دانلود:
You can see links before reply

mzarkoob
16-12-2011, 23:43
این هم یک مثال برای وقفه دریافت وقتی دیتا دریافت میشه LED حالتش برعکس میشه.
این هم لینک دانلود:
You can see links before reply

من این برنامه را دیباگ کردم. همان طور که سوال کرده بودم دنبال این بودم که وقتی یک وقفه می آید چطوری یعنی با چه رجیستری فلاگ وقفه را درستش کنیم. در این برنامه بعد اجرای این دستور:

a=getchar0 (); اوضاع به حالت عادی قبل آمدن وقفه برمیگرده. یعنی اینطوری:

You can see links before reply

البته توقع من این بود که با یک تنظیم رجیستر این اتفاق بافتد و توقع نداشتم با خواندن یک کاراکتر خود به خود این اتفاق بیافتد! در اینجا این دستور:

U0IIR=1;هیچ نقشی انگار ندارد و زاید است!
همان طور که در پست قبلی ذکر شد انگار این دستور:

U0FCR=0x07;در زیر روال وقفه هم دقیقا همین کار را انجام می دهد. در هر صورت هم برنامه من هم برنامه ای که قرار دادید یک کار را انجام می دهد ولی با یک تفاوت جزئی. الان چیزی که دنبالش هستم این است که با زدن یک کاراکتر از صفحه کلید وارد روتین وقفه نشود(این کار با تنظیم RX Trigger قابل انجام است) بلکه وقتی جمله ای را ارسال کردیم وقفه انجام شود. مثلا در سی شارپ با دستور:

serialPort1.WriteLine(textBox1.Text);ارسالی انجام می دهیم. این ارسال می تواند کمی طولانی باشد.

M.ABDOLLAHI
17-12-2011, 07:25
سلام صبح همگی بخیر البته حالا اون قسمتی که بهد از دریافت چند بایت توی روتین وقفه میره رو من هر چی تست کردم نشد البته به یک نتایج نیمه کاره ای رسیدم ولیکن نشد که نشد... چون بافر دریافت در اصل توی هنگام وقفه دریافت تا 14 تا هم میتونه صبر کنه بعد یکجا اطلاعات رو بده خلاصه این یکی رو من نتونستم ببین طوری میتونیم کاریش کنیم.

M.ABDOLLAHI
17-12-2011, 07:25
سلام صبح همگی بخیر البته حالا اون قسمتی که بعد از دریافت چند بایت توی روتین وقفه میره رو من هر چی تست کردم نشد البته به یک نتایج نیمه کاره ای رسیدم ولیکن نشد که نشد... چون بافر دریافت در اصل توی هنگام وقفه دریافت تا 14 تا هم میتونه صبر کنه بعد یکجا اطلاعات رو بده خلاصه این یکی رو من نتونستم ببین طوری میتونیم کاریش کنیم.

mzarkoob
17-12-2011, 10:05
اون قسمتی که بعد از دریافت چند بایت توی روتین وقفه میره رو من هر چی تست کردم نشد البته به یک نتایج نیمه کاره ای رسیدم ولیکن نشد که نشد...
با تنظیم این رجستر:
U0FCR=0x47;بعد از اومدن 4 کاراکتر باید بره در روتین وقفه. در سیمولینک کیل که درست کار می کرد. ولی نمی دونم در برد چرا اولین کاراکتر را که می زدی میرفت در زیر روال و led1 را روشن می کرد!

M.ABDOLLAHI
17-12-2011, 11:30
خوب همینه دیگه من کلی وقت گذاشتم امتحان کردم نشد نمیدونم چرا اینطوری اگر به lpc1768 این مشکل رو نداشته باشه...

mzarkoob
17-12-2011, 12:31
خوب همینه دیگه من کلی وقت گذاشتم امتحان کردم نشد نمیدونم چرا اینطوری اگر به lpc1768 این مشکل رو نداشته باشه...
بعضی وقتها ناجور جواب میده. رو اعصاب آدم راه میره:xدلم می خواد :brk: ولی بیخیال...
فعلا می خوام همون یه کاراکتر ناقابلی که در وقفه اومد ،با:
code=getchar(); ازش استفاده کنم و بر اساس اون کاری انجام بدم. در یک برنامه جواب نیمه کاره میده در یکی دیگه نه. ولی بدون وقفه مشکلی نیست.

M.ABDOLLAHI
17-12-2011, 19:44
وقفه دریافت بایت تکی برای من قشنگ جواب میده هیچ مشکلیهم نداره تو یک مدار استفاده کردم با avr رابطه دادم...

mzarkoob
18-12-2011, 10:06
وقفه دریافت بایت تکی برای من قشنگ جواب میده هیچ مشکلیهم نداره تو یک مدار استفاده کردم با avr رابطه دادم...
سلام
من هم این را جواب گرفتم. مشکلی نداشت. یه ایراد داشت که از تنظیمات بود. حالا دارم روی دریافت یک متن دلخواه کار می کنم. ببینم چی میشه.