------------------------ ويرايش ----------------------
بازم ممنون. چرا . اول از همه سخت افزاري رو امتحان كردم ،اون راحت بود و واقعا عالي بود . بابت ايده ها هم ممنونم. موقعي كه مطالب زير رو مي نوشتم هنوز پستتوت رو نديده بودم :d
به هر حال خيلي ممنون از راهنماييتون ، به كارم كلي سرعت داديد.
----------------------------------------------------------
خوب دوستان ، روشي رو كه بالا گفتم امتحان كردم و جواب داد و داده اي از بين نرفت .
ايده هاي ديگه اي هم ميشه بكار برد .
به هر حال منتظر دوستان هستيم براي دادن بهترين ايده ...
ايده ي اين كار اينطور بوده كه ، از atmega8 كه مستر هست قراره رشته اي به طول 2 ( اندازه ي 2 بايت ) به atmega32 كه slave هست منتقل بشه. به ميكروي مستر يك keypad وصل هست كه هر عددي كه ازش زده بشه باعث مي شه 2بايت داده به ميكروي slave ارسال بشه . ميكروي slave هم داده اي رو كه ميگيره روي LCD نشون مي ده.
براي ارتباط سخت افزاري مشكلي نيست و ارتباط راحت بر قرار ميشه ، اما براي نرم افزاري احتياج به كد نويسي بيشتري داره ... .
در سمت گيرنده ، گيرنده منتظر مي مونه تا " " رو دريافت كنه كه بفهمه قرارهه رشته ها رو به ترتيب بگيرهه ...
براي ارسال هم در سمت مستر ، به محض زده شدن كليد. اول " " و به ترتيب بقيه ارسال مي شوند.
در سمت گيرنده از " " صرف نظر مي شه و باقيه اطلاعات رو كه طول برابري دارن پشت سر هم مي چينه و يكپارچه مي كنه ... .
اگر طول داده متفاوت بود مي شه يك شرط هم براي آخر رشته گذاشت ( مثل null )
--------------------
برنامه اي رو كه پايين مي ذارم كامل هست و كار مي كنه . بعضي قسمت ها با علامت ( ' ) هستن ، اونايي كه مربوط به spi سخت افزاريه ، خوب ارتباط رو از طريق سخت افزاري امكان پذير مي كنه .
اما به اين فرمي كه الان مي ذارم براي ارتباط نرم افزاريه و 100% جواب مي ده. البته مي تونه خيلي خيلي بهينه تر باشه ...
اين فقط يه پروژه براي ياد گيريه پروتكل SPI بودهه ...
به اين دليل مي ذارم كه نتيجه و چكيده ي اين تاپيك مشخص بشه و كسايي كه همچين مشكلي دارن ،راحت برطرف كنن.
-------------------------------
atmega8 :
کد:
$regfile = "m8def.dat"
$crystal = 8000000
Config Kbd = Portd , Debounce = 25 , Delay = 130
'Config Portb.2 = Output
'Portb.2 = 1
'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 1
Config Spi = Soft , Din = Pinc.2 , Dout = Pinc.1 , Ss = Pinb.2 , Clock = Pinc.3
Spiinit
Dim Gt As Byte , Ad As Byte , Sd(15) As String * 1
Sd(14) = "Z"
Sd(1) = "H"
Sd(2) = "e"
Sd(3) = "l"
Sd(4) = "o"
Sd(5) = "E"
Sd(6) = "D"
Sd(7) = "Y"
Sd(8) = "n"
Sd(9) = "1"
Sd(10) = "2"
Sd(11) = "3"
Sd(12) = "4"
Sd(13) = "t"
Sd(15) = " "
Do
Main:
Ad = Getkbd()
If Ad > 15 Then
Goto Main
End If
Gt = Lookup(ad , Dta)
'Portb.2 = 0
Spiout Sd(15) , 1
Waitms 10
Select Case Gt
Case 0 : Spiout Sd(14) , 1
Waitms 10 : Spiout Sd(6) , 1
Waitms 10 : Spiout Sd(4) , 1
Case 1 : Spiout Sd(1) , 1
Waitms 10 : Spiout Sd(2) , 1
Waitms 10 : Spiout Sd(3) , 1
Case 2 : Spiout Sd(1) , 1
Waitms 10 : Spiout Sd(3) , 1
Waitms 10 : Spiout Sd(3) , 1
Case 3 : Spiout Sd(1) , 1
Waitms 10 : Spiout Sd(4) , 1
Waitms 10 : Spiout Sd(5) , 1
Case 4 : Spiout Sd(2) , 1
Waitms 10 : Spiout Sd(5) , 1 : Waitms 10
Spiout Sd(6) , 1
Case 5 : Spiout Sd(3) , 1
Waitms 10 : Spiout Sd(7) , 1 : Waitms 10
Spiout Sd(8) , 1
Case 6 : Spiout Sd(4) , 1
Waitms 10 : Spiout Sd(9) , 1 : Waitms 10
Spiout Sd(10) , 1
Case 7 : Spiout Sd(5) , 1
Waitms 10 : Spiout Sd(10) , 1 : Waitms 10
Spiout Sd(11) , 1
Case 8 : Spiout Sd(6) , 1
Waitms 10 : Spiout Sd(11) , 1 : Waitms 10
Spiout Sd(12) , 1
Case 9 : Spiout Sd(7) , 1
Waitms 10 : Spiout Sd(12) , 1 : Waitms 10
Spiout Sd(13) , 1
Case 10 : Spiout Sd(8) , 1
Waitms 10 : Spiout Sd(13) , 1 : Waitms 10
Spiout Sd(14) , 1
Case 11 : Spiout Sd(9) , 1
Waitms 10 : Spiout Sd(2) , 1 : Waitms 10
Spiout Sd(14) , 1
Case 12 : Spiout Sd(10) , 1
Waitms 10 : Spiout Sd(3) , 1 : Waitms 10
Spiout Sd(13) , 1
Case 13 : Spiout Sd(11) , 1
Waitms 10 : Spiout Sd(4) , 1 : Waitms 10
Spiout Sd(12) , 1
Case 14 : Spiout Sd(12) , 1
Waitms 10 : Spiout Sd(5) , 1 : Waitms 10
Spiout Sd(11) , 1
Case 15 : Spiout Sd(13) , 1
Waitms 10 : Spiout Sd(6) , 1 : Waitms 10
Spiout Sd(9) , 1
End Select
'Portb.2 = 1
'Waitms 500
Loop
End
Dta:
Data 14 , 13 , 12 , 11 , 10 , 9 , 6 , 3 , 0 , 8 , 5 , 2 , 15 , 7 , 4 , 1
atmega32 :
اون portb.1 يه led هست كه براي چك كردن رفت و اومد برنامه گذاشته بودم ...
کد:
$regfile = "m32def.dat"
$crystal = 8000000
Config Portb.1 = Output
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
' Config Spi = Soft , Din = Pina.6 , Dout = Pina.5 , Ss = Pina.4 , Clock = Pina.7 , Spiin = 0
'Config Spi = Hard
', Interrupt = Off , Data Order = Msb , Master = No, Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0
'Spiinit
Const _softslavespi_port = Portd
Const _softslavespi_pin = Pind
Const _softslavespi_ddr = Ddrd
Const _softslavespi_clock = 6
Const _softslavespi_miso = 5
Const _softslavespi_mosi = 4
Const _softslavespi_ss = 2
$lib "spislave.lbx"
$external _spisoftslave
On Int0 Isr_sspi Nosave
Enable Int0
Config Int0 = Falling
Enable Interrupts
Dim Recv(3) As String * 1 , Llcd As String * 16 , Rrecv As String * 3
Dim Recv_byte As Byte , B As Byte
Dim A As Byte
A = 1
Main:
Llcd = " Waitting ... "
Cls
Lcd Llcd
Do
Set Portb.1
Waitms 100
'Spiin Recv , 16
Dim _ssspdr As String * 1 ' this is out SPI SLAVE SPDR register
Dim _ssspif As Bit ' SPI interrupt revceive bit
If _ssspif = 1 Then
' Recv_byte = _ssspdr
Recv(a) = _ssspdr
If Recv(a) = " " Then
A = 0
End If
A = A + 1
If A = 3 Then
A = 1
B = 1
End If
Reset _ssspif
End If
If B = 1 Then
Rrecv = Recv(1) + Recv(2) + Recv(3)
Waitms 10
Cls : Locate 1 , 1
'Lcd Recv_byte
Lcd Rrecv
Reset Portb.1
Waitms 100
B = 0
End If
Loop
End
خوب به كمك Pardazesh-Gar ، دوست عزيز ، پرونده ي پروتكل SPI هم بسته شد.
حركت بعدي 1wire يا I2C هست.
موفق باشيد.
يا علي.