سلام بر دوستان
اين سوال تا حدي به ميكرو هم مرتبطه !
مداري كه براي پروژه ام گرداوري كردم شامل 4 عدد موتور 18 واتي هست اين موتورها هر كدام به طور مستقل شامل يك عدد ميكرو ، l298 ، روتاري انكودر ، چند رله ، خازنهاي بزرگ و چند سنسور هستند اين چهار ميكروي سليو توسط يك ميكروي مستر ديتا دريافت و ارسال مي كنند بنابراين نيازمند يك شبكه ارتباط همزمان و مطمئن مي باشند
اين موتورها در چهار گوشه يك زمين مستطيل نصب مي گردند و مجموعه واحد پردازنده در قسمتي از محيط اين مستطيل قرار ميگيرد
حداكثر طول و عرض مستطيل برابر 20*10 متر مي باشد و موتورها و واحد پردازنده از 2 باتري 12 ولتي و دو پاور 450 واتي ( 12 و 5 ولت همزمان ) تغذيه مي كنند
با توجه به طول سيمكشي مدار تغذيه (4 رشته ) و enable درايورها و سيمهاي شبكه بين ميكروها و نويز احتمالي وارد بر مدار :
1/ كدام شيوه بهتر است ؟ : *مجموعه قطعات در يك برد باشند و دو رشته سيم تا موتورها كشيده شود *مجموعه برد هر موتور در كنار موتور مربوطه قرار گيرد و كابلهاي تغذيه و سيمهاي شبكه از ميكروهاي مستر تا اسليو كشيده شود *فقط درايور و كابلهاي ديتا و تغذيه مربوطه از برد پردازنده تا برد درايور موتور كشيده شود *يا هر چيدمان مناسبتري
2/مناسبترين پرتكل ارتباطي دو طرفه و همزمان و مطمئن براي چيدمان انتخابي چيست ؟
3/ مناسبترين جنس كابلها براي اين شبكه و تغذيه از نظر راندمان و نويز چيست ؟
4/ با توجه به چيدمان ، طول كابلها متفاوت ميباشد . آيا اين مشكلي ايجاد نميكند ؟ آيا بايد كابل ها را يك اندازه گرفت و اضافه آنها را حلقه كرد ؟
5/آيا امكان تقويت خطوط ديتا در ميان راه وجود دارد ؟ لطفا مقداري توضيح دهيد
نكته اي كه به اون اشاره نكردم اينه كه طبق توصيه ديتاشيت روتاري اينكودر ، حداكثر طول كابل مورد استفاده براي آن بايد 2 متر باشد كه احتمال قرارگيري موتور و مدارش در يك مجموعه را تقويت مي كند
براي توجهتان ممنونم
سلام بر همگي
با توجه به شرايط حاكم spi را براي ارتباط برگزيدم
تو يه فروم خارجي خوندم كه تاخير كلاك سيستم spi حدود 1 نانو ثانيه بر اينچ هست و براي افزايش طول كابل ارتباطي ( شيلد دار ) مي توان كلاك spi را كاهش داد و طبق محاسباتي كه انجام داده بود تا 10 متر كابل شيلد دار نيز قابل استفاده بود !!
اما با توجه به شرايط ذكر شده مجبورم كه مجموعه موتور و روتاري اينكودر و آيسيهاي مربوط به اينكودر و خازن را در مجموعه هاي جدا و 5 ميكرو و درايورها و باقي مدار را در يك مجموعه قرار دهم ديتاي مربوط به روتاري اينكودر هم با يه كابل 20 متري شيلد دار در فركانسهاي مختلف تست كردم و جواب گرفتم
ولي با نحوه ارسال spi مشكل دارم آموزش 1 نفر عزيز هم اجرا كردم ولي نمي دونم چرا تو lcd و پروتئوس فقط 255 نمايش ميده اونم با فركانس خيلي بالا ( البته ميكروي مستر را نرم افزاري پيكره بندي كردم)
چند تا مرجع ديگه هم كپي همين مثالها را داده بودند جز پروژه آيفون هوشمند و ضبط صوت كه براي تست اوليه كمي پيچيده بود
از شما دوستان كسي spi تو بسكام كار كرده ؟ ممنون ميشم راهنمايي كنين
چطوري ميشه دستور مربوط به هر كدام از ميكروها را فقط به همان ميكرو ارسال كرد (ميكروي اسليو شناسايي كند ؟)
(۱۸-تير-۱۳۹۰, ۰۱:۵۰:۱۷)rdscience نوشته است: [ -> ]چطوري ميشه دستور مربوط به هر كدام از ميكروها را فقط به همان ميكرو ارسال كرد (ميكروي اسليو شناسايي كند ؟)[/color]
سلام
باید chip select هر اسلیو که لازمه باهاش تبادل اطلاعات بکنین، فعال کنید.
خودتون با خروجی تعریف کردن یه پین، می تونید همین کار رو بکنید.
موفق باشید.
عزيز خيلي ممنون
يه جا ديدم براي هر اسليوي يه SS از مستر خارج ميشد حالا ميشه يكم در مورد انتخاب ميكروي مقصد توضيح بدي
توي برنامه بايد مستر براي هر اسليو يه متغير جدا ارسال و همچنين هر اسليو متغيرهاي متفاوت را به مستر ارسال كنند تمام اينا بايد در يك بار اسكن برنامه اتفاق بيفتد
ميشه مثلا مستر A,B,C,D را ارسال كنه و هركدام از اسليو ها فقط متغير مربوط به خود را دريافت كند ؟
ميشه اين دريافت و ارسالها به موازات برنامه ( وقفه ) اتفاق بيفتند ؟
نقل قول: يه جا ديدم براي هر اسليوي يه SS از مستر خارج ميشد حالا ميشه يكم در مورد انتخاب ميكروي مقصد توضيح بدي
توي برنامه بايد مستر براي هر اسليو يه متغير جدا ارسال و همچنين هر اسليو متغيرهاي متفاوت را به مستر ارسال كنند تمام اينا بايد در يك بار اسكن برنامه اتفاق بيفتد
ميشه مثلا مستر A,B,C,D را ارسال كنه و هركدام از اسليو ها فقط متغير مربوط به خود را دريافت كند ؟
این مستر هست که مشخص میکنه که با کدام اسلیو اطلاعات رد و بدل کنه.
مثلا شما 4 تا اسلیو دارین و یه مستر
4 تا هم متغیر A1,A2,A3,A4 هست که باید به ترتیب به slave1,2,3,4 ارسال بشن.
برای انتخاب اسلیو، باید cs اون فعال بشه.
مثلا وقتی cs اسلیو 2 توسط مستر فعال بشه، اطلاعات MOSI را فقط اسلیو 2 دریافت میکنه و با هر لبه ی کلاک SPCK ، اسلیو 2 اطلاعات رو از طریق MISO به مستر ارسال میکنه.
SPI نرم افزاری هم همین جور کار میکنه ولی نسبت به SPI سخت افزاری شاید سرعتش کم باشه.
حتی می تونید با یه دکدر، با استفاده از 4 تا CS ، تا 15 اسلیو رو راه اندازی کنید.
نمی دونم تونستم سوالتون رو جواب داده باشم یا نه؟
در ضمن ، زیاد با وقفه ها کار نکردم، دیگران بهتر می تونند شما رو راهنمایی کنند.
موفق باشید
صالح جان تا اينجاش كه خوب گفتي
اگه امكانش هست با يه مثال كوچيك نحوه فعال كردن cs را توضيح بده
چون در موردش تا حالا چيزي نمي دونستم
مثلا اینو ببینید:
http://www.mcselec.com/index.php?option=...&Itemid=57
spi رو به صورت سخت افزاری راه اندازی کرده و csn که active low هست،بصورت دستی کنترل شده.
هدف من این قسمت از کد هاست:
کد:
Sub W_register(byval C_bytes As Byte) 'Write register with SPI
Reset Ss 'Manual control SS pin, set SS low before shifting out the bytes
Spiout D_bytes(1) , C_bytes 'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written
Set Ss 'Set SS high
End Sub
'==============================================
Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte 'C_bytes = Count_bytes, number off bytes to be read
Reset Ss 'Manual controle SS pin, set low before shifting in/out the bytes
Spiout Command , 1 'First shiftout the register to be read
Spiin B_bytes(1) , C_bytes 'Read back the bytes from SPI sended by nRF20L01
Set Ss 'Set SS back to high level
End Sub
موفق باشید.
دست و پنجت درد نكنه خوب مثالي بود
پس قبل از ارسال ديتا در mosi بايد ss اون اسليو را صفر و پس از اون يك كنيم
حالا دو سوال ديگه برام پيش اومد
* براي ارسال رو miso نيز در برنامه اسليو بايد همين كارو بكنيم ؟
اگه آره ، ممكنه كه تداخلي بين ارسال در mosi , miso پيش بياد و ss يا 0 يا 1 باشه پس بايد چكار كرد ؟
اگه نه ، برنامه اسليو را چگونه بنويسم تا در هر اسكن برنامه هم ارسال و هم دريافت مطمئن در يه اسليو مشخص داشته باشم ؟
* وقتي چند اسليو داشته باشيم ناچارا بايد از پيكره بندي نرم افزاري بهره ببريم ، براي يه اسليو SS = PIN|NONE داشتيم حالا براي چند اسليو چطور بايد پيكره بندي كنيم ؟
زیاد با avr کار نکردم، اگه اشتباه گفتم ببخشید:
طبق صفحه ی 132 دیتاشیت mega32 ، :
نقل قول:
When configured as a Master, the SPI interface has no automatic control of the SS line. This
must be handled by user software before communication can start.
(یه پیشنهاد: بیخیال spi نرم افزاری بشید. چون همیشه سخت افزار بهتر از نرم افزار عمل خواهد کرد)
طبق نقل قول بالا، وقتی میکرو ، اسلیو تعریف بشه، پین ss توسط مستر کنترل خواهد شد. و زمانی که میکرو مستر باشه، پین ss کاربردی نداره و کاربر باید خودش توسط i/o های معمولی، نقش پین ss رو بازی کنه.
-----------------------------
طبق صفحه ی 133 دیتاشیت مگا32:
نقل قول:
When configured as a Slave, the SPI interface will remain sleeping with MISO tri-stated as long
as the SS pin is driven high. In this state, software may update the contents of the SPI Data
Register, SPDR, but the data will not be shifted out by incoming clock pulses on the SCK pin
until the SS pin is driven low. As one byte has been completely shifted, the end of Transmission
Flag, SPIF is set. If the SPI Interrupt Enable bit, SPIE, in the SPCR Register is set, an interrupt
is requested.
پس داریم:
* تا زمانی که پین ss میکرو ی اسلیو ، صفر نشه پین miso معلق خواهد بود.
*زمانی که پین ss در حالت 1 هست، نرم افزار میکروی اسلیو، اطلاعاتی را که قراره به مستر ارسال بشه، در رجیستر spdr می نویسه ولی تا زمانی که ss توسط مستر صفر نشده باشه، هیچ اطلاعاتی از اسلیو به مستر ارسال نمیشه.
در مورد کار با بسکام ، من زیاد بلد نیستم ولی help نرم افزار و سایتش میتونه منبع خوبی برای یادگیریش باشه.
موفق باشید.
دمت گرم ، استفاده كردم
توضيحات داره كامل ميشه و منم از اين گيج بازي خلاص ميشم
مثالهاي بسكام را نگاه كردم آخه يه مشكل داره يه مثال جامع كه ارتباط بين دو ميكرو را كاملا شرح بده نداره و با تك مثال سرفصلشو توضيح داده
بيخيال مدار روي بردم شدم چون مجبور بودم نرم افزاري پيكره بنديش كنم ولي هنوزم نتونستم يه ارتباط ساده بين دو ميكرو برقرار كنم چه برسه تو برنامه و بين چند ميكرو اجرا كنم
لطف كنيد ببينيد مشكل اين برنامه ابتدايي كجاست ؟ كريستال مساوي نداشتم و روي lcd غير از شمارش b فقط 255 و هر از گاهي 0 نشون ميده تو پروتئوس هم اعداد نامربوط نشون ميده و پيام ميده كه برخي از ديتاهاي ارسالي با spi از بين مي روند
کد:
$regfile = "m32def.dat"
$crystal = 12000000
Config Portb.4 = Output
config PORTd = OUTPUT
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Pind.3 , Db5 = Pind.4 , Db6 = Pind.5 , Db7 = Pind.6 , E = Pind.2 , Rs = Pind.1
config spi = HARD , INTERRUPT = off , DATA ORDER = msb , MASTER = yes , POLARITY = HIGH , PHASE = 0 , CLOCKRATE = 64
spiinit
enable SPI
Cursor off
'==============================================
Dim a as byte , b as byte
'==============================================
Do
incr b
reset PORTb.4
spiin a , 1
waitms 50
set PORTb.4
locate 1 , 10
lcd a
locate 2 , 10
lcd b
cls
loop
end
کد:
$regfile = "m8def.dat"
$crystal = 10000000
Config pinb.2 = Input
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Pinb.3 , Db5 = Pinb.2 , Db6 = Pinb.5 , Db7 = Pinb.6 , E = Pinb.4 , Rs = Pind.0
config spi = HARD , INTERRUPT = off , DATA ORDER = msb , MASTER = NO , POLARITY = HIGH , PHASE = 0 , CLOCKRATE = 64
spiinit
enable SPI
Cursor off
'==============================================
dim a as byte , b as byte
a = 40
'==============================================
Do
spiout a , 1
waitms 200
loop
درود
چرا هیچ کس در بحث شرکت نمیکنه؟
دقیقا نمی دونم مشکل از کجاست ولی باید کار می کرد.
شما ی بار با کریستال داخلی میکرو تست کن ببین چی میشه.
mosi و miso و spck و ss درست وصل شدن؟
چیپ سلکت مستر باید به ss اسلیو، یعنی PB.4 وصل بشه. درسته؟
چیپ سلکت مستر پین SS یعنی PB4
نیست بلکه باید توسط یه I/O اونو کنترل کنید(همونطور پست های قبلی گفتم)
* در برنامه ی مستر ، حلقه بینهایته، یعینی ممکنه که اعداد با سرعت زیاد ارسال بشوند و در نهایت چون متغیر از نوع بایت هستش، 255 بشه.