İki tane PIC16F877A arasında SPI ile haberleşen örnek PBP devre

Başlatan toprak, 29 Aralık 2013, 21:30:32

toprak

 SPI konusunda fazla bilgim yok.
İnternette araştırıyorum.
Fakat tam olarak ne nedir anlayacağım PBP kodunda devre göremedim.
Elinde iki tane 16F877A ile yapılmış birinden diğerine sadece bilgi gönderen devre şeması ve programı olan yok mu arkadaşlar.
  Elimde SPI sistemi ile çalışan moduller var fakat kullanamıyorum.
  Basit bir örnek ile modülleri çalıştırmak istiyorum.
Sadece bir tarafta butona basmayla diğer tarafta led yakan bir program da olur.
  Dediğim gibi mantığını anlamak açısından benim için öğretici olacaktır.
  Saygılar.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

ete

Sözüme kısa bir açıklama ile başlayacağım. Nerede bir Shiftin veya Shiftout komutu görmüş isen o SPI işlemi demektir.
Hiçmi görmedin bu komutlara ait örnek acaba.? Ozaman araştırmıyorsun demek oluyor. Biraz araştır. En azından Google' a bir sor bakalım SPI nedir diye sana bir sürü açıklama versin hemde Türkçe veya başka dillerde.
Bu açıklamaları okursan SPI denen terimin Serial Peripheral  Interface " kelimelerinin baş harflerinden türetilmiş olduğunu anlayacaksın. Genel anlamı ise karşılıklı iki birimin Seri yoldan haberleşmesi anlamına geliyor. İki veya birden fazla birimin iki yönlü haberleşebilmesi için en azından 4 tane uç gerekir. BUnlar CLK - Serial Data In (SDI) - Serial Data Out(SDO) ve Chip Select(CS). Haberleşme tek yönlü ve tek ünite ise yalnızca clk ve dta uçları bu işi yapmak için yeterlidir.
Haberleşmeyi genelde Master denilen birim başlatır. Bunu yapmak için önce hangi Slave ile haberleşeceğini kararlaştırıp ona ait CS ucunu aktive eder. Daha sonra Clk palsleri eşliğinde dataları yollar. Slave veya Slave ler ise CS uçlarına bakarlar. Hangisinin CS ucu aktif olmuş ise onunla haberleşilecek anlamına geldiğinden hazırlığını yapar ve gelen CLK palsleri eşliğinde Data bitlerini bit bazında çeker alır.

Bu iş aslında bu kadar basittir. Ama etrafına bakındığında yada örnekleri incelediğinde genelde tek yönlü haberleşme örnekleri görürsün. Mesela bir İŞlemci ile 74HC595 haberleşmesini bol miktarda göreceksin. Burada master olan işlemci slave olan ise 74HC595 dir. Tek yönlü haberleşmede genelde CS ucu göremezsin. Ortada tek ünite var iken ayrıca bir CS pinine ihtiyaç duyulmaz. Ama bazı sensörler ve buna benzer elemanlarda önceden bahsi geçen CLK-SDO-SDI-CS uçları zorunlu olarak yer alırki bunları kullanmak zorundasın.
Mademki iki pic'i SPI ile haberleştirmen gerekiyor bir tanesini master olarak belirle. Sen seçeceksin şu master diye.
Sonra sırası ile şunları yap,
Master için,
Slave 'e veri yollayacağını bildirmek için CS ucunu HIGH yap
10 ms kadar bekle
Sonra SHIFTOUT DTA,CLK,1,[EMIR]  komutu yardımı ile emrini gönder.
Mesela EMIR=10 yolladığında SLAVE olan birim kendisine bağlı olan sıcaklık sensöründen okuduğu sıcaklık değerini Master'a geri yollasın.
BU aşamadan sonra Master
SHIFTIN DTA,CLK,1[SICAKLIK]
şeklind ekomut ile gelen bilgiyi almak için bekleyecektir.  Bu aşamada CLK palsi Slave tarafından verileceği için Master beklemede kalır ve datalar CLK eşliğinde gelmeye başlayınca gelenleri alır.
Sonunda Master CS ucunu LOW'a çekerek beklemeye başlar.

Slave Tarafında ise;
Sürekli olarak CS ucunu kontrol eder. Ne zaman HIGH olduğunu görür ise master den bilgi yollanacağını anlar ve hemen SHIFTIN DTA,CLK,1,[EMIR]
şeklinde komutunu çalıştırır. Gelen emir değerini alır ve EMir=10 ise ardından hemen
SHIFTOUT DTA,CLK,1,[SICAKLIK] şeklinde sıcaklık bilgisini yollar.

Hepsi bu kadar gerisi artık senin ne kadar geniş düşünebildiğine bağlıdır.
Hemen bir soru sormayı akıl edebileceğini görür gibi oluyorum. SLAVE , Master'a bir şey yollamak isterse ne olacak?
O zaman Slave kendi CS ucunu aktive edecek ve Master bu sefer kendine bir bilgi yollanacağını anlayacak. Böylece bilgi alma konumuna geçecek. Hepsi bu kadar. Şimdi örnek çalışmayı senden bekliyoruz.

Ete

est32


xoom

CCS C için Ete Hocam gibi bir kaynak yok şu memlekette .. İçimden hep demişimdir CCS C yi bilse ne güzel olurmuş..:)

ete

CCS okumaya başladım. Henüz program yazmadım ama öğrenmeye çalışıyorum.
Gerçekten ters geliyor. En ufak programı bile yazmak sorun olur bu dilde. Ancak çok kalıplaşmış hale getirebilirseniz hızlı program yazarsınız. Şimdi anlıyorum neden C bilenlerin tavsiyelerinde Basic'ide bırakmayın dediklerini.
Şu anda sanıyorum pek çok kişi C bilmesine rağmen yinede mümkün olduğunca Basic ile program yazıyorlar.
Çünki Basic gerçekten çok esnek bir dil.
Aslında teorik yapısını bilmeme rağmen C ile program yazmaya elim gitmiyor. En büyük zorluğu program çatısını kurmakta görüyorum. Hep kötülemiş olmayayım. Fonksiyon tipi çalışma büyük kolaylık aslında.  Basic de de böyle bir kolaylık olsa daha da hızlanabilirdim program yazmakta.   Ama ekrana bile bir şey yazdırmak bu kadar anlamsız kodlarla bu kadar zor olmamalı idi.  Kimse bana o yazılanların bir anlamı var demesin. Dünyanın en basit ekrana ayzdırma komutu bence Proton komutudur.
Print at 1,2,"XXXXXXX"  bu kadar. Sayıları desimal kodlama yaptırmak her iki basic de de çok kolay. Ama C de öyle olduğunu sanmıyorum. Kullandıkları sistematik akılda kalıcı değil maalesef. İyi öğrenmiş olsanız bile sürekli kaynaktan nasıl kullanıldığına bakmak zorundasınız. Belki çok sonra ezberden yazabilirsiniz.

Ete

toprak

Alıntı yapılan: ete - 30 Aralık 2013, 09:38:18

Hemen bir soru sormayı akıl edebileceğini görür gibi oluyorum. SLAVE , Master'a bir şey yollamak isterse ne olacak?
O zaman Slave kendi CS ucunu aktive edecek ve Master bu sefer kendine bir bilgi yollanacağını anlayacak. Böylece bilgi alma konumuna geçecek.

Daha önce SPI haberleşme ile uğraşmamıştım.
Söylediğiniz gibi araştırıyorum.
Şimdilik tek yönlü (iki pic arasında) bir haberleşme yapmaya çalışacağım.
Yani master ve slave.
Daha sonra transceıver  modul ile karşılıklı yapmaya çalışacağım.
İlginiz için teşekkürler.
Saygılar.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

est32

Hocam halbuki CCS C basitleştirilmiş, tabiri yerindeyse sulandırılmış bir dil. Bu sözü iyi derecede C bilenler söylüyor.
CCS C normal C nin(sanırım ansi c diyorlar) işleri kolaylaştırmak için sulandırılmış hali. C bilenler C komutlarının(onlara göre fonksiyon) asla değişmediğini, üzerinden yıllar geçse bile programın eski komutlar ile derlenebileceğini söylüyorlar. CCS C de ise geliştirme yapıldıkça eski komutlarda hata verdiği söyleniyor.
Berik.net'te site kurucusu cemo'nun CCS C hakkındaki yazılarından alıntıdır;
***************************************
CCS C standart C değil, o yüzden sıkıntı yaşıyorsunuz. Standart C öğrenirseniz, derleyici değişikliğinde sorun yaşamazsınız. CCS gibi derleyicilerde kullanıcının işini kolaylaştıran hazır fonksiyonlar oluyor, kullanım için iyi ama portability (kodun başka bir derleyicide derlenebilmesi) açısından ise kötü.
*****************************************
bu forum sorularınız için var, soru sormaktan çekinmeyin. CCS ile yaptığınız program kullanılamaz, nedeni ise çok basit, bunlar "gerçek" C derleyicileri değiller, output_high(c) gibi bir fonksiyon (C dilince komut yok, fonksiyonlar var) bir değişkene değer atamanın onlarca farklı yolundan biridir. Standart C'de olmayan bir fonksiyon derleyicinin içine yerleştirilirse, fonksiyonu başka derleyicilerde kullanamazsınız. Oysa standart C'de aynı işi yapan A |= (1<<5); gibi bir ifade tüm C derleyicileri tarafından anlaşılır. Sadece mikroişlemciler için kullanılan derleyicileri kastetmiyorum, indirin Microsoft C++ Express sürümünü ve bu ifadeyi girin, hata vermez. Özet olarak, CCS öğrenirken aslında C dilini öğrenmiyorsunuz, üzgünüm ama gerçek bu. Eğer Programmer's Notepad'in geliştirme ortamının (IDE) yetersiz olduğunu düşünüyorsanız, Eclipse isimli IDE'yi henüz görmediniz, bir sonraki video bununla ilgili olacak.

Örneğin IAR ticari bir derleyicidir ve ciddi tüm derleyiciler gibi ANSI standartlarını destekler, IAR'da yazılmış bir kodu çok az değişiklikle WinAVR'de kullanabilirsiniz. 20 yıl önce yazılmış bir kodu da WinAVR'de derleyebilirsiniz, ama CCS gibi bir derleyicide bir kaç yıl önce hazırlanmış bir programı en son versiyonda deneyin bakalım. WinAVR aslında GCC C derleyici kolleksiyonunun özel bir halidir, yani arkasında üzerinde en çok çalışılmış C derleyicisi vardır, Linux dünyasında gördüğünüz hemen herşey bu derleyici ile oluşturulmuştur. Üstelik bedavadır, en son versiyonuna yayınlandığı anda ulaşırsınız. Cracklerle uğraşmazsınız, yazdığınız kodları, benim gibi göğsünüzü gere gere internette yayınlarsınız, vesaire, vesaire.

Eğer C dili çok zor geliyorsa BASIC öğrenmek yerinde olur, ama basitleştirilmeye çalışılmış, sulandırılmış C öğrenmek tamamen yanlış olur.

Doğru yoldasınız, bir süre sonra kendinizi mektup yazar gibi C programları yazar bulacaksınız. Bir programlama dilini öğrenmek, sabır işidir. Yardım almaktan çekinmeyin, burada sorularınıza cevap vermek isteyen pek çok arkadaş var. Bu arada, foruma hoşgeldiniz.
********************************************
Tabii yanlış anlaşılmasın amacım ne site reklamı yapmak ne de avr'yi övmek, sadece bir C uzmanının dilinden CCS C yorumunu paylaştım. zaten bu yazılar yüzünden CCS C den soğudum, aslında ben de taşınabilirliği nedeniyle C öğrenmek istiyorum ama basit olduğundan Pic'ten de ayrılamıyorum.

xoom

Her okuduğunuza inanmayın ama kısmen söyledikleriniz doğru olabilir. sizin bir yazılım dilinden ne beklediğiniz önemlidir.
Nasıl ingilizce yazmak/öğrenmek çince yazmak/öğrenmekten daha kolaysa CCS C ile kod yazmak Birçok dile göre daha kolaydır.
Günümüzde programlar bile örneğin Visual Studio Yıllar geçtikçe hazır fonksiyonlarla kullanıcıyı yormadan daha hızlı kod yazmaya teşvik ediyor. Bazen  gerçeksiz şeyleri bilmek avantajken bazende dezavantaja dönüşebiliyor.
Bir Dil size ne kadar basit kod yazdırabiliyorsa (Size göre hazır fonksiyonların sulandırılış hali) bana göre o kadar iyidir.
Dipnot: Ben sadece Ete Hocamın formdaki online olma ve cevaplama hızını imrenip duygumu paylaştım. Konuyu daha fazla karıştırmamak adına bu başlık altında devam etmek istemiyorum. Kolay gelsin.

toprak

16F877A ile SPI haberleşme denememde sonuç alamadım henüz.
   Vericiden gönderdiğim 55 bilgisi ile alıcıda led yakmak istiyorum.
   SPI daha önce hiç denemediğim için bir türlü yakamadım ledi.
   Program ve deve şeması aşağıdadır.
   Konuyu geliştirmek için yardımlarınızı bekliyorum.

   verici master
   
@ __CONFIG _XT_OSC & _WDT_ON  & _LVP_OFF & _CPD_OFF & _CP_ALL & _PWRTE_ON & _BODEN_ON 

'                          DEFINES & INCLUDES
' ================================================================
DEFINE OSC 4

           '76543210          '76543210
TRISA   = %00000000: PORTA = %00000000
TRISB   = %00000001: PORTB = %00000000

TRISC = %00000000 : PORTC = %00000000      ' TRISC   = %00010000
TRISD   = %00000000: PORTD = %00000000
TRISE   = %00000000: PORTE = %00000000
ADCON0  = %00000000
   

SSPEN           VAR SSPCON.5       
CKP             VAR SSPCON.4       
SMP             VAR SSPSTAT.7       
CKE             VAR SSPSTAT.6       
BF              VAR SSPSTAT.0         
 
  I      VAR BYTE
DataOut VAR BYTE 56
Temp   var byte
' Set up the MSSP module.
CKP = 0                             ' Clock idles low 
CKE = 0                             ' Transmit on idle to active transition. 
SMP = 0                             ' Sample in middle of data
SSPEN = 1                           ' Enable SPI pins
SSPCON.0 = 1                       ' Slow down SPI clock to Fosc/16 for now.
Temp = SSPBUF
 
MAIN:
   
    IF PORTB.0=1 THEN
    DataOut=55
    SSPEN=0
    SSPEN=1       
    GOSUB SEND_DATA
    SSPEN=0
    ENDIF 
GOTO MAIN   

SEND_DATA:

    For i = 0 to 5               
        SSPBUF = DataOut                     ' Load buffer with content
        While BF = 0 : WEND             ' Wait for operation to complete
        Temp = SSPBUF               ' Read response
        PAUSE 10
    NEXT
             
     
   Return

   End



Alıcı   Slave
@ __CONFIG _XT_OSC & _WDT_ON & _LVP_OFF & _CPD_OFF & _CP_ALL & _PWRTE_ON & _BODEN_ON 

'                          DEFINES & INCLUDES
' ================================================================
DEFINE OSC 4

' ================================================================
           '76543210          '76543210
TRISA   = %00000000: PORTA = %00000000
TRISB   = %00000000: PORTB = %00000000
TRISC   = %00011000: PORTC = %00000000      ' TRISC   = %00010000
TRISD   = %00000000: PORTD = %00000000
TRISE   = %00000000: PORTE = %00000000
ADCON0  = %00000000


SSPSTAT = %01000000  'Configures the SPI Module ( Read DataSheet )

SSPEN  VAR SSPCON.5 'SSP Enable bit
CKP VAR SSPCON.4 'Clock Polarity Select
SMP VAR SSPSTAT.7 'Data input sample phase
CKE VAR SSPSTAT.6 'Clock Edge Select bit
SSPBF   VAR     SSPSTAT.0
SSPIF VAR PIR1.3 'interrupt flag - last bit set
BF              VAR SSPSTAT.0       ' Buffer Full bit 
SS      var     porta.5
I       VAR BYTE
SCLK VAR PORTC.3
SDI VAR PORTC.4
SDO VAR PORTC.5
CKP = 0         
CKE = 0           
SSPIF = 0         
SMP = 0           


While PortC.4 = 1 : WEND            ' Wait for SCK pin to be idle before enabling MSSP
SSPCON = %00100101   

mainloop:
    SSPEN=0
    SSPEN=1
    GoSub letclear     
    IF SSPBUF=55 THEN
    PORTB.1=1
    SSPIF=0       
    ENDIF 
   
   GoTo mainloop     
letclear:
   IF SSPIF = 0 Then letclear ' wait for SPI interupt flag
   PauseUs 25         
   SSPIF = 0          ' reset flag
   Return

   End


Kodları değiştirdim bunları dene bakalım
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

Mucit23

Donanımsal Spi'nin ayarlarını yanlış yapıyorsun muhtemelen,

Şunlara dikkat et;

Master olanı master moduna aldınmı?
Slave olanı slave moduna aldınmı?
Clock High/low Polaritesi düzgün ayarlımı?
Bölücü oranları aynı yapıldımı?
Alıcıda interrupt ayarları düzgün yapıldımı?

Slavede Kesme rutini ayarlanmamış mesela? Nasıl datayı alacaksın?

Denemelerini yaparken programı oldukça sadeceleştirmeye çalış. İlk önce master'i yap Masterin çalıştığına emin ol sonra slave üzerinde çalış.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Yazdığın kodları yeniden düzenleyip değiştirdim. Dene bakalım olmuşmu?

Ete

toprak

Alıntı yapılan: ete - 03 Ocak 2014, 17:53:37
Yazdığın kodları yeniden düzenleyip değiştirdim. Dene bakalım olmuşmu?

Ete


Evet hocam olmuş.
Şu anda kodlara bakıyorum. Yardımınız için teşekkürler.
Bu ilk SPI ile çalışan devrem oldu.
İşin mantığını anlamaya başladım.
Bundan sonra iki taraflı yapmaya çalışacağım.

Saygılar.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

zerolax

Banada çok faydası oldu paylaşım için teşekkur ederim  :)
EMRE SALMAN

Mymale26

Hocam öncelikle iyi günler benimde bir projem var nrf24l01 kablosuz modul ile iki pic haberleştircem basit bi led yakma olucak baya bi araştırma yaptık ama uzman bakısı baska yazılarınızı okudum spı haberleşme protokolunu bnm ıcın faydalı oldu ben pıc 16f877 kullanıcam sizce nasıl bir yol izlemeliyiz kafamızda bır taslak olusturamadık...?

ete

Nasıl bir yol izlemeniz tamamen RF modülün kullanılma şekline bağlı.
Öncelikle o modüle ait data sheet den data formatı incelenmeli. Varsa protokolü çıkartılmalı sonra haberleşme moduna girilmeli.
Buradaki örnek zaten işin haberleşme kısmını nasıl yapacağınızı gösterir. Önemli olan modülün parametreleri.
Modülü iyice inceledinizmi?

Ete

Powered by EzPortal