ايران ويج

نسخه‌ی کامل: مشکل وقفه سریال
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با عرض سلام خدمت دوستان با فعال کردن وقفه URXC یه مشکلی پیش میاد و اونم اینه که وقتی مثالا از دستور print استفاده میشه برنامه به سراغ label مربوط به دریافت میره و اون جا گیر میکنه سواله من اینه که چرا وقتی یه رشته رو با دستور print ارسال میکنم وقفه درسافت داده فعال میشه.
برای حل این مشکل اومدم وقفه سریال رو در هنگام ارسال خاموش کردم و بعد از دستور print دوباره فعال کردم ولی باز بعد فعال کردن سراغ دریافت داده میره و اونجا گیر میکنه.به نظر شما چطوری میشه این مشکل رو حل کرد من توی پروتوس شبیه سازی میکنم و از بسکام برای کد نوشتن مگا8 استفاده میکنم.
یه سواله دیگه هم دارم اینه که بافر ارسال و دریافت سریال جدا از همه یا اینکه یه بافره که برای هر دو استفاده میشه و بعد اینکه برای دسترسی به این بافر میشه توضیح بدیم با udr کار کردم ولی جواب مناسب رو نگرفتم
لطفا کد بذارید
بدون کد که نمی شه ولی ...
(۰۶-شهریور-۱۳۹۲, ۲۰:۲۲:۱۱)lilbibi نوشته است: [ -> ]برای حل این مشکل اومدم وقفه سریال رو در هنگام ارسال خاموش کردم و بعد از دستور print دوباره فعال کردم ولی باز بعد فعال کردن سراغ دریافت داده میره و اونجا گیر میکنه.
برای اینکه وقتی ارسال تموم میشه آخرین داده هنوز مونده و سرعت میکرو بیشتر از ارسال داده هست پس شما میای و وقفه رو فعال می کنی بعد تازه آخرین ارسال انجام میشه و وقفه روی میده.
نقل قول: به نظر شما چطوری میشه این مشکل رو حل کرد من توی پروتوس شبیه سازی میکنم و از بسکام برای کد نوشتن مگا8 استفاده میکنم.
به سختیBiggrin
باید کد برنامه رو بزارید
نقل قول: یه سواله دیگه هم دارم اینه که بافر ارسال و دریافت سریال جدا از همه یا اینکه یه بافره که برای هر دو استفاده میشه و بعد اینکه برای دسترسی به این بافر میشه توضیح بدیم با udr کار کردم ولی جواب مناسب رو نگرفتم
بله یکی هست و همون UDR هست.
جواب مناسب هم نگرفتید چون باید دقیقا طرز کار serial رو باید مشاهده کنید تا بتونید به درستی باهاش کار کنید
پیش نهاد من به شما مطالعه ی دیتاشیت و مشاهده ی مثال هاش هست که البته به زبون C نوشته شده ولی گویای همه چی هست اگه باز هم مشکلی بود کدی که خودتون نوشتید رو باید بازید تا مشکلش رو براتون دوستان توضیح بدن
با تشکر از جواباتون
ببنید این برنامه به این صورته که یه میکرو یه بسته اطلاعاتی رو یه میکرو دیگه میفرسته(باید به صورت بیسیم باشه که فعلا با سیم دارم امتحان میکنم) بعداون طرف بسترو نگاه میکنه و بنا به اون درخواستی که شده یه کاری رو انجام میده حالا من اومدم اینو تست میکنم که اگه بسته دریافتی مشکلی داشت یه به فرستنده اطلاع بده اسنم کد فرستنده:
کد:
$regfile = "m8def.dat"
$crystal = 1200000
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , Rs = Portb.0 , E = Portb.1
Config Portc.0 = Output
Enable Urxc
On Urxc Data_received
Enable Interrupts
$hwstack = 128
$swstack = 128
$framesize = 128


Dim Trs As Bit
Trs = 0
Cls
Dim Portdata As String * 13
Dim Portdata1 As String * 13
Do

Main:
Portdata = "*ttt*rrr145"
Reset Portc.0
Wait 1
Set Portc.0
Wait 1
Print Portdata
Wait 1
Loop
End


Data_received:
  If Ischarwaiting() = 1 Then
   Portdata1 = ""
   Input Portdata1
  Lcd Portdata1
  End If
Return
و اینم کد سمت گیرنده البته هر دو طرف باید به یه صورت کار کنن و کداشون یکی باشه ولی من این کد ها به صورت آزمایشی نوشتم که ببینم جواب میگیرم یا نه
کد:
$regfile = "m8def.dat"
$crystal = 1200000
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , Rs = Portb.0 , E = Portb.1
Config Portc.0 = Output
'Config Portc.1 = Input
Enable Urxc
On Urxc Data_received
Enable Interrupts
$hwstack = 128
$swstack = 128
$framesize = 128

Cls
Cursor Off
Dim Portdata As String * 12
Dim Portdata1 As String * 12
Dim Error As Byte
Error = 0
Main:
Do
Reset Portc.0
Wait 1
Loop
End




Data_received:
Input Portdata1
  Lcd Len(portdata1)
If Len(portdata1) = 12 Or Len(portdata1) = 11 Then
Set Portc.0
'Lcd Portdata1
Dim Pstring As String * 3
Dim Index As String * 1
Dim Sval As Integer
Dim Nval As Integer
Dim I As Integer
Dim J As Integer
Dim Count As Integer
Sval = 1
Nval = 3
Count = 0
'Lcd Len(portdata1)
For I = 1 To Len(portdata1)
Index = Mid(portdata1 , I , 1)
'Lcd Index
If Index = "*"then
Count = Count + 1
J = I + 1
Pstring = Mid(portdata1 , J , 3)
Lcd Pstring
Lcd "."
I = I + 3
End If
Next
If Count <> 3 Then
Print "*err*100*100"

End If
End If

Return

شکل واقعیه بسته باید به صورت "*123*145*999*" باشه تو بالا توی کد فرستنده نگاه کنید عمدا بسترو دستکاری کردم و یکی از اون جدا کنند ها رو ورداشتم وقتی که برنامه در هر دو طرف اجرا میشه فرستنده چون میره تو کما و توی input گیر میکنه یعنی با وحود اینکه هیچ داده ای دریافت نشده وقفه دریافت داده فعال میشه
راستی یه چیز درباره اون رشته ارسالی بگم که قسمت اول آدرس فرستنده دومی آدرس گیرنده سومی داده هستش البته میخوام طول اون رو افزایش بدم یه سری داده های کنترلی هم بزارم به نظر شما کاره درستیه که داده هایی که قراره به صورت یکجا ارسال بشرو به صورت string در بیاد؟فکر کنید داده ارسالی یه پکت tcp/ip هستش چون توی uart داده های رو به صورت 8 بیتی فرستاده میشه من این مشکلو پیدا کردم وقتی من نیاز دارم 8 بایت داده یا بهتر بگم یک آرایه از داده ها رو به صورت بسته با هم بفرستم مجبور شدم به صورت string استفاده کنم که ماشالا طولش زیاد شد.با تشکر از شما
کسی نیست جواب بده از دوستان؟؟؟
نکته ای که هست ، وقتی وقفه دریافت رخ می دهه ، شما بایستی از ریجستر UDR اطلاعات رو بخونید تا پرچم مربوطه پاک بشه و دوبارهه وقفه رخ ندهه.

سعی کنید روال وقفه رو سبک بنویسید. مثلا i=1 می شه و تمام ، بعد بر می گرده توی main و check می کنه که i==1 هست یا نه و ...

الان هم برنامه رو خیلی بد و تو هم توهم نوشتید ، نمی صرفه چک بشه ... .
از if , else if هم بجا استفاده کنید برای بهینه تر بودن کدها. کلا یه مقدار به کدهاتون نظم بدید.

گفتید فرستنده وقتی print می کنه ، وقفه ی دریافت خودش فعال می شه.
از ریجستر UDR بخونید ببینید چی دریافت می کنه.

موفق باشید.