avatar_ete

İki pic'i SPI ile haberleştirme

Başlatan ete, 13 Şubat 2017, 20:20:27

ete

İki pici SPI ile haberleştirme işini daha önce yaptık sanıyordum ama her hangi bir bilgi kayıtlarımda göremedim.
Pek çok defa bu soru ile karşı karşıya kalmıştım. Sonuda siteye bu konu ile ilgili bir proje koyayım istedim.
İki Pic i SPI ile haberleştirmek için maalesef normal Shiftout ve Shiftin (Protonda SHout ve SHin) komutlarını kullanamıyoruz.
Sebep basit aslında bu komutları kullanan pic MAster gibi davranıyor da ondan. Ne demek master gibi davranmak?
SPI haberleşmede bir Master birde Slave vardır. Genelde tabir yerine otursun diye Master veren Slave de alan oluyor.
Bu haberleşme içinbir CLK sinyali kullanılır ve bunu master üretir. Her iki taraf da master olursa her ikisi de karşılıklı clk üretirler ve buda sinyalin bozulmasına sebep olur. Doğru sistemde master clk üretir slave bu clk sinyalini kullanarak gelen Data yı alır. Böylece haberleşmeyi Master yönetmiş olur.

Bu durumda hemen anlaşılacağı üzere bu iş için zorunlu olarak donanımsal SPI portunu kullanmak gerekiyor.
Çünki donanımsal port da Master ve Slave ayırımını kolaylıkla yapabiliyoruz.
İlişikte örnek bir proje sunuyorum. 2 adet 16F877A yı SPI ile haberleştirdim. Haberleşme projede aslında tek taraflı ama iki taraflıda haberleşebilirler.
Yapılacak iş basit,
TX tarafında,
Programın başına ;
SSPSTAT=%11000000
SSPCON = %00100000
şeklinde register ayarlarımızı veriyoruz.
Yollanacak bilgiyi SSPBUF (Buffer) registerine yazıyoruz ve PIR1.3 bitini sıfırlyoruz. (PIR1.3=0)
Daha sonra aynı bit 1 oluncaya kadar programı bekletiyoruz. Yani,
WHILE PIR1.3=0:WEND şeklindeki komuta bu işi hallediyoruz.

PIR1.3 biti HIGH olduktan sonra yeni bir veri benzer şekilde yollanabilmektedir.

İşin RX tarafına gelince;
SSPSTAT=%01000000
SSPCON = %00100101
komut satırlarını programın baş tarafına yerleştirerek sistemi SLAVE olarak ayarlıyoruz.
Ana program bölümünde ise önce PIR1.3 bitini sıfırlıyoruz. Ardından aynı bit HIGH oluncaya kadar bekliyoruz.
O bitin HIGH olması ile SSPBUF registerine gelen veri yerleşmiş olmaktadır. Onu alıp kendi değişkeninize aktarıyor ve yeni bir veriyi beklemeye başlıyorsunuz.
PIR1.3=0
WHILE PIR1.3=0:WEND
'   shiftin DTA, CLK,0, [VERI]
VERI=SSPBUF

Bu sistemde donanımsal port pinlerini zorunlu olarak kullanmaktayız. Bunlar ;
PORTC.3 = Serial CLK pini olup her iki tarafta ortak (aynı pin) kullanılacaktır
PORTC.4= Serial Data in pini Bu pinden Data girişi yapılıyor RX tarafı bu pinden data alacaktır.
PORTC.5= Serial Data Out pini , Bu pin TX tarafında Data yollama pini olarak kullanılmaktadır.
Kolaylıkla anlaşılacağı üzere TX tarafındaki Data_Out pini , RX tarafındaki Data_in pinine bağlanacaktır.
RX tarafındaki Data_out pini de TX tarafındaki Data_in pinine bağlanacaktır.

Proje dosyası ilişiktedir. Bu projede TX tarafında PORTA.0 daki butona basıldığında 65 den 100'e kadar olan sayıları sırası ile karşıya göndermektedir. Hem yollayan hemde alan verileri tek tek göstermektedir.

Ete


Hattuşa

hocam elinize sağlık oldukça sade olmuş, uygulama kesin işimize yarayacak

mg1980


er-da


est32


F®T

Güzel bir çalışma daha.Bu kadar yoğunluğun arasında.Teşekkürler ETE hocam.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

gogoce

Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

Powered by EzPortal