CCS C ile yaptığım rf uzaktan kumanda projem

Başlatan tekniker_murat, 12 Haziran 2017, 23:10:03

tekniker_murat

Herkese selamun aleyküm değerli ustalarım bu gün otururken dedim biraz uğraşayım

12F675 pic'ler ile yaptığım basit bir uzaktan kumanda uygulamasını burada sizler ile paylaşmak istedim belki birisinin işine yarar...

verici :

#include <12f675.h>
#fuses INTRC_IO,NOMCLR,NOBROWNOUT,NOPROTECT,NOCPD  
#use  delay(clock=4000000)

#define GP0 PIN_A0 
#define GP1 PIN_A1 
#define GP2 PIN_A2 
#define GP3 PIN_A3 
#define GP4 PIN_A4 
#define GP5 PIN_A5 

#use rs232 (baud=2400, xmit=pin_a5,parity=N, stop=1)  // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve

 
int   veri;

//int   pr_1,pr_2,pr_3;
//int1  buton_1;
//int1  buton_2;

void  gonder(){

//veri=(getch);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x00);
putc(0x00);
putc(0x00);
putc(0x00);
putc(0x00);
putc(0xff);
putc(0xff);
putc(0xff);
putc(0xff); 
putc(0xff);
putc(veri);
//putc(veri);
//putc(veri);
//putc(veri);
//putc(veri);

//printf(pr_1,pr_1,pr_1,pr_1,pr_1,pr_2,pr_2,pr_2,pr_2,pr_2,pr_3,pr_3,pr_3,pr_3,pr_3,sifre_1,sifre_2,sifre_3,sifre_4,veri);
}
void main()
{

set_tris_a( 0b000110 ); // set GP0 output, all other inputs 
setup_comparator( NC_NC_NC_NC ); // disable comparators
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
output_low(pin_a5);

   while(TRUE) 
   {

   if (input(PIN_A2)==1){
  veri=10;
   gonder();
   output_high(pin_a4);
}
else{
output_low(pin_a4);}

   
   
      if (input(PIN_A1)==1){
  veri=20;
   gonder();
   output_high(pin_a0);
}
else{
output_low(pin_a0);}

   }
     //TODO: User Code
   }


Alıcı :
#include <12F675.h>
#fuses INTRC_IO,NOMCLR,NOBROWNOUT,NOPROTECT,NOCPD  
#use  delay(clock=4000000)

#define GP0 PIN_A0
#define GP1 PIN_A1 
#define GP2 PIN_A2 
#define GP3 PIN_A3 
#define GP4 PIN_A4 
#define GP5 PIN_A5 

#use rs232 (baud=2400, rcv=PIN_A5,parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve

int   veri;
//int   veri_3;
void main()
{

set_tris_a( 0b000100 ); // set GP0 output, all other inputs 
setup_comparator( NC_NC_NC_NC ); // disable comparators
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
output_low(pin_a0);

   while(TRUE)
   {
   
if (input(PIN_A0)==1){

}
    veri =  getch();
    
    if   (veri==10)  {
    
    output_high(pin_a0);
    
    }
    
    if   (veri==20)   {
    
    output_low(pin_a0);      
    }
   
       //TODO: User Code
   }
}



[email]murat.yagci.1984@gmail.com[/email]

Recep METE

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mehmetemin

@tekniker_murat teşekkürler, şemalarını da yükleyebilir misiniz ?

ghistmanzero

Paylaşım için teşekkürler. Bunu kurduğunuz devre,  arada algılamada gecikme veya kendi kendine yanma olayı yaptı  mi hiç?

tekniker_murat

@mehmetemin  usta şemalarını çizmedim modüller elimde vardı direk board üzerine yaptım geçtim lakin programı incelerseniz hangi pin rf vericiye bağlanmış hangisinde buton var hangiside butona bağlı led var falan anlaşılabilir. zaten mantık artık çok basit oldu.


Aslında dediğiniz gibi bir şema çıkartmak lazım ben bir zamanlar devre yapmıştım devre bataryadan tamamen izole edilmiş şekildeydi sadece butona basarsak hem işlemciye hem rf module hem de diğer elemanlara enerji gidiyordu ve bu sayede kullanılmadığı durumda eerji harcamıyordu.
Eğer zaman bulup uğraşma fırsatı yakalarsam onu eklemek isterim. Çünkü en azından öğrenci arkadaşlara faydalı olacaktır.




@ghistmanzero hocam şu an ki hali ile hiç bir gecikme yapıp yapmadığını el ile kontrol ettiğim esnada hissedemedim sadece devreyi board üzerinde kurduğum için pek sevimli olmadı.


Bunun haricinde aslında şifre olayına girilmesi gerekirdi yani en azından dört byte şifre ve ardından veri bilgisi gönderilebilirdi bu da çok güvenli bir iletişim sağlardı ama bunu yaptığım zaman sizin dediğiniz gecikme olayı hatta hiç haberleşememe olayı oluyor bizzat denedim.


Osiloskop ile bakıyorum örneğin A kanalını vericinin data hattına B kanalını Alıcının data hattına bağlıyorum 4 byte şifreli programı yazıp yüklediğim zaman osiloskopta gördüğüm tepki şöyle oluyor ki :


Vericiden veri yollamadığım zaman alıcı data hattı tamamen boş ve hiç bir sinyal görünmüyor sadece ama sadece çok küçük endüstriyel sinyal yani parazit gibi şeyler çıkıyor 3 saniyede 1 gibi...


Ama vericiden datayı yolluyorum verici data yollamaya başladı mı alıcıda da aynı datalar tıkır tıkır geliyor yani alıcı o rf dataları alıyor data bacağına gönderiyor ve ben de bunu data bacağında görebiliyorum ama komutlar çalışmıyor...


Sebebine gelirsek 5 byte preamble komutundan 3 tane yolluyorum yani uyandırma sinyali 0x55 0x00 0xff bunları 5 er defa yolladığım zaman 15 byte bu uyandırma sinyali ardından 4 byte şifre sinyali ve en son veriyi yolluyorum


Alıcıda ise if ((sifre1 == 1 ) & (sifre2==9) & (sifre3==8) & (sifre4==4)){


sonuc();


}


şeklinde bir mantık ile o şifreleri kontrol ettirip kontrol sonucu doğru ise yani şifreler doğru gelmişse sonuc alt programına yönlendirme yada işte sonuç alt programının çağrıldığı yeri iptal edip o döngü içinde switch case ile farklı döngü kurma gibi bir durum söz konusu olabiliyor.


Ama bu şifrelerin doğru gelip gelmediğinin kontrolü yani if komutu işi karıştırıyor gibime geliyor... sanki 12F675 4 mhz internal osc de bu kadar komutu doğru kararlılık ile işliyemiyor...


Şifre olayını 2 byte yapınca arada bir alıyor arada almıyor yada vericiden daha uzun süre butona basarsam alıyor gibi durumlar çıkıyor...


Ben işlemci ile CCS C nin kabalığına diye düşünüyorum işlemci küçük ccs c de sağlam bir program ve işlemciye ağır geliyor diye yorumladım yanlış ise düzeltin lütfen....


Bir de son olarak ben daha önceki yıllarda pic basic ile aynı projeyi yapmış aynı işlemci ile çalıştırmış hiç de sorun yaşamamıştım gecikme tanımama falan yoktu. Eğer isterseniz onu da buraya ekliyeyim aradaki farkları biraz inceleyelim ?


Ve abi sen bunda gecikme ve arada kendi kendine yanma olayı gibi sorunlar olabileceğini nerden tahmin ettin tecrübe ve bilgini bizimle de paylaşır mısın arz etsek...
[email]murat.yagci.1984@gmail.com[/email]

ghistmanzero

Alıntı yapılan: tekniker_murat - 13 Haziran 2017, 17:35:18
@mehmetemin  usta şemalarını çizmedim modüller elimde vardı direk board üzerine yaptım geçtim lakin programı incelerseniz hangi pin rf vericiye bağlanmış hangisinde buton var hangiside butona bağlı led var falan anlaşılabilir. zaten mantık artık çok basit oldu.


Aslında dediğiniz gibi bir şema çıkartmak lazım ben bir zamanlar devre yapmıştım devre bataryadan tamamen izole edilmiş şekildeydi sadece butona basarsak hem işlemciye hem rf module hem de diğer elemanlara enerji gidiyordu ve bu sayede kullanılmadığı durumda eerji harcamıyordu.
Eğer zaman bulup uğraşma fırsatı yakalarsam onu eklemek isterim. Çünkü en azından öğrenci arkadaşlara faydalı olacaktır.




@ghistmanzero hocam şu an ki hali ile hiç bir gecikme yapıp yapmadığını el ile kontrol ettiğim esnada hissedemedim sadece devreyi board üzerinde kurduğum için pek sevimli olmadı.


Bunun haricinde aslında şifre olayına girilmesi gerekirdi yani en azından dört byte şifre ve ardından veri bilgisi gönderilebilirdi bu da çok güvenli bir iletişim sağlardı ama bunu yaptığım zaman sizin dediğiniz gecikme olayı hatta hiç haberleşememe olayı oluyor bizzat denedim.


Osiloskop ile bakıyorum örneğin A kanalını vericinin data hattına B kanalını Alıcının data hattına bağlıyorum 4 byte şifreli programı yazıp yüklediğim zaman osiloskopta gördüğüm tepki şöyle oluyor ki :


Vericiden veri yollamadığım zaman alıcı data hattı tamamen boş ve hiç bir sinyal görünmüyor sadece ama sadece çok küçük endüstriyel sinyal yani parazit gibi şeyler çıkıyor 3 saniyede 1 gibi...


Ama vericiden datayı yolluyorum verici data yollamaya başladı mı alıcıda da aynı datalar tıkır tıkır geliyor yani alıcı o rf dataları alıyor data bacağına gönderiyor ve ben de bunu data bacağında görebiliyorum ama komutlar çalışmıyor...


Sebebine gelirsek 5 byte preamble komutundan 3 tane yolluyorum yani uyandırma sinyali 0x55 0x00 0xff bunları 5 er defa yolladığım zaman 15 byte bu uyandırma sinyali ardından 4 byte şifre sinyali ve en son veriyi yolluyorum


Alıcıda ise if ((sifre1 == 1 ) & (sifre2==9) & (sifre3==8) & (sifre4==4)){


sonuc();


}


şeklinde bir mantık ile o şifreleri kontrol ettirip kontrol sonucu doğru ise yani şifreler doğru gelmişse sonuc alt programına yönlendirme yada işte sonuç alt programının çağrıldığı yeri iptal edip o döngü içinde switch case ile farklı döngü kurma gibi bir durum söz konusu olabiliyor.


Ama bu şifrelerin doğru gelip gelmediğinin kontrolü yani if komutu işi karıştırıyor gibime geliyor... sanki 12F675 4 mhz internal osc de bu kadar komutu doğru kararlılık ile işliyemiyor...


Şifre olayını 2 byte yapınca arada bir alıyor arada almıyor yada vericiden daha uzun süre butona basarsam alıyor gibi durumlar çıkıyor...


Ben işlemci ile CCS C nin kabalığına diye düşünüyorum işlemci küçük ccs c de sağlam bir program ve işlemciye ağır geliyor diye yorumladım yanlış ise düzeltin lütfen....


Bir de son olarak ben daha önceki yıllarda pic basic ile aynı projeyi yapmış aynı işlemci ile çalıştırmış hiç de sorun yaşamamıştım gecikme tanımama falan yoktu. Eğer isterseniz onu da buraya ekliyeyim aradaki farkları biraz inceleyelim ?


Ve abi sen bunda gecikme ve arada kendi kendine yanma olayı gibi sorunlar olabileceğini nerden tahmin ettin tecrübe ve bilgini bizimle de paylaşır mısın arz etsek...

ben bitirme projemde iki devre arasında float bilgisi gönderiyordum. burdaki kod değerli bir kod. paylaştığınız için saolun tekrardan. ben öğrenciyken baya sıkıntı yaşamıştım yardım alma konusunda. ilgili forumları ve bulabildiğim herşeyi okudum :D  öncelikle bu uygulamanın bir benzerini yapmıştım. benim devrenin o zamanki hali bu: https://www.youtube.com/watch?v=cO0vXwguOl4
daha sonra biraz uğraşıp kodu düzelttim. float biligisi atacak hale  geldi.o da burda https://www.youtube.com/watch?v=cFPxtZHZvlU

işin uzmanı filan değilim ama kendimce uğraşlarım oldu.
o soruyu sormamın sebebi şu ki float olayında verinin sıkıntısız gitmesi için gönderimden önce bir tür bekleme döngüsü koyulmalı. alıcı daimi olarak dinlemede. herşeyden önce alıcı-verici çiftine ait bir kimlik olmalı ve bu kimlik  üst üste yollanmalı.benım yontemım buydu en azından . alıcı bunu yakalayınca bu sefer sürekli bir döngüye alıp vericiden belli bir boş veri atıyordum. alıcı kanalı yakalamış ve kitlenmiş oluyor. veriyi okuyor halde duruyor. en son boş veri kesildiği andan sonraki ilk okumada ana veriyi göderiyordum. bu şekilde arada algılamama veya durduk yere kendılıgınden yanma, kesilme durumları olmuyordu. gecikmeden kastım kristal veya üst üste değerlendirme değil de bu bahsettiğim kısımdı. bu kod da bahsettiğim şekilde elden geçirilebilir.tabi ki şuanki hali de iyi. uğraşacak kişiler için gayet uygun.daha fazlasını isteyen de dediğim şekilde az uğraşınca gayet sağlıklı çalışan bir kod yazabilirler . hani videolarda gördüğünüz gibi herhangi bir gecikme olmuyor. kullandığım hc-sr04 biraz sıkıntılı bir sensör olduğu için arada saçma değerler de atıyordu. ordaki  saçma değerler parazitten ziyade sensörün ölçtüğü hatalı değerler. normalde kendim bır  float belirleyip atınca hatasız atıyordu. baya uğraştırmıştı o zaman. şimdilerde o kod defalarca değişti .  adam akıllı bir mini kütüphaneye çevirdim. bir kaç ticari denemem de oldu ama henüz kayda değer bir durum yok.  ben 628a kullanmıştım ilkinde. sonraki videoda lcd de koyduğumdan  628a nın birini 877a ile değiştirdim fazladan pin gerektiği için.sonrasında  birkaç farklı işte daha kullandım.

https://www.youtube.com/watch?v=viqP8cPDKeo kablosuz kombı termostatı
https://www.youtube.com/watch?v=UTEQMsCBylU kablosuz motor kontrol


şimdi de iki kanallı ve çift modlu bir alıcı ve kumanda tasarımını yapıyordum. kumanda 3x3,5 cm ve  alıcı kart ise (üzerinde iki bağımsız role var) 4,5x5,5 cm.  kumandada iki buton alıcıdakı ilgili rolelerı (parmağı basıp çekince) açıyor .bir daha basınca kapatıyor. bu ilk mod . sonra alıcı üzerindeki bir switchi kapatınca bu sefer ikinci modda çalışıyor .parmak basılı olduğu surece role cekiyor.parkmak çekilince kesiliyor.
şuanki kartları da 628a ile tasarladım. içinde uart olan min pinli pic , pic12f1822 gibi görünüyor. ama o da zaten fiyat olarak  628a dan daha pahalı  :D onun için yine 628a kullandım. kartlara ek özellik eklemeyi düşünüyorum.o boş pinler içimi yakar yoksa :)   12f675 in uart ve intrda kesmesı olmaması beni gıcık etti zaten. bu şekilde kullanınca çalışır çalışmasına ama bahsettiğim hata durumları olma ihtimali yüksek. ama elbette ki bunun çaresi var. kısa bir süreliğine bir rf şirektinde arge mühendisliği yaptım. onlar 675 kullanıyorlardı. sadece kumanda ve alıcının pcb tasarımını yaptım.kodları inceleyecek kadar çalışmadım orda. hani büyük ihtimal onlar da kesme kullanarak sürekli pini dinleyip aynı yolu izliyorlardı.belki de hiç uğraşmadan direk de atıyorlardı.bilemiyorum.ama işin üstesinden gelmişler hani.

tekniker_murat

Evet emek etmiş ortaya güzel bir proje koymuşsunuz...


Benim de elimde kalan okul yıllarından bir kaç resim var video çekmemiştik ama resimlerden buldum o zaman gençmişiz be saçlarımız varmış :D


Resimde sensörleri koymamışız ama uzaktan kumanda ve kutusu duruyor kocaman ana devrenin üzerindeki kumandayı yapmak için kutusunu araştırmıştık bulmuştuk o kutunun içine baskı devre ile kart yapmış pic progarmlamış kumanda yapmıştık hey gidi günler hey :)











[email]murat.yagci.1984@gmail.com[/email]

ghistmanzero

@tekniker_murat  tebrikler :) gerçekten hoş bir proje olmuş. kumandanın  kalıbını bulmanız ve ahşap tasarım güzel  olmuş :)

tekniker_murat

#8
O gün ki imkanlar ile işte böyle şeyler bulduk... Bu kumanda kutusu için burdurdan izmire gelmiş izmirde aramıştım :) o dönemin hocası ( çok severim kendilerini ) Mustafa arı hocam bu ahşap kutu yüzünden çok uğraştırmıştı :D

Tam devreyi yapıyor bitiriyorum kutu çok büyük git küçült getir diyor bir daha baştan uğraşıyorduk :D o bitiyor çok derin olmuş derinliğini düşürtün al baştan bir daha :D gücümüz yoktu ki o zamanlar yaptıralım özel plastik enjeksiyondan ah hocam ah neler çektirdiniz :D :D


Oysa şu an böyle bir proje yapacak olsam hiç kutu yada kumanda ile uğraşmazdım udea nın hazır yapılı olan kumandaları var içinde pic 12F629 smd entegre var alırım onu ve programlar geçerim :D


http://www.udeashop.com/4004-00,PR-38.html bu ve benzeri olanları örnek olarak gösterebilirim....
[email]murat.yagci.1984@gmail.com[/email]

necati

[email]entegreterbiyecisi@yahoo.com[/email]

ghistmanzero

Alıntı yapılan: necati - 13 Haziran 2017, 22:41:17
bir de buraya bakın
http://blog.larios.tecnologia.ws/iBlog/archives/8872/
kanal sayısının fazla  olması için 877 kullanılmış. aynı mantık. ihtiyaç varsa gayet  güzel bir çalışma olmuş burdaki