UDEA ‘nın RF Veri İletimi Alanındaki Küçük Devleri: ATX-34 / NRX-34

Yayınlandı: 08 Kasım 2011 / Projeler
Etiketler:, , , , , , , , , , , ,

Bir grup Türk mühendisi tarafından 1999 yılında Ankarada kurulmuş olan UDEA dünya genelinde bir müşteri portföyüne kablosuz haberleşme (Radyo Frekans – RF) teknolojileri konusunda ürün ve hizmet sağlamak amacıyla kurulmuş özel bir şirkettir. Udea’nın misyonu kablosuz haberleşme konusunda daha yüksek teknoloji ve kalitede ürün ve hizmet üretimidir. Sitesine buradan ulaşabilirsiniz.

Bu firmanın ürünleri ile tanışınca Türkiyede artık bu tür üretimin olması gerçeği göğsümü kabarttı. Ürün yelpazesi çok geniş olmasada yaptıkları işler gerçekten de çok büyük. Bu yazımızda bu firmanın en küçük, en ucuz ( alıcı verici çifti yaklaşık 30TL) ve kullanımı en kolay olan modülleri olan ATX-34 (verici) ve NRX-34 (alıcı) modülünü inceleyeceğiz. Bu modüller kendi aralarında kablosuz olarak iletişim kurabilmekte ve 300 metre mesafeden haberleşebilmektedirler.

Bu modüller sadece bir adet anten bağlantısı , +,- besleme bağlantıları ve NRX-34 seri data çıkışı için, ATX-34 ‘te seri data girişi için birer adet bağlantı içerirler. NRX-34’ün ayrıca türüne göre (iki farklı tür NRX-34 bulunmaktadır, NRX-34U-E, NRX34U-R) bir tane daha çıkış ucu bulunur. NRX-34U-R ,  RSSI  isimli analog bir çıkışa sahiptir. Bu çıkış, eğer modül  data alır ise 1V seviyelerinden 2V seviyelerine çıkarak bilgi geldiğini haber vermek için kullanılır. NRX-34U-E’de ise modülü aktif veya pasif etmek için “enable” ucu bulunur. Benim kullandığım modül NRX-34U-R’ idi.

Büyütmek için tıklayın.

Modüller hakkında bu kadar bilgi verdikten sonra işe koyulalım. Ben ilk önce ATX-34 ile 16f628A’nın bağlantısını yaptım. Mikrodenetleyicinin TX ucunu, modülün Data ucuna bağladım ve daha sonra beslemelerini bağladım.  Alıcı kısımda ise yine bir 16F628A kullanarak NRX-34’ün Data ucu ile işlemcinin RX ucunu birleştirdim. Kodlarımı yazarak işlemcilere yükledim. Verici kısımda PORTB’nin 0.pinine bağlı butona basarak alıcı kısımdaki ledi yaktım. Butondan elimi çektiğimde led sönüyor, bastığımda ise yanıyor. Fakat bu işlemin gerçekleşmesi için takip etmemiz gereken adımlar var. Asıl olay şu: Alıcı modülün gönderdiğimiz verileri düzgünce alabilmesi için ilk önce uyandırılması gerekiyor. Bunun için “preamble” dediğimiz  veriyi göndermemiz gerekiyor.Bu veri 10101010 veya 01010101 olabilir. Tabi 5 bayt olarak gönderiyoruz. Yani 0x55,0x55,0x55,0x55,0x55 veya UUUUU verilerini ardarda araya boşluk girmeden gönderiyoruz. Hemen arkasından senkronizasyon sağlamak için 5 byte 0xff ve 5 byte 0 gönderiyoruz. Bu verileri göndermemiz iletişim kurulabilmesi için şart. Bu verilerin arkasından da asıl bilgileri gönderiyoruz alıcıya. İsterseniz hemen kodlarımıza bakalım. Unutmadan ekleyeyim kodları MikroC PRO 5.20 ile yazdım. Ayrıca anten bağlantısı için ise 17.3 cm uzunluğunda bakır bir tel kullanabilirsiniz. Daha ayrıntılı bilgi modüllerin kataloglarında yer almakta.

VERİCİ:

char pre[15]={'U','U','U','U','U',255,255,255,255,255,0,0,0,0,0};
char yak[3]={'y','a','n'};  //Senkron için en az bir byte sıfır gönder kesinlikle.....
char son[3]={'s','o','n'};
char i=0,j=0;

void kurulum()
{
 UART1_Init(2400);
 trisb.f0=1;
 Delay_100ms();

}

void main()
{
 kurulum();
 while(1)
       {
         if(portb.f0)
         {
          for(i=0;i<15;i++)
                           {
                            UART1_Write(pre[i]);
                           }
          for(j=0;j<10;j++)                   //garanti olması açısından 10 kez gönderiliyor veriler...
          {
                          for(i=0;i<3;i++)
                          {
                           while(!UART1_Tx_Idle());
                           UART1_Write(yak[i]);
                          }
          }
         }

          //*************************************************************
         if(!portb.f0)
         {
          for(i=0;i<15;i++)
                           {
                            UART1_Write(pre[i]);
                           }
          for(j=0;j<10;j++)
          {
                         for(i=0;i<3;i++)
                         {
                          while(!UART1_Tx_Idle());
                          UART1_Write(son[i]);
                         }
          }
         }
       }
}

ALICI:

char az,i=0, msg[6];
void main()
{
 UART1_Init(2400);
 trisb.f0=0;
 portb.f0=1;
 delay_ms(100);

 while(1)
         {
          if(UART1_Data_Ready())
          {
           msg[i]=UART1_Read();
           if(msg[0]=='y' || msg[0] == 's')//Eğer msg[0] 'y' veya 's' ise i değişkeninin 1 arttır.
                                           {
                                            i++;
                                           }
          }
          if(i==3)
                  {
                   if(msg[0]=='y' && msg[1]=='a' && msg[2]=='n' )portb.f0=1;  //Senkron için gönderilen sıfır veya 255 aranmaz....
                   if(msg[0]=='s' && msg[1]=='o' && msg[2]=='n' )portb.f0=0;
                   i=0;
                   msg[0]=0;

                  }
         }
}

NRX-34’ün kataloğuna buradan, ATX-34’ün kataloğuna ise buradan ulaşabilirsiniz..
İyi çalışmalar.

yorum
  1. Ferdi Gürtekin dedi ki:

    hocam pic basic de serout2 PORTC.0,396,[REP$AA\5,REP$00\5,REP$FF\5] böyle bir komut kullanıyordum ve çalışıyordu şimdi hi tech c ye geçtim bundan yola çıkarak 5 kere 0xaa 5 kere 0x00 5 kere 0xff gondersem alıcım uykundan uyanır mı ?

  2. seyf dedi ki:

    udea nın kendi örneği mi bu ?

  3. burak dedi ki:

    gönderimde veri tipi önemli mi? char tipinde bir veri gönderiyorum ama karsı tarafta farklı bir değer alıyorum. nedeni ne olabilir

  4. Atakan dedi ki:

    Keşke CCS C olsaymış.. Başka dilleri anlamakta zorlanıyorum..

  5. sedat dedi ki:

    Hocam modüllerle açık alanda kaç metre boyunca sıkıntısız haberleşebiliriz .. Denemişsindir diye umuyorum :D. Kullanım kılavuzuna göre 200-300mt ama

  6. sedat dedi ki:

    Ben de sipariş verdim bakalım heyecanla bekliyorum. Umarım istediğim gibi çalışır..
    Cevap ve çalışmaların için teşekkürler Hocam …

  7. özkan dedi ki:

    Hocam emeğinize sağlık, denedim gerçekten çok sağlıklı çalışıyor; ama benim büyük bir sorunum var, hatta genel bir sorun. Mikroc’ nin kendi kütüphanesindeki kodlar similasyonda çalışıyor; fakat gerçekte çalışmıyor. Kendi kütüphanesinde RX TX çıkışlarına bağlı olmadan kontrol sağlayabiliyor. Yani uart gibi komutları kullanmıyor, istediğimiz yeri kendimiz data seçerek Man_Send(0x0A); gibi bir örnekle veri gönderebiliyoruz. Bunu similasyonda çalıştırdım çalışıyor; fakat gerçek ortamda çok sağlıksız çalışıyor. Alıcı devresinde çıkışlar belirli bir müddet sonra kendiliğinden pasif oluyor veya aktif oluyor. Yardımcı olabilirseniz sevinirim. Yani benim istediğim RX TX çıkışlarına bağlı kalmadan istediğim çıkışı data yapabilmek.

  8. özkan dedi ki:

    Hocam ilginiz için gerçekten çok teşekkür ederim. Daha denemedim, deneyeceğim. Gerçekten çok güzel bir paylaşım sitesi oluşturmuşsunuz ve bilgilerinizi paylaştığınız için tekrardan çok teşekkür ederim.

  9. preamble dizisi içerisinde 15 byte veri göndermişsiniz. Bunlardan ilk 5i preamble, sonraki 10 byte (5+5) ise sencron datalarıdır. Preamble verisi modülü uyandırmak içindir. Alıcı bu veriyi algılamaz. Ama alıcı sencron datasını algılar. Alıcı tarafta neden bunu sorgulamıyorsunuz.

    • mikrodunya dedi ki:

      Senkron mesaj başlangıcının doğru algılanabilnmesini sağlar. Bunun için de 5 byte 0 veya 5 byte ff göndermek gerekir. Bunu göndermeden şu şekilde bir deneme yapabilirsiniz mesela: Tel üzerinden veri gönderirken teli söküp tekrar takın, bazı durumlarda iletişimin koptuğunu ve teli takmanıza rağmen tekrardan iletişim sağlayamadığınızı göreceksiniz.

      • Ferudun GÖKCEGÖZ dedi ki:

        Dediğiniz gibi sencron datası mesajın başının doğru algılanabilmesi içindir. Siz verici tarafta 10 bytelık sencron datası gönderiyorsunuz. Bu data alıcı tarafa ulaşıyor. Ama sencron datasının doğru gelip gelmediğini sorgulamıyorsunuz. Burada bir mantık hatası var. Birde şu var sencron datasının illa 5 byte 0, 5 byte ff olması gerekmiyor. Bunu istediğiniz şekilde istediğiniz byte kadar seçebilirsiniz. Benim dikkat çekmek istediğim şey, bu datanın alıcı taraftaki mcu ya ulaştığı halde neden sorgulayıp, kontrolünü yapmadığınız…

      • mikrodunya dedi ki:

        Senkron datası sorgulamak için gönderilen bir data değil. Herhangi bir hata yok burada. Senkron için gönderilen 0 ve 1 ler iletişimde meydana gelen kopuklukların önüne geçmek için gönderilir. Siz dediğim şeyi bir deneyin ne demek istediğimi daha iyi anlayacaksınız.
        İki adet mcuyu karşılıklı bağlayın rx tx olarak. Birisinden diğerine sürekli veri basarak bu veriler ile iş yaptırın. Mesela “yak” gelince led yansın “son” gelince led sonsun. Veri bastığınız sırada aradaki bağlantıyı kopartıp tekrar bağlayın. İletişimin kesildiğini göreceksiniz.
        http://www.mediafire.com/?jyu9y2s4g774993
        Buradaki simülasyona bakın mesela..

  10. Ferudun GÖKCEGÖZ dedi ki:

    Sizin verdiğiniz yazılımı denedim. Çalışmasına çalışıyor. Ama bu hata var olduğunu engellemez. Şimdi başka bir şekilde deniyorum ve sadece preamble gönderiyorum. Haberleşme gerçekleşiyor. Sencron datasını yanlış biliyorsunuz. Sencron datası karşı tarafa gider. Ve işlemciye UART tan gelir. Sizin bu datayı sorgulamanız gerekir. Gönderilen datanın başını yakalama meseleside şudur. Mesela alıcı tarafı, tam datanın ortasındaki byte gönderilirken enerjilendirdik. Bu durumda işlemci alması gereken datayı eksik almıştır. İşte tam bu durumda, sencron datasını sorgular. Ve mesajın başının tam olarak alınıp alınmadığını kontrol eder ve ona göre işlem yapar. Sencron un ne olacağını yazılımcı belirler. İstersen A, B, C gibi 3 data gönder. Ve alıcı tarafta bu A, B, ve C datalarını sorgula.. Eğer bu data algılanmışsa mesaj kopuk değildir ve datayı işleme sokar. Siz burada hata yapmışsınız. Ve hata yaptığınızı kabullenmek istemiyorsunuz.

    • mikrodunya dedi ki:

      Peki siz doğru biliyor olun. Son gönderdiğim örneği bir inceleyin isterseniz. Hata yapmış olsam elbette kabul ederim. Fakat bu işi bilmeyen sizsiniz birde üste çıkıyorsunuz. Sürekli veri gönderdiğiniz yani kesik kesik göndermediğiniz zamanda herhangi bir kopukluk oluşursa nasıl çözeceksiniz peki? Son yorumdaki örneği inceleyin. Mesajın doğru gelip gelmediğini benim yaptığım gibi sorgulayacaksınız. 4 byte veri gönderirsiniz , ilk 3 byte’ı sorgularsınız. 4. byte değerli veridir. Senkron ise mesajın başını yakalamak için gereklidir. Kesik kesik veri gönderlirse herhangi bir problem tabiki olmaz. Fakat sürekli veri gönderildiğinde problem ile karşılaşırsınız.

      • Ferudun GÖKCEGÖZ dedi ki:

        Sizin bu yazınızda verdiğiniz yazılımıda,bu rf alıcı ve verici ile ilgili birçok farklı yazılımıda denedim. Maalesef sizin dediğiniz gibi çalışmıyor. Benim derdim sizin hatalı benim hatasız olduğumu göstermek değil. Yaptığınız yanlışı size gösterip doğruyu ortaya koymak.. Anlamak istemiyorsanız, siz bilirsiniz…

      • mikrodunya dedi ki:

        Ortada bir yanlış yok. Bu modülleri ve daha büyüklerini yıllardır yüzlerce projede kullandım. Bugüne kadar herhangi bir problem çıkmadı hiçbirisinde. Led yakıp söndürürken senkron göndermeseniz bile problem olmaz. Fakat sürekli data iletiyorsanız eğer senkronu kesinlikle göndermeniz gerekir. Güvenli bir sistem tasarlamak istiyorsanız kablolu sistemlerde dahi senkron verisi göndermelisiniz. Eğer o dosyaya baktıysanız ve nasıl çalıştığını gördüyseniz ne demek istediğimi çok iyi anlamış olmalısınız.
        Arkadaşım sen benim yorumumda gönderdiğim dosyasyı çalıştırdın mı? Oradaki butonu bir aç kapa bakalım ne oluyor?
        Ben de sizin eksik bilginizi tamamlamak için uğraşıyorum. Aksi halde hakaretvari yorumlarınızı yayınlamayıp kale almazdım. Ayrıca vericideki koda da bir göz atın. Orada göreceksiniz ki senkron gönderilmiyor. Senkronu gönderirseniz butonu açıp kapatsanız dahi veri akışı doğru olacaktır.

  11. ismail dedi ki:

    merhaba.bende bi RF alıcı verici yaptım proteustak, devrede program cok güzel calışmasına ragmen gerçek uygulamada çalışmıyor…acaba program konusunda yardımcı olabilecek varsa çok sevinirim ??

  12. ismail dedi ki:

    nasıl gönderiliyor.yükleyemedim siteye mail adresinizi atsanız mail atsam olmaz mı

  13. sabri vural dedi ki:

    hocam 4 kananlı uzaktan kumanda devresi rölelı arıyorum bana yardımcı olabılırmısınız

  14. sabri vural dedi ki:

    hocam 4 kananlı uzaktan kumanda rölelı devresı arıyorum yardımcı olablırmısınız ltfen msnden bana ulasabılırsıznız s_sabri90@hotmail.com

  15. Ali dedi ki:

    Arkadaşlar bir sorunum ama önce devreyi bir açıklayım. RB1 – RB2 – RB3 verici devresinde 3 buton.

    alıcı devresi ise vericinin rb1 butonuna basıldığı zaman led1 yanacak, rb2 basıldığı zaman led2 yanacak, rb3 basıldığı zaman led3 yanacak.

    devre normal olarak çalışıyor.

    Sorunum alıcı devresi bazen butonlara basmadan bile ledler yanıyor. sebebi ne olabilir.

    preamp() bir sorun mu var
    {
    for(i=0;i<5;i++)
    {
    Uart1_Write(0x55); // datasheettinde yazan deger, uyandirma degeri
    }
    for(i=0;i<5;i++)
    {
    Uart1_Write(0x00); // datasheettinde yazan deger, uyandirma degeri
    }
    for(i=0;i<5;i++)
    {
    Uart1_Write(0xFF); // datasheettinde yazan deger, uyandirma degeri
    }

  16. ali dedi ki:

    Göndermede RB1’e basıldığı zaman
    preamp(); çağırıyorum arkasından
    UART1_Write(‘s’);
    UART1_Write(‘t’);
    gönderme yapıyorum..

    ama verici kapalı durumda alıcı yine kafasına göre çalışıyor.

    şifreleme derken bir örnek verirseniz.

  17. Ali dedi ki:

    hocam sizin yukarıda yazdığınız kodları devreme uyarladım 7-8 saat devre tamam olarak çalıştı.
    şimdilik bir sorun yok…

    alıçı iyi bir şekilde çalışıyor.

    şifreleme derken sizin kodlarda uyguladığınız formülmü “y” harfi geldiği zaman i değişkenini artırıp i değişkeni 3 ise “y”.”a”.”k” koşulunu tamamlarsa komut işle. şifreleme bu mu oluyor hocam.

    Bir de son bir kez bu yazdığınız kodları SOFT_UART ile yazarsanız seviniriz…

  18. ali dedi ki:

    hocam bir sorum daha olacak rf ile data gönderimi nasıl oluyor.
    vericiden “ahmet” diye bir string göndermek istiyorum.
    alıcıdan da bunu almak istiyorum nasıl oluyor. hazır bir örneğiniz varmı.

    • mikrodunya dedi ki:

      pre+sifre+data

      pre+sifre+'a';
      pre+sifre+'h';
      pre+sifre+'m';
      pre+sifre+'e';
      pre+sifre+'t';

      Veya pre+sifre+”ahmet”;

      • Th3r4p1sT dedi ki:

        hocam paylaşım için teşekkürler. aynı kodları 8051 için yapmaya çalışıyorum. ancak burda kafama takılan şey şu, ben data gönderirken
        pre+sifre+”ahmet”;
        sırasını kullanıyorum. peki ahmet şeklindeki diziyi gönderdikten sonra nrx34 ne kadar süre bekledikten sonra tekrar uykuya dalıyor? yani gönderim 1 MikroSaniye kesintiye uğrarsa dahi tekrar preamble ve sifre(senkron) göndermem gerekiyor mu?

      • mikrodunya dedi ki:

        Veri kesildiği an modüller arasındaki iletişim durur ve tekrar başlatmanız gerekir. Buradaki kesinti süresi baudrate ile alakalı bir durum. Eğer düşük baudrate değerlerinde çalışacaksanız 1us önem arzetmez.

  19. ensarazili dedi ki:

    arkdaşlar ben lm35 ile ölçüm yapıp rf ile göndermek istiyorum biraz yardımcı olabilecek olan varmı acaba

  20. ensarazili dedi ki:

    Kolay gelsin hocam ben lm35 ile degeri olcup rf ile gondermek istiyorum ama olmuyor devreyi kurdum yine olmadi araya kablo baglarsam oluyor rfim calisiyor yukardaki devreyi kurdum calisiyor simdiden tesekkurler

    Alıcı
    sbit LCD_RS at RB2_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;

    sbit LCD_RS_Direction at TRISB2_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    Unsigned int derece,deger;

    void main()
    {
       UART1_Init(2400);
       trisb = 0;
       Lcd_Init();
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Cmd(_LCD_CURSOR_OFF);
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1,”SICAKLIK=”);
       Lcd_Chr (1,12,223);
       Lcd_Chr(1,13,’C’);
       delay_ms(100);

     while(1)
     
             {
           if(UART1_Data_Ready()==1)
             deger=Uart1_Read();
                delay_ms(100);
             derece=deger*500/1024;

             Lcd_Chr(1, 10, (derece/10)+48);
             Lcd_Chr(1, 11, (derece%10)+48); 
             delay_ms(100);

             }
    }

    verici

    char pre[15]={‘U’,’U’,’U’,’U’,’U’,255,255,255,255,255,0,0,0,0,0};
    char i;
    Unsigned int deger;
    void kurulum()
    {
       ADCON0 = 0x01;
       ADCON1 = 0x0e;
       Uart1_Init(2400);
       TRISA=0x01;
       Delay_ms(100);

    }

    void main()
    {
     kurulum();
     while(1)
           {
           for(i=0;i<15;i++)
                               {
                                UART1_Write(pre[i]);
                               }
           deger=ADC_Read(0);
               delay_ms(100);
            while(!UART1_Tx_Idle());
                   UART1_Write(deger);
                   delay_ms(3000);

           }
    }

    • mikrodunya dedi ki:

      Verici için şunları söyleyebilirim.
      ADC’den okuduğunuz “deger” integer bir değerdir. Dolaysı ile uarttan göndermek için birtakım işlemlerden geçmesi gerekir.
      Bu işlemler ;
      “deger” değişkeninin stringe (karakter dizisi) çevrilmesi veya bytelarına ayrılması gerekir. Çünkü uarttan veriler birer byte olarak gönderilebilir. int ise 1 bytedan büyüktür. Bu sebepten deger değişkenini ya stringe çeviririz ya da bytelarına ayırarak göndeririz.
      Meslea adc’den okuduğumuz değer 1024 olsun. Bu hex olarak 0x0400’a denk gelir. Burada gidecek verinin ilk byteına “a” , ikinci byteına “b” dersek şöyle bir fonksiyonla işi halledebiliriz.

      char a,b;
      deger=adc_read(0);
      a= deger & 0x00ff;
      b= deger>>8;
      uart1_write(a);
      uart1_write(b);

      alıcıda ise şöyle bişeyler yapabiliriz;

      char gelen[2],i=0;
      unsigned deger=0;
      if(uart_data_ready())
      {
      gelen[i]=uart_read();
      i++;
      if(i==2)
      {
      deger=gelen[1];//2. byteı deger değişkenine at
      deger<<=8;//deger değişkeni içeriğini 8 kez sola kaydır.
      geger+=gelen[0];//ilk byte'ı deger değişkeni ile topla.
      i=0;
      }
      }

      Diğer yol ise vericide inttostr kullanarak adc verisini stringe çevirip, karakter dizisinin elemanlarını teker teker göndermektir. Bunu da daha sonra açıklarım.
      Saygılar.

      • ensarazili dedi ki:

        Sagol hocam birazdan deneyecegim verdiginiz bilgileri ins olurda kurtulurum su dertten saygilar

  21. Ali dedi ki:

    hocam Rc6-Rc7 alıcı ve vericimi bağladım çalışmadı. ama tek olarak ikisi de çalışıyor.
    alıcı ve vericiyi tek devre üzerinde kullanamazmıyız.

    • mikrodunya dedi ki:

      İslemciye veri gönderdiği anda veri alma işlemi yaptırmaya çalışmışsınız. Bu durumda problem ortaya çıkar.

      • Ali dedi ki:

        hocam veri alma while döngüsünün içerisinde devamlı olarak döndürüyorum. veri gönderme de ayni while döngüsü içerisinde RB1 butonuna basılınca göndermesini istiyorum. ama bir terslik var ve calışmıyor. ikisinden birini iptal ettiğim zaman çalışıyor. böyle olduğu zaman ikisi de aynı an çalışmış olmuyor değilmi. RB1 basılınca veriyi gönderiyor 10 kez sonra veri alma işlemine geri dönuyor olması gerekmiyormu.

      • mikrodunya dedi ki:

        Fakat alıcı modül veriyi gönderdiğiniz anda almaya başlıyor.

  22. Ali dedi ki:

    hocam bu sorunu nasıl çözebilirim. bir türlü olmuyor.

    • mikrodunya dedi ki:

      Anladığım kadarı ile iki adet devreniz var. İkisi de hem alıcı hem verici olarak çalışıyor. Bunu çalıştırmak için veri gönderirken aynı devredeki alıcıyı pasif hale getirmeniz. Veri göndermediğiniz zamanlarda ise vericiyi pasif hale getirmenizdir. Bunu yapmak için ise bir transistör ve bir direnç yetecektir.

  23. ali dedi ki:

    evet hocam devrem aynen düşündüğünüz gibi. transistörun ve direncin değerleri ne olabilir?

    bağlantısı rc6 girişine direnc ve direncten transistörün base gidiyoruz emiter ucunu gnd ve alıcının gnd,collector ucunu vcc ve alıcının vcc bağlıyoruz.

  24. ali dedi ki:

      ———————— Alıcı vcc
    |
    —————220ohm————-vcc
    |
    |—–collector–
    tx-rx—–5k—–|
    |—–emiter—- |
    ————————– pic ve alıcı gnd baglanır

    hocam böyle bir devremi

  25. ali dedi ki:

      ———————— Alıcı vcc
    |
    —————220ohm————-vcc
    |
    |—–collector–
    tx-rx—–5k—–|
    |—–emiter—- |
    ————————– pic ve alıcı gnd baglanır

    hocam böyle bir devremi 220ohm direnc de koydum böyle devre tamammı?

  26. ali dedi ki:

    çizdim ama yayılanırken bozuk gösteriyor.

  27. ali dedi ki:

    bu akşam deneyim hocam.

  28. Musa dedi ki:

    Hocam devrenizi yeni gördüm 2 haftadır uğraştığım haberleşme işini preamble olmadığı için yapamıyormuşum. Akşam denedim veri gönderildi. Sağlıklı olmasa da gönderiyordu. Fakat gelen rakamlara göre işlem yapacağım için if şartları koymam gerekti. Aynı sizin kodlar gibi 3 lü senkron verisine göre işlem yapmaya çalışıyorum fakat alıcıda tık yok. Ne alıyor ne bişey yapıyor. Program böyle çalışırken yanına gidiyorum alıcının bakıyorum falan sonra pat ekranda veri alındı bilgisi sonra eski halıne geri dönme falan. Acaba alıcı uyanmıyor mu?. Alıcının uyanması için preamble gönderiyorum fakat akşam denememde de alıcıya ilk 1 dakika yada belki 30 saniye hiç veri gönderemiyordum sonra veri alabiliyordu acaba belirli bir uyanma süresi mi var hocam

  29. ismailalgin dedi ki:

    hocam merhaba öncelikle yazılarınızı okuyorum. ben bi sorunla karşılaştım ve nereye baksam çözemedim
    çin malı galiba alıcı verici var elimde rf.

    uart ile veri göndermek istiyorum bunuda c#da arayüzle yaptım.usb den 4550 ye sonra rf ile 628a ya devre mantığı bu. devreleri gerçektede kurdum fakat bişey farkettim yabancı bi arkadaşta aynı sorunla karşılaşmış.
    önce deneme amaçlı uart ile kablo üzerinden veri gönderiyordum 2. pic e fakat çalışmıyordu daha sonra o yazıyı gördüm toprakları kısa devre yaptım çalıştı
    şimdi rf mödülünü taktım çalışmıyor nasıl çözeceğim bilmiyorum iki hafta oldu elektronikten soğudum. eğer uart da gerilimler farklıysa nasıl çözeceğim bilmiyorum herkes tak diye gönderirken niye ben gönderemiyorum anlamadım. verici tarafına rs232 mi bağlasam onu bile düşünüyorum. nerde hatam olmuş olabilir bakarmısınız usb için proteusta virtual usb ile sana usb oluşturarak devreyi deneyebilirsiniz gönderdiğim c# programında ise debug klasöründeki exe yi çalıştırın hocam. belki biliyorsunuz kusura bakmayın elim ayağım titriyor. isistede problem yok ordada çalışıyor devre ne olabilir sıkıntı yardım edermisiniz. ???

  30. ismailalgin dedi ki:

    mail attım iletilmemiş mikrodunya@gmail.com 2 kere mail attım hocam benim mail adresim ismailalgin1901@gmail.com

    • mikrodunya dedi ki:

      Herhangi bir mail bana ulaşmamış.

      • ismailalgin dedi ki:

        hotmailden atıyorum acaba konuyu burdada açsak hem herkes faydalansın mikroc kodlar çok sadece ben size şimdi hotmailden gönderiyorum şimdide gmail hata veriyor mail iletilmedi diye

      • mikrodunya dedi ki:

        Kodlarinizi burada paylaşın o halde.

      • ismailalgin dedi ki:

        ALICI TARAF 628a ile
        char uart_rd;
        void main()
        {
        trisb.rb1=1; trisb.rb2=0;
        txsta.SYNC =0; rcsta.SPEN=1; rcsta.cren=1;
        cmcon=7;
        trisa.ra0=0; trisa.ra1=0; porta.ra0=0; porta.ra1=0;
        delay_ms(3000);
        uart1_init(4800);
        delay_ms(1000);
        while(1)
        {
        if(rcsta.FERR==1 || rcsta.oerr==1){rcsta.cren=0; rcsta.cren=1;}
        if(uart1_data_ready()){ uart_rd=uart1_read(); }
        else{uart_rd=0xFF;}
        if(uart_rd==0){porta.f0=0; porta.f1=0; }
        if(uart_rd==1){porta.f0=1; porta.f1=0;}
        if(uart_rd==2){porta.f0=0; porta.f1=1;}
        if(uart_rd==3){porta.f0=1; porta.f1=1;}
        }
        }

        VERICI TARAF 18F4550

        #include “USBdsc.c” //usb dosyasını ekledim vendorıd1234 productıd1234 yani 4660
        //lcd bağlantıları
        sbit LCD_RS at RB2_bit;
        sbit LCD_EN at RB3_bit;
        sbit LCD_D4 at RB4_bit;
        sbit LCD_D5 at RB5_bit;
        sbit LCD_D6 at RB6_bit;
        sbit LCD_D7 at RB7_bit;

        sbit LCD_RS_Direction at TRISB2_bit;
        sbit LCD_EN_Direction at TRISB3_bit;
        sbit LCD_D4_Direction at TRISB4_bit;
        sbit LCD_D5_Direction at TRISB5_bit;
        sbit LCD_D6_Direction at TRISB6_bit;
        sbit LCD_D7_Direction at TRISB7_bit;

        unsigned char readbuff[64] absolute 0x500;
        unsigned char writebuff[64] absolute 0x540;
        char text_kod;
        char text_uzunlugu;
        unsigned short i;
        void interrupt(){ USB_Interrupt_Proc(); }
        void main() {
        //spbrgh=625; spbrg=25;
        txsta.SYNC=0; rcsta.SPEN=1; txsta.tx9=0;
        ADCON1 |=0x0F;
        CMCON|=7;
        TRISC.RC7=1; TRISC.RC6=0;
        trisb.rb0=0; trisb.rb1=0; portb=0;
        UART1_Init(4800); delay_ms(1000);
        lcd_init();
        lcd_cmd(_lcd_cursor_off);
        lcd_cmd(_lcd_clear);
        lcd_out(1,1,”USB gelen:”);
        lcd_out(2,1,””);
        HID_Enable(&readbuff,&writebuff);
        while(1)
        { //Uart1_write(1); delay_ms(500); Uart1_write(2); delay_ms(500);
        while(!HID_read());

        text_kod=readbuff[0];
        text_uzunlugu=readbuff[1];
        //readbuff[0]=0xEF; readbuff[1]=3;
        if(readbuff[0]==0xAB)
        {
        for(i=2;i<text_uzunlugu+2;i++)
        {
        lcd_chr_cp(readbuff[i]);
        }
        }
        else if(readbuff[0]==0xCD)
        {
        lcd_cmd(_lcd_clear);
        lcd_out(1,1,"USB gelen: ");
        lcd_out(2,1,"");
        }
        else if(readbuff[0]==0xEF)
        {
        if(readbuff[1]==0)
        {
        lcd_out(1,1,"–RF iletisimi–");
        lcd_out(2,1,"Gonderiliyor");
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0);

        }
        if(readbuff[1]==1)
        {
        lcd_out(1,1,"–RF iletisimi–");
        lcd_out(2,1,"Gonderiliyor");
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(1);
        }
        if(readbuff[1]==2)
        {
        lcd_out(1,1,"–RF iletisimi–");
        lcd_out(2,1,"Gonderiliyor");
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(2);
        }
        if(readbuff[1]==3)
        {
        lcd_out(1,1,"–RF iletisimi–");
        lcd_out(2,1,"Gonderiliyor");
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(0xa4); Uart1_write(0xa4); Uart1_write(0xa4);
        Uart1_write(3);
        }

        }
        else {portb=readbuff[0];}

        }
        }

        sıkınıtım toprak bağlantısı yapıp resetleyince alıcı tarafı çalışıyor ancak diğer türlü çalışıyor toprakları kısa devre yaptım rf alıcı vericiyi ekledim yine çalışmadı sorun nedir

      • mikrodunya dedi ki:

        Gördüğüm kadarı ile uyandırma ve senkron bilgisi göndermiyorsunuz. RF alıcı verici çiftlerinin çalışabilmesi için bunların gönderilmesi şart. Yayını dikkatli okuyunuz.

  31. ismailalgin dedi ki:

    Çok çok teşekkür ederim ben meğer uyandırmamışım özellikle sonda 0 göndermek gerekiyormuş bende uyandırma sinyalini rastgele gönderiyoruz sanıyordum. hocam kusura bakmayın geç yazdım buraya olduktan sonra epey bi dinlendim şimdide usb den sıcaklık okuma kısmını hallediyorum kitaplarda ds1820 gibi sensörler kullanılmış ama ben lm35 i tercih ettim elimde o olmasından dolayı isteyen olursa mail atabilirler c# da lm35 ile sıcaklık ve pwm uygulaması büyük ihtimalle yarına bitecek rf ide katabilirim şuan için gerek görmedim kod konusunda bütün arkadaşlara yardım edebilirim bildiğim kadarıyla tabi
    ismail_algn@hotmail.com mail atmaları buraya yazmaları yeter bakıyorum zamanım oldukça linkte ise yaptığım uygulamanın kısa bi denenmesi var

  32. muratpolat dedi ki:

    Çok güzel çalışma olmuş, yerli ürünlerimizi tanıtmanızdan ötürü de ayrıca teşekkür etmek isterim. Bir şey sormak istiyorum mümkünse;

    for(a=1100;a=<1900;a++)
    {
    led1=1;
    delay_us(a);
    led1=0;
    delay_ms(20);
    }

    bu komutun neresi mantıksız acaba? RF kullanarak quadrokopter yapmaya çalışıyorum. joysticki ileri komutu aldığında artırmam gerekiyor. MicroC derleyicisi hata veriyor. delay_us() içinde değişken tanımlayıp değişken artığı zaman motor hızıda değişecek fakat derleme hatası veriyor. Bir yere odaklanıp bir noktayı kaçırıyor muyum?

    birde derleyici neden şu şekilde for(int a=1000;a<2000;a++){…..}derlemeye imkan sağlamıyor?

    Çok teşekkür ederim, çok cahilce bir soru sorduysam kusura bakmayın lütfen hatırladıklarımla bir şeyler çıkarmaya çalışıyorum.

    • mikrodunya dedi ki:


      int a;

      void gecik(unsigned int deger)
      {
      unsigned int b;
      for(b=0;b<deger;b++)
      {
      delay_us(1);
      }
      }

      void main()
      {
      for(a=1100;a<=1900;a++)
      {
      led1=1;
      gecik(a);
      led1=0;
      delay_ms(20);
      }
      }

      Yukarıdaki kod ile istediğiniz gecikme değerini “gecik(x)” şeklinde yazarak 65536 us’ye ye kadar gecikme sağlayabilirsiniz.

  33. Fuat Akdemir dedi ki:

    Merhaba. CCS C derleyicisiyle yazdığım kodlarla rf ile sıcaklık değerlerinden oluşan bir dizi göndermek istiyorum. TX-RX arasına tel bağlayınca veri düzgün iletiliyor, ama RF modülleri taktığımda saçma sapan 4 haneli sayılar çıkıyor. Paylaştığınız kodları inceledim, yalnız uart ı bilmediğimden pek anlayamadım.
    Çalışma şeklini şöyle özetliyeyim: D0 ve D1 de 2 adet led var ve sıcaklık değeri 28 derecenin üstündeyken biri, altındayken diğeri yanıyor.
    Aşağıda verici ve alıcı kodlarını paylaştım. Yardımcı olabilir misiniz?

    verici kodlar:

    #include
    #FUSES NOWDT, XT, PUT, BROWNOUT, NOLVP, NOCPD, NOWRT
    #use delay(clock=4000000)
    #use rs232(baud=600, xmit=PIN_C6, rcv=PIN_C7)
    #use fast_io(b)
    #define use_portb_lcd TRUE
    #include //lcd ait fonksiyonlar programa eklenir
    #include “ds18b20.c” //ds18b20 ait fonksiyonlar programa eklenir

    float sicaklik;
    int16 data[3];
    int i;

    void sicaklik_gonder()
    {
    int16 a;
    a = sicaklik*10;
    delay_ms(20);
    data[0] = (a/100)%10;
    delay_ms(100);
    //printf(lcd_putc,”\na = %d”,data[0]);
    data[1] = (a/10)%10;
    delay_ms(100);
    //printf(lcd_putc,”\tb = %d”,data[1]);
    data[2] = a%10;
    delay_ms(100);
    //printf(lcd_putc,”c = %d”,data[2]);

    for(i=0;i<3;i++) putc(data[i]);
    delay_ms(200);
    }

    void main()
    {
    lcd_init();
    lcd_putc("\f");
    printf(lcd_putc,"\fSICAKLIK = ");
    while (TRUE)
    {
    sicaklik = ds1820_oku();
    lcd_gotoxy(1,2);
    printf(lcd_putc,"%3.1f %cC", sicaklik,223);
    sicaklik_gonder();
    }
    }

    alıcı kodlar:

    #include
    #fuses XT,NOWDT
    #use delay(clock=4000000)

    #define use_portb_lcd TRUE
    #include
    #use rs232(baud=600,xmit=PIN_C6,rcv=PIN_C7)

    int8 i;
    int16 data[3];
    int16 a, b, c;
    float d, sicaklik;

    void sicaklik_oku()
    {
    for(i=0;i<3;i++) data[i] = getch();
    a = 100*data[0];
    b = 10*data[1];
    c = data[2];
    d = a + b + c;
    sicaklik = d/10;

    printf(lcd_putc,"\n%3.1f %cC",sicaklik,223);
    //printf(lcd_putc,"\na=%ld",data[0]);
    //printf(lcd_putc,"b=%ld",data[1]);
    //printf(lcd_putc,"c=%ld",data[2]);
    }

    void main()
    {
    lcd_init();
    printf(lcd_putc,"\fSICAKLIK = ");

    while(TRUE)
    {
    sicaklik_oku();
    if(sicaklik<28) {
    output_high(PIN_D0);
    output_low(PIN_D1);
    }
    else {
    output_high(PIN_D1);
    output_low(PIN_D0);
    }
    delay_ms(200);
    }
    }

  34. Alp Eren dedi ki:

    Merhaba,

    Bilgilendirme platformunuz için teşekkürler.
    Benim sorun yaşadığım bir konu var. Rf iletişimi ben MikroC’nin Manchester kütüphanesini kullanarak yapıyorum. Manchester kütüphanesi ile konu bulamadığım için buraya yazıyorum. Aynı modülleri kullanacağım. Kendi kütüphanesindeki örnek birebir yapıldığında çalışıyor. Ama aşağıdaki kod çalışmıyor. Burada bulunan Man_Receive_Init() komutunu kaldırınca aynı kodlar çalışıyor. Sorun ne olabilir. yardımınızı rica ediyorum. Saygılarımla.

    Kodlar:
    //RF iletişim alıcı bacak bağlantıları ve yönlendirme ayarları
    sbit MANRXPIN at RA2_bit; //A2 bacağı RX bacağı olarak belirlendi.
    sbit MANRXPIN_Direction at TRISA2_bit; //A2 bacağı yönlendirildi.
    //RF iletişim alıcı bacak bağlantıları yönlendirme son
    short ss_sayici=0;
    void main() {
    ADCON1|=0x0F;
    CMCON|=7;
    TRISA2_bit=1;
    RA2_bit=0;
    TRISE=0b001;
    PORTE=0;

    Man_Receive_Init(); //RF alıcı modülü hazırlandı.
    delay_ms(100);
    while(1)
    {
    if(RE0_bit)
    {
    ss_sayici++;
    while(RE0_bit);
    }
    if(ss_sayici==1)
    {
    INT0IE_bit=1;
    RE1_bit=1;
    }
    else if(ss_sayici==2)
    {
    ss_sayici=0;
    RE1_bit=0;
    }
    }
    }

  35. Alp Eren dedi ki:

    Kodlarımın tamamı bu. Man_Receive_Init() komutu ekliyken kodlar çalışmıyor. Bu komutu pasifleştirince çalışıyor.

    • mikrodunya dedi ki:

      Ben bu kodlarda rf iletişime dair bir satır göremiyorum. Paylaştığım yazıyı dikkatlice okumanızı tavsiye ediyorum.

      • Alp Eren dedi ki:

        Özür dilerim ifade edemedim herhalde. Bende bunu demek istemiştim. RF iletişim adına daha bişey yapmadığım halde, sadece Kütüphane kurulum komutunu kullanmış olmam kodu çalıştırmıyor. Kullanmayınca aynı komutlar çalışıyor. Kütüphanede mi sıkıntı var. Daha rahat görün diye RF iletişim kodları oluşturmadım çünkü bu noktada bir sıkıntı var, başlangıçta bir sıkıntı var. Anlatamadıysamda kalsın artık. Teşekkürler.

      • mikrodunya dedi ki:

        “The Manchester receive routines are blocking calls (Man_Receive_Init and Man_Synchro). This means that MCU will wait until the task has been performed (e.g. byte is received, synchronization achieved, etc).
        Manchester code library implements time-based activities, so interrupts need to be disabled when using it. ”

        Yukarıdaki açıklama kütüphanenin help dosyasının en başında verilmiş. Demek istediği şu: “Man_Receive_Init ve Man_Synchro” komutları vericiden senkron veya data gelmeden işletilmez ve kodu bloke eder. Yani siz “Man_Receive_Init();” yazdığınızda mcu’ya bağlı rf modülden herhangi bir veri gelmezse program o satırda bekler.

  36. Alp Eren dedi ki:

    Teşekkürler, çok, çok teşekkürler. Dikkatsizlik başa bela 🙂

  37. Gürcan dedi ki:

    Hocam UUUUU göndermemizin amacı nedir? U bildiğim kadarıyla Uninitialized yani değer girilmemiş demek. U göndermek preamble başlatma için her hangi bir olumlu etki yapıyor mu?

  38. bekes dedi ki:

    Soft_Uart ile ilgili ufak bir örnek yazarmısınız

  39. murat dedi ki:

    hocam merhaba güzel bir çalışma olmuş elinize sağlık.

    bu algoritma ile kanal sayısını nasıl çoğalta biliriz.
    yeniden char ile karakter dizisi oluşturup farlı isimlerle yapmaya çalıştım ama olmadı
    teşekürler

  40. bekes dedi ki:

    Soft uart ile ilgili bir ornek istedim 1 ay oldu yazmadiniz gerekte kalmadi kendim yazdim calistirdim.Yani artik ozgur olarak istedigim pinle bu isi yapabiliyorum.Yardim isteyen olursa mer_harun@mynet.com

    • mikrodunya dedi ki:

      Hocam daha önceki yazdığınız yorumu görmedim ama bu tür bilgileri MikroC’nin help kısmından edinebilirsiniz. derleyiciyi çalıştırdıktan sonra F1 tuşuna basmanız yeterli help için.
      Saygılar.

  41. mustafa dedi ki:

    kullanılan malzemeler 2xPic16F877a +ARX34-ATX34 RF modul
    derleyici mblab xc8
    bu baudrate ve uart hazırlama fonkisiyonlarını gösterebilirmisiniz

  42. bekesadam dedi ki:

    DS18B20 ile ölçtüğüm sıcaklık bilgisini RF ile başka bir devrede LCD’de görüntülemek istiyorum.Kodlar aşağıda ancak şöyle bir sorun var:
    RF iletişiminde kullandığım preamble ve senkron bilgisinin ne yaptıysam LCD ‘de görüntülenmesine mani olamadım,sıcaklık bilgiside gözüküyor kayan yazı gibi 🙂
    Bu sorunu nasıl aşabiliriz?
    verici kodları:
    sbit LCD_RS at RB0_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;
    sbit LCD_RS_Direction at TRISB0_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    const unsigned short TEMP_RESOLUTION = 9;
    char pre[15]={‘U’,’U’,’U’,’U’,’U’,255,255,255,255,255,0,0,0,0,0};
    int i=0,j=0,adet=1;
    char *txt = “000.0000”;
    unsigned temp,gecici_temp[40];
    void InitTimer1(){
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
    }
    void Interrupt(){
    if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    gecici_temp[adet]=temp;
    adet++;
    if(adet==40) adet=0;
    if(gecici_temp[adet]!=gecici_temp[adet-1]){
    for(i=0;i<15;i++)
    {
    UART1_Write(pre[i]);
    }
    for(j=0;j<10;j++) //garanti olması açısından 10 kez gönderiliyor veriler…
    {
    for(i=0;i> RES_SHIFT ;
    // Convert temp_whole to characters
    if (temp_whole/100)
    txt[0] = temp_whole/100 + 48;
    else
    txt[0] = ‘0’;
    txt[1] = (temp_whole/10)%10 + 48; // Extract tens digit
    txt[2] = temp_whole%10 + 48; // Extract ones digit
    // Extract temp_fraction and convert it to unsigned int
    temp_fraction = temp2write << (4-RES_SHIFT);
    temp_fraction &= 0x000F;
    temp_fraction *= 625;
    // Convert temp_fraction to characters
    txt[4] = temp_fraction/1000 + 48; // Extract thousands digit
    txt[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
    txt[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
    txt[7] = temp_fraction%10 + 48; // Extract ones digit
    // Print temperature on LCD
    Lcd_Out(2, 5, txt);
    }
    void main() {
    UART1_Init(2400);delay_ms(100);
    InitTimer1();
    CMCON=7;
    Lcd_Init(); // Initialize LCD
    Lcd_Cmd(_LCD_CLEAR); // Clear LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, " SICAKLIK: ");
    // Print degree character, 'C' for Centigrades
    Lcd_Chr(2,13,223); // Different LCD displays have different char code for degree
    // If you see greek alpha letter try typing 178 instead of 223
    Lcd_Chr(2,14,'C');
    //— Main loop
    do {
    //— Perform temperature reading
    Ow_Reset(&PORTA, 0); // Onewire reset signal
    Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
    Ow_Write(&PORTA, 0, 0x44); // Issue command CONVERT_T
    Delay_us(120);
    Ow_Reset(&PORTA, 0);
    Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
    Ow_Write(&PORTA, 0, 0xBE); // Issue command READ_SCRATCHPAD
    temp = Ow_Read(&PORTA, 0);
    temp = (Ow_Read(&PORTA, 0) << 8) + temp;
    //— Format and display result on Lcd
    Display_Temperature(temp/8);
    Delay_ms(10);
    } while (1);
    }
    Alıcı Kodları:
    sbit LCD_RS at RB0_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;
    sbit LCD_RS_Direction at TRISB0_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    char txt[8];
    char i=0;
    void interrupt()
    {
    if (RCIF_bit)
    {
    txt[i]=Uart1_Read();
    i++;
    if(i==8) i=0;
    }
    }
    void main() {
    cmcon=7;
    GIE_bit = 1; // Genel kesmeler aktif
    RCIE_bit = 1; //Seri port kesmesi aktif
    PEIE_bit = 1; // Enable Peripheral interrupt
    UART1_Init(2400);delay_ms(100);
    lcd_init(); DELAY_MS(50);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_Cmd(_LCD_CLEAR);delay_ms(100);
    do {
    lcd_cmd(_LCD_CLEAR); // lcd'yi temizle
    lcd_out(1,1,"ISI=");
    lcd_out(1,5,txt);
    delay_ms(500);
    lcd_chr_cp(223); //derece işareti
    lcd_chr_cp('C');
    delay_ms(10);
    } while (1);
    }

  43. bekesadam dedi ki:

    Özür dileerim verici kodlarını yanlış atmışım:(
    sbit LCD_RS at RB0_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;
    sbit LCD_RS_Direction at TRISB0_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    const unsigned short TEMP_RESOLUTION = 9;
    char pre[15]={‘U’,’U’,’U’,’U’,’U’,255,255,255,255,255,0,0,0,0,0};
    int i=0,j=0,adet=1;
    char *txt = “000.0000”;
    unsigned temp,gecici_temp[40];
    void InitTimer1(){
    T1CON = 0x31;
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    TMR1IE_bit = 1;
    INTCON = 0xC0;
    }
    void Interrupt(){
    if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H = 0x0B;
    TMR1L = 0xDC;
    gecici_temp[adet]=temp;
    adet++;
    if(adet==40) adet=0;
    if(gecici_temp[adet]!=gecici_temp[adet-1]){
    for(i=0;i<15;i++)
    {
    UART1_Write(pre[i]);
    }
    for(j=0;j<10;j++) //garanti olması açısından 10 kez gönderiliyor veriler…
    {
    for(i=0;i> RES_SHIFT ;
    // Convert temp_whole to characters
    if (temp_whole/100)
    txt[0] = temp_whole/100 + 48;
    else
    txt[0] = ‘0’;
    txt[1] = (temp_whole/10)%10 + 48; // Extract tens digit
    txt[2] = temp_whole%10 + 48; // Extract ones digit
    // Extract temp_fraction and convert it to unsigned int
    temp_fraction = temp2write << (4-RES_SHIFT);
    temp_fraction &= 0x000F;
    temp_fraction *= 625;
    // Convert temp_fraction to characters
    txt[4] = temp_fraction/1000 + 48; // Extract thousands digit
    txt[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
    txt[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
    txt[7] = temp_fraction%10 + 48; // Extract ones digit
    // Print temperature on LCD
    Lcd_Out(2, 5, txt);
    }
    void main() {
    UART1_Init(2400);delay_ms(100);
    InitTimer1();
    CMCON=7;
    Lcd_Init(); // Initialize LCD
    Lcd_Cmd(_LCD_CLEAR); // Clear LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    Lcd_Out(1, 1, " SICAKLIK: ");
    // Print degree character, 'C' for Centigrades
    Lcd_Chr(2,13,223); // Different LCD displays have different char code for degree
    // If you see greek alpha letter try typing 178 instead of 223
    Lcd_Chr(2,14,'C');
    //— Main loop
    do {
    //— Perform temperature reading
    Ow_Reset(&PORTA, 0); // Onewire reset signal
    Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
    Ow_Write(&PORTA, 0, 0x44); // Issue command CONVERT_T
    Delay_us(120);
    Ow_Reset(&PORTA, 0);
    Ow_Write(&PORTA, 0, 0xCC); // Issue command SKIP_ROM
    Ow_Write(&PORTA, 0, 0xBE); // Issue command READ_SCRATCHPAD
    temp = Ow_Read(&PORTA, 0);
    temp = (Ow_Read(&PORTA, 0) << 8) + temp;
    //— Format and display result on Lcd
    Display_Temperature(temp/8);
    Delay_ms(10);
    } while (1);
    }

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s