Seri porttan PIC'e IRLED ile veri gönderimi?

cacican

Üye
Katılım
24 Nis 2009
Mesajlar
6
Puanları
1
Yaş
36
Merhabalar. Sistemi kaba olarak şöyle anlatayım: Seri port çıkışından pic'e bir veri gidecek. PIC, gelen bu veriye göre IR LED ile diğer piclere bu veriyi gönderecek ve PICler bu verileri IR alıcı ile alıp karşılaştıracak ve kendisine uygun olan veri geldiyse, o PIC'e bağlı olan led yanacak. Örneğin; seri port üzerinden IR LED'den A verisi gönerilmiş olsun ve 3 adet alıcımız 3 ayrı PIC'e bağlı olsun..ilk alıcı A verisini, ikinci alıcı B verisini, üçüncü alıcı da C verisini referans olarak alsın. IR LED üzerinden A verisi geldiği için, ilk PIC'e bağlı olan LED yanacak, 5 saniye sonra sönecek, diğer PIC'ler tepki göstermeyecek. Sistem bu şekilde döngü halinde devam edecek. Elinde buna benzer çalışma olan ya da sitede buna benzer bir devre var ise konuyu cevaplarsanız sevinirim. Teşekkürler..
 
bu işi en basit yapabilmen için öncelikle kendine bir seriport frami oluşturman lazım. bunun için kendine başlangıç karakteri belirle. başlangıç karakterin diğer göndereceğin verilerde bulunmaması lazım. bu karakter geldi mi tüm denetleyiciler komut geldiğini algılayacaktır. ardından her cihaza bir ID değeri verirsisn. başlangıç karakterinden sonra Id değerini gönderirsin. pic tarafında da başlangıç karakteri ve ID kontrolü yaparsın o ID hangi pic e aitse o verinin kalanını alır ve işlemini yapar. ben bunu modbus için yazdığım programlarda ve farklı bir otomasyon projesinde kullandım ve sıkıntısız olarak birden fazla cihazı kontrol edebiliyorum. oluşturduğum seri port frami:
<Başlangıç karakteri":"><ID"01"><Komut"00"><Data"FF"><CRLF> örn:
:010300FFCRLF
gibi. ben bunlarda ascii kullanmayı tercih ettim.her gördüğün karakteri ascii koduyla gönderdim. ve oldukça sağlıklıda çalışıyor.zaten bu yapıda modbus ascii yapsına çok benzeyen bir yapıdır. bu şekilde yapabilirsin.
yalnız IR ledler konusunda biraz soru işaretim var çok uzak mesafelere çıkmak çok zor ve sensörler birbirini görmeden çalışmaz. tavsiyem IR led yerine RF alıcı verici kullanman yada çok uzam mesaflere çıkacak RS485ile kablolu haberleşme yapman. sıkıntı yaşarsanız yazılımında takıldığın yerlerde de yardımcı olurum. ii geceler.
 
bu işi en basit yapabilmen için öncelikle kendine bir seriport frami oluşturman lazım. bunun için kendine başlangıç karakteri belirle. başlangıç karakterin diğer göndereceğin verilerde bulunmaması lazım. bu karakter geldi mi tüm denetleyiciler komut geldiğini algılayacaktır. ardından her cihaza bir ID değeri verirsisn. başlangıç karakterinden sonra Id değerini gönderirsin. pic tarafında da başlangıç karakteri ve ID kontrolü yaparsın o ID hangi pic e aitse o verinin kalanını alır ve işlemini yapar. ben bunu modbus için yazdığım programlarda ve farklı bir otomasyon projesinde kullandım ve sıkıntısız olarak birden fazla cihazı kontrol edebiliyorum. oluşturduğum seri port frami:
<Başlangıç karakteri":"><ID"01"><Komut"00"><Data"FF"><CRLF> örn:
:010300FFCRLF
gibi. ben bunlarda ascii kullanmayı tercih ettim.her gördüğün karakteri ascii koduyla gönderdim. ve oldukça sağlıklıda çalışıyor.zaten bu yapıda modbus ascii yapsına çok benzeyen bir yapıdır. bu şekilde yapabilirsin.
yalnız IR ledler konusunda biraz soru işaretim var çok uzak mesafelere çıkmak çok zor ve sensörler birbirini görmeden çalışmaz. tavsiyem IR led yerine RF alıcı verici kullanman yada çok uzam mesaflere çıkacak RS485ile kablolu haberleşme yapman. sıkıntı yaşarsanız yazılımında takıldığın yerlerde de yardımcı olurum. ii geceler.

Çok teşekkür ediyorum. Ben de ASCII kod gödermeyi düşünüyorum fakat daha önce buna benzer bir çalışmam olmadığı için hangi şekilde göndereceğimi bilmiyorum açıkçası. Elinizde örnek dökümantasyon veya örnek kod varsa ve paylaşırsanız sevinirim. Tekrar teşekkürler.
 
Bir de söylemeyi unuttum. ASCII kod göndermeyi visual basic programı üzerinden yapmak zorundayım.
 
S.A.
Sn. Arkadaşım bu işi rf ile yapsan daha iyi olmazmı IR olması şart mı?
 

#define LF 0x0a
#define CR 0x0d

#int_RDA
void RDA_isr(void)
{
char modbus_rx[40];
int8 n=0;
long timeout;
int1 timeout_error=0;
disable_interrupts(INT_RDA);
while(!timeout_error){
timeout=0;
while(!kbhit()&&(++timeout<60000)) // crlf gelmezse kilitlenmemesi için
delay_us(10);
if(kbhit()){
modbus_rx[n]=getc();
modbus_rx[n]&=0x3f; //8. biti temizle
if(modbus_rx[n]==LF){
if(modbus_rx[0]==':'&&modbus_rx[1]==SLV_ADRH&&modbus_rx[2]==SLV_ADRL){
//SLV_ADRH ve SLV_ADRL cihaz adresi doğruysa aşağıdaki komutlara
//göre işlem yapar
switch (modbus_rx[4]){
case '1'://
//:<ID><01><Data><CRLF>
break;
case '2'://
//:<ID><02><Data><CRLF>
break;
case '3'://
//:<ID><03><Data><CRLF>
break;
case '4'://
//:<ID><04><Data><CRLF>
break;
case '5'://
//:<ID><05><Data><CRLF>
break;
case '6'://
//:<ID><06><Data><CRLF>
break;
case '7'://
//:<ID><06><Data><CRLF>
break;
}
}
break;
}
n++;
}
else {
timeout_error=TRUE;
n--;
}
}
enable_interrupts(INT_RDA);
}
/* komut yapısı:
":" başlanıç karakteri
"xx" cihaz adresi SLV_ADRH ve SLV_ADRL değişkenlerinde tutulur
"0x" komut 00 ile 0F arası 15 tane komut oluşturabilirsin
"xx" data
"CRLF" komut sonu */

ben pic progrmamını ccs c de yazıyorum sana pic programı için örnek bir kesme alt programı gönderiyorum umarım işe yarar.
 
visual basic programında kolayca yapabilirsin. SerialPort nesnesini kullanman gerekli. bu nesneyi formuna eklediğinde bu nesnenin olayları içinde DataReceived olayı var. bu olay veri alındığında tetiklenir.
******************************************************************
veri alımı için sub
*****************************************************************
Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS485.DataReceived
Try
Dim RxDataStr As String
RxDataStr = SerialPort1.ReadLine
Me.Listbox1.Items.Add(RxDataStr)
SeriPortMesgul=False
Catch ex As Exception
MsgBox("Comport veri alım hatası:" + vbCrLf + ex.ToString, MsgBoxStyle.Critical, "HATA - " + SerialPort1.PortName)
SeriPortMesgul=False
End Try
End Sub
*************************************************************
veri göndermek için sub
*************************************************************
Public Function SeriPortKomutGonder(ByVal KmtData As String) As Boolean
Try
Dim Temp As String
Temp = KmtData + vbCrLf
SerialPort1.Write(Temp)
SeriPortMesgul = True
Return True
Exit Function
Catch ex As Exception
If ex.Source = System.IO.Ports.SerialError.TXFull Or ex.Source = System.IO.Ports.SerialError.Overrun Then
SeriPortMesgul = False
End If
Return False
End Try
End Function
****************************************************************
SeriPortMesgul değişkeni porttan gönderilen verinin alımı için portun beklemesini sağlar.
porttan alınan veri listbox1 nesnesine eklenir.
 

#define LF 0x0a
#define CR 0x0d

#int_RDA
void RDA_isr(void)
{
char modbus_rx[40];
int8 n=0;
long timeout;
int1 timeout_error=0;
disable_interrupts(INT_RDA);
while(!timeout_error){
timeout=0;
while(!kbhit()&&(++timeout<60000)) // crlf gelmezse kilitlenmemesi için
delay_us(10);
if(kbhit()){
modbus_rx[n]=getc();
modbus_rx[n]&=0x3f; //8. biti temizle
if(modbus_rx[n]==LF){
if(modbus_rx[0]==':'&&modbus_rx[1]==SLV_ADRH&&modbus_rx[2]==SLV_ADRL){
//SLV_ADRH ve SLV_ADRL cihaz adresi doğruysa aşağıdaki komutlara
//göre işlem yapar
switch (modbus_rx[4]){
case '1'://
//:<ID><01><Data><CRLF>
break;
case '2'://
//:<ID><02><Data><CRLF>
break;
case '3'://
//:<ID><03><Data><CRLF>
break;
case '4'://
//:<ID><04><Data><CRLF>
break;
case '5'://
//:<ID><05><Data><CRLF>
break;
case '6'://
//:<ID><06><Data><CRLF>
break;
case '7'://
//:<ID><06><Data><CRLF>
break;
}
}
break;
}
n++;
}
else {
timeout_error=TRUE;
n--;
}
}
enable_interrupts(INT_RDA);
}
/* komut yapısı:
":" başlanıç karakteri
"xx" cihaz adresi SLV_ADRH ve SLV_ADRL değişkenlerinde tutulur
"0x" komut 00 ile 0F arası 15 tane komut oluşturabilirsin
"xx" data
"CRLF" komut sonu */

ben pic progrmamını ccs c de yazıyorum sana pic programı için örnek bir kesme alt programı gönderiyorum umarım işe yarar.

çok teşekkür ediyorum. Bu yöntemi deneyeceğim.
 
IR ile daha önce çalışmanız oldumu IR ile data gönderirken ledin girişine 38-40khz frekansla datayı göndermeniz gerekiyor yani pc seri portunda bağlı olan pic alıdığı datayı 38-40khz frekans ile lede basmak zorunda aksi takdirde alıcı IR hiç bir data alamaz ben daha önce bu frekansı pic ile yapıyordum fakat daha kolayı picin IR led çıkış ucuna 555 entegresi koyarak gönderilen her 1-0 datasını alıcının frekansında göndermek böyle çok daha kolay oluyor ben pcye bu şekilde rs232 IR ile alıcı vericili devre yaptım ve kullanıyorum esas problem visiual basic değil yani basic ile ilgili kodlar kolay
 

Forum istatistikleri

Konular
129,839
Mesajlar
930,679
Kullanıcılar
452,678
Son üye
TengRi

Yeni konular

Geri
Üst