سلام به همگی
تقریبا یه ماهه که سر این موضوع علافم!!!!
هیچ جای اینترنت هم چیزی راجبش که به دردم بخوره پیدا نکردم. هرچی هم که پیدا کردم یا با سریال ارتباط برقرار کرده بود یا با یه زبان برنامه نویسی دیگه. :angry: حالا برنامه کامل رو به همراه یه سری توضیح(که فکر کنم ناقصه و شما هم باید کمک کنید تا کاملشون کنیم) براتون میزارم تا شما هم مثل من بیخودی علاف نشید. بازم میگم که شاید توضیحات ناقص یا شایدم غلط باشه، پس اگه کسی میتونه توضیحات رو تصحیح یا کامل بکنه، حتما این کار رو بکنه.
1. این تیکه احتیاجی به توضیح نداره.
Config Sda = Portc.0
Config Scl = Portc.13. احتیاجی به توضیح نداره

این همه چیزی بود که میتونستم بگم. البته شاید برای یه عده زیادی حوصله سر بر باشه، اما باید این نکته رو در نظر گرفت که ممکنه یکی باشه که این چیزایی که گفتم براش تازه باشه. دیتا شیت رو هم یه نگاهی بندازید.
http://www.robot-electronics.co.uk/htm/srf02techI2C.htm
به هر حال امیدوارم که به دردتون خورده باشه.
تقریبا یه ماهه که سر این موضوع علافم!!!!

1. این تیکه احتیاجی به توضیح نداره.
$regfile = “m32def.dat"
2. اینجا پایه های دیتا و کلاک I2C رو تعریف میکنیم. البته باید حتما همون پایه هایی باشن که تو دیتا شیت آی سی به عنوان sda و scl هستند و نمیشه به فرض تو اینجا به porta.0 و porta.1 تعریف کرد.$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , Rs = Portb.5 , E = Portb.6Config Sda = Portc.0
Config Scl = Portc.1
Dim X As Integer , Y As Integer , Z As Word
Cursor Off
Do
4. قبل از هر چیزه دیگه ای باید I2C رو به راه بندازید که با این دستورهI2cstart
5. اینجا برای ارتباط با ماژول، آدرس ماژول رو به صورت یک بایت به خط I2C ارسال میکنیم که در SRF02 به صورت پیش فرض آدرس &HE0 هستI2cwbyte &HE0
6. حالا باید با بخش کنترل ماژول ارتباط برقرار کنیم که بتونیم بهش دستور بدیمI2cwbyte &H00
7. حالا باید به بخش کنترل ماژول بگیم واحد اطلاعاتی که قراره برامون بفرسته چی باشه؟ (سانتی متر، اینچ یا میکرو ثانیه) که تو اینجا سانتی مترهI2cwbyte &H51
8. هر چه قدر که فکر کردم فلسفه این تیکه رو نفهمیدم که چرا باید باشه؟ اول که ننوشتم کار نکرد و مأیوس شدم ولی بعد که استفاده کردم کار کرد!!! اگه کسی میدونه بگه تا ما هم خبردار بشیمI2cstop
I2cstart
9. حالا دوباره با ماژول ارتباط برقرار میکنیم، چون تو 2 تا خط قبل ارتباط رو قطع کردیم و دوباره وصل کردیمI2cwbyte &HE0
10. الآن دیگه با بخش کنترل ماژول ارتباط برقرار نمیکنیم چون فقط برای اینکه به ماژول بگیم فاصله رو اندازه بگیره ازش استفاده میکنیم. حالا باید بریم از رو ماژول اطلاعات رو بخونیم، اما یه مشکلی هست! اونم اینه که ماژول اطلاعات رو در قالب بایت ارسال میکنه و متغیر بایتی محدودیت با کران بالای (حداکثر) 255 داره و برای مثال اگه فاصله 3 متر یا همون 300 سانتی متر باشه توی اطلاعاتی که ماژول ارسال میکنه جا نمیشه. بنابراین ماژول اطلاعات رو در قالب دو بایت به ما میده. پس باید اطلاعات رو از 2 تا آدرس روی ماژول بخونیم و بعد با استفاده از یک فرمول که فکر کنم مختص این ماژول هست اون تا عدد رو به فاصله تبدیل میکنیم. فرقی نمیکنه که اول از روی کدوم آدرس اطلاعات رو بخونید حتی تو فاصله های کم فقط دومی رو بخونید کافیه. اول این دستور رو، که آدرس حافظه ای رو که یکی از اون اعداد توشه به خط I2C ارسال میکنیم بعد منتظر میمونیم تا ماژول اون عدد رو برامون ارسال کنه که تو اینجا توی X ذخیره میکنه و میتونه هر چیز دیگه ای هم باشه. تو دیتا شیت نوشته باید 65 میلی ثانیه صبر کنید بعد اطلاعات رو بگیرید اما چون دستور I2creceive تا وقتی که اطلاعات رو نگیره نمیره خط بعدی، دیگه از تأخیر استفاده نکردم. فقط توجه کنید که اطلاعات با نام ماژول ارسال میشه و به خاطر اونه که تو خط دریافت اطلاعات آدرس ماژول رو نوشتمI2cwbyte &H02
I2creceive &HE0 , X
11. ؟؟؟؟؟؟؟؟؟I2cstop
I2cstart
12. حالا اون یکی عدد رو از روی ماژول میخونیم و توی Y قرار میدیم. چون تو بخشه قبلی فقط یکی از اعداد رو خوندیم. این عددی که اینجا میگیریم همونیه که میگم تو فاصله های کم جوابمون رو میدهI2cwbyte &H03
I2creceive &HE0 , Y
13. I2cstop
Cls
14. این دو خط همون فرمول تبدیل اون تا عددی که گرفتیم به فاصله استZ = X * 256
Z = Z + Y
15. اینجا هم که فاصله رو روی LCD اعلام میکنه و بعد از نیم ثانیه دوباره همه مراحل رو تکرار میکنهLcd Z
Waitms 500
Loop
چون برنامه تیکه تیکه بین متن پراکنده شده اینجا یه جا گذاشتم تا اگه خواستید کپی کنیدLoop
$regfile = ”m32def.dat”
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , Rs = Portb.5 , E = Portb.6
Config Sda = Portc.0
Config Scl = Portc.1
Dim X As Integer , Y As Integer , Z As Word
Cursor Off
Do
I2cstart
I2cwbyte &HE0
I2cwbyte &H00
I2cwbyte &H51
I2cstop
I2cstart
I2cwbyte &HE0
I2cwbyte &H02
I2creceive &HE0 , X
I2cstop
I2cstart
I2cwbyte &H03
I2creceive &HE0 , Y
I2cstop
Cls
Z = X * 256
Z = Z + Y
Lcd Z
Waitms 500
Loop
اینم شماتیک مدار$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , Rs = Portb.5 , E = Portb.6
Config Sda = Portc.0
Config Scl = Portc.1
Dim X As Integer , Y As Integer , Z As Word
Cursor Off
Do
I2cstart
I2cwbyte &HE0
I2cwbyte &H00
I2cwbyte &H51
I2cstop
I2cstart
I2cwbyte &HE0
I2cwbyte &H02
I2creceive &HE0 , X
I2cstop
I2cstart
I2cwbyte &H03
I2creceive &HE0 , Y
I2cstop
Cls
Z = X * 256
Z = Z + Y
Lcd Z
Waitms 500
Loop

این همه چیزی بود که میتونستم بگم. البته شاید برای یه عده زیادی حوصله سر بر باشه، اما باید این نکته رو در نظر گرفت که ممکنه یکی باشه که این چیزایی که گفتم براش تازه باشه. دیتا شیت رو هم یه نگاهی بندازید.
http://www.robot-electronics.co.uk/htm/srf02techI2C.htm
به هر حال امیدوارم که به دردتون خورده باشه.
دیدگاه