ايران ويج

نسخه‌ی کامل: ارتباط RS-232
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
من با مگا32 یک پروژه نسبتا بزرگ دارم انجام میدم.
تو این پروژه نیاز هست به ارتباط میکرو با کامپیوتر (RS-232)
من برای این ارتباط یک پروتکل جهت جلوگیری از بروز خطا طراحی کردم.
توی میکرو از وقفه سریال استفاده کردم.
اما مشکل اینجاست که وقتی میکرو در حال انجام دستورات نسبتا پیچیده خودش است و کامپیوتر داده ای به اون ارسال میکنه ، میکرو هیچ عکس العملی نشون نمیده و جالب اینجاست که ریست میشه .
اینم بگم که وقتی میکرو دستوراتی رو انجام نمیده (در یک حلقه بی پایانه) این پروتکل به خوبی کار می کنه.
ممنون از کسی که کمکم میکنه.
احتمالا توی وقفه از متغیر هایی استفاده کردی که تو برنامه اصلی داره استقاده می شه یعنی اون متغییر ها وسط برنامه عوض می شن و این کاره برنامه رو سخت می کنه
اگه یه کمپایلر پیش پا افتاده هم داری استفاده می کنی از اون هم می تونه باشه
آقای مدیر سایت اولا ممنون
کامپایلر من بیس کامه. چطوره؟
فرض کنید برنامه میکرو کدهای زیر باشد. می بینید که متغیر های وقفه در طول برنامه تغییر نمي کنن.
ولی همچنان مشکلی که قبلا گفتم ، پابرجاست.
ممنون
$regfile = "m32def.dat"
$crystal = 8000000
Baud = 4800

Config Serialout = Buffered , Size = 1
Enable Interrupts
Enable Urxc
On Urxc Seria


do
Call Getime()
While

Sub Getime()
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte T(1) , Ack
I2crbyte T(2) , Ack ' MINUTES
I2crbyte T(3) , Ack ' Hours
I2crbyte T(4) , Ack ' Day of Week
I2crbyte T(5) , Ack ' Day of Month
I2crbyte T(6) , Ack ' Month of Year
I2crbyte T(7) , Ack ' Year
I2crbyte T(8) , Nack
I2cstop

T(1) = Makedec(t(1)) : T(2) = Makedec(t(2)) : T(3) = Makedec(t(3))
T(4) = Makedec(t(4)) : T(5) = Makedec(t(5)) : T(6) = Makedec(t(6))
T(7) = Makedec(t(7)) : T(8) = Makedec(t(8))
End Sub
'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Seria:
If Bar = 0 Then
Gd1 = Udr
Bar = 1
Else
Gd2 = Udr
Bar = 0
'-------------------------------------------------------------------------------
If Gd1 = Gd2 Then
Select Case Gd1
Case Chr(38) : Print Chr(40)
Case Chr(37):
Adrr = 20480
S = 1
Ct = 1
Case Chr(41):
S = 2
Print Chr(42)
Case Else:
'---------------------------------
If S = 2 Then
T(ct) = Gd1
Ct = Ct + 1
If Ct = 9 Then Call Setime()
Else : Call Write(adrr , Gd1)
End If
Print Chr(42)
'---------------------------------
End Select
'-------------------------------------------------------------------------------
Else :
Print Chr(43)
End If
End If
Return
'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS