This post is also available in: English

forum-banner


Konu ve mesaj oluşturabilmek için giriş yapmanız gerekmektedir.

PIC16F877A İLE UART HABERLEŞMESİ

Sayfalar:123

bende de HITACHI V-212 Model 20 mhz 2 kanal osilaskop var bu 0 dı 300 tl almıştım cok uyguna yoksa 100mhz olanlar var DSD idi galiba markaları gözü onlara dikmiştim.

şimdi dolarda arttı birşeyde alınmaz analog ile devam :D

hocam birde şu mantıksal ve işlemi varya && bunu zaten biliyorum.

Libstocktan projeleri indirip inceliyorum nasıl yazıyorlar diyedde coğu yerde
& şu işarete denk geliyorum 2 adet kullanmamışlar sadece tek adet kullanmışlar bunun mantığı nedir mesela &PORTB yazmış yani PORTB ve ? ne yani orayı anlamadım.

Bazende şu registirlara değer yüklenirkende görüyorum CMCON |=0X07; demiş mesela oradaki ne veya mantığının sembolünün tek olması ne ifade ediyor ?

değilini alıyor diyeceğim fakat TOOGLE (değili) '~' zaten bu operatör ile alınıyor. bu konuya acıklık getirirsek sevinirim hocam.

Merhaba

  • İlk olarak && çift olanlar if gibi koşullarda kullanılırlar . Örneğim İf(a==5 || a==3) gibi ancak & şeklinde tek olanlar bit düzeyinde işlem operatörleridir.
  • & (ve) operatörünü ele alacak olursak
    • 0 & 0 =0
    • 0 & 1 =0
    • 1 & 1  = 1 Şeklindedir.
  •  | (veya) operatörünü ele alırsak
    • 0|0=0
    • 0|1=1
    • 1|1=1 şeklindedir
  • Daha bir çok bit düzeyi işlem operatörü vardır. Bunlar veri yazdırma gönderme için işlemlerde sıkça kullanılır bende bunları tercih ederim.
  • Örnek olarak bir veriyi seri olarak göndereceksin veri 01001 şeklinde
    • Veriyi göndermek için hangi bit 0 hangi bit 1 bilmelisin buna göre
    • if( (veri & 0001)==0001) ise o halde 1. bit 1 dir diyerek porttan 1 yolluyorsun değilse sıfır yolluyorsun özellikle & (ve) yi bunun için çokça kullaınırım. Yani ;
      • veri = 01001 di bizim karşılatırdığımız değer ise 0001 o halde ve operatörüne göre ilk üç bit mutlaka sıfırdır son değer 1 ise 1 dir değil ise sıfırıdır. Çünkü ve nin koşulu sadece 1&1=1 di bu şekilde bitin 1 yada 0 olduğunu anlayabiliyoruz
    • Diğer yandan bit kaydıma operatörleri olan <<  >> işaretleri vardır. Yukarıda verinin 1 biti yolladık o halde sıradaki veriyi test edeceğiz
      • verimi 01001 di "veri=veri>>1" dediğimizde veriyi 1 bit sağa kaydır demektir. Verim 00100 oldu .
  • Bu kısa özetten sonra ( eğer tüm operatörleri merak ediyorsan ayrıntılı anlatabilirim.) sorularına gelelim
    • &PORTB bunun anlamı veriyi portb ile ve le yani gelen veri 0011 ise portb her durumda 0011 olacaktır çünkü portb 1111 de olsa ve operatörü gereği sadece 1 & 1 = 1 dir diğer tüm olasılıklar sıfırdır.
    • CMCON |=0X07  burada kompartörleri kapatmış  |= demek ise şunun gibi CMCON registerinin default değerlerini koruyarak benim belirlediğim 0x07 yi birleştir ve yeniden CMCON registerine ata . Yani " |" nin kurali 1|0=1 dir sadece 0|0=0 dır. O halde mevcut değeri koruyup kendi verimizi mevcut veri ile birleştirirken bunu kullanırız.
    • |= işaretine gelince   veri=veri|10 yerine   veri|=10 aynı şeydir sadece yazım şekli daha basit olduğundan kullanılır. Bu tüm bit düzeyindeki operatörlerde kullanılabilir.
  • Daha anlamadığın aklına takılan soruları sorabilirsin bit düzeyinde işlem önemli bir konudur ve bir çok noktada kullanılması gerekir.

İyi Çalışmalar

 

Şu kişiden alıntılanmıştır: ERCAN KOÇLAR tarhinde 12 Nisan 2018, 19:36

Merhaba

  • İlk olarak && çift olanlar if gibi koşullarda kullanılırlar . Örneğim İf(a==5 || a==3) gibi ancak & şeklinde tek olanlar bit düzeyinde işlem operatörleridir.
  • & (ve) operatörünü ele alacak olursak
    • 0 & 0 =0
    • 0 & 1 =0
    • 1 & 1  = 1 Şeklindedir.
  •  | (veya) operatörünü ele alırsak
    • 0|0=0
    • 0|1=1
    • 1|1=1 şeklindedir
  • Daha bir çok bit düzeyi işlem operatörü vardır. Bunlar veri yazdırma gönderme için işlemlerde sıkça kullanılır bende bunları tercih ederim.
  • Örnek olarak bir veriyi seri olarak göndereceksin veri 01001 şeklinde
    • Veriyi göndermek için hangi bit 0 hangi bit 1 bilmelisin buna göre
    • if( (veri & 0001)==0001) ise o halde 1. bit 1 dir diyerek porttan 1 yolluyorsun değilse sıfır yolluyorsun özellikle & (ve) yi bunun için çokça kullaınırım. Yani ;
      • veri = 01001 di bizim karşılatırdığımız değer ise 0001 o halde ve operatörüne göre ilk üç bit mutlaka sıfırdır son değer 1 ise 1 dir değil ise sıfırıdır. Çünkü ve nin koşulu sadece 1&1=1 di bu şekilde bitin 1 yada 0 olduğunu anlayabiliyoruz
    • Diğer yandan bit kaydıma operatörleri olan <<  >> işaretleri vardır. Yukarıda verinin 1 biti yolladık o halde sıradaki veriyi test edeceğiz
      • verimi 01001 di "veri=veri>>1" dediğimizde veriyi 1 bit sağa kaydır demektir. Verim 00100 oldu .
  • Bu kısa özetten sonra ( eğer tüm operatörleri merak ediyorsan ayrıntılı anlatabilirim.) sorularına gelelim
    • &PORTB bunun anlamı veriyi portb ile ve le yani gelen veri 0011 ise portb her durumda 0011 olacaktır çünkü portb 1111 de olsa ve operatörü gereği sadece 1 & 1 = 1 dir diğer tüm olasılıklar sıfırdır.
    • CMCON |=0X07  burada kompartörleri kapatmış  |= demek ise şunun gibi CMCON registerinin default değerlerini koruyarak benim belirlediğim 0x07 yi birleştir ve yeniden CMCON registerine ata . Yani " |" nin kurali 1|0=1 dir sadece 0|0=0 dır. O halde mevcut değeri koruyup kendi verimizi mevcut veri ile birleştirirken bunu kullanırız.
    • |= işaretine gelince   veri=veri|10 yerine   veri|=10 aynı şeydir sadece yazım şekli daha basit olduğundan kullanılır. Bu tüm bit düzeyindeki operatörlerde kullanılabilir.
  • Daha anlamadığın aklına takılan soruları sorabilirsin bit düzeyinde işlem önemli bir konudur ve bir çok noktada kullanılması gerekir.

İyi Çalışmalar

 

Hocam Çok Teşekkür ederim şuan ne yapıldığını güzelcene anladım.
Fakat bunu mesela nasıl bir yerde kullanabiliriz ki ? mesela nasıl bir algoritmada lazım olabilir ?.

 

Gercekten Kütüphanelerde bile görüyorum bit düzeyinde operatör işlemini şimdi diyelim PORTB cıkışımızın anlık değeri "1101 1000"  biz &PORTB=0x07;
 yaparsak bu sefer şöyle oluyor galiba.

PORTB = 0b1101 1000   // PORTB 'DE YÜKLÜ OLAN DEĞER.
PORTB=0x07   // buda yeni yükleceğimzi değer binary acılımı "0000 0111"

öyleyse biz &PORTB=0x07; // yüklü olan değer ve bu değeri eşitlersek sonuc bu oluyor galiba.    // KOMUT YANLIŞ YAZILMIŞTIR.

PORTB&=0x07; // DOĞRU OLAN.

-1101 1000     // önceden yüklü olan değer.
-0000 0111      // yeni yükleceğimiz değer.

-0000 0000   // PORTB&=0x07;  Dediğimizde PORTB de oluşacak yeni değer.

 

Doğru anlamış mıyım HOCAM ? en kısa zamanda'da bunlar üstünde denemeler yapacağım.

Birde UART1_Write_CText("text");  // diye komut gördüm C nin oradaki anlamını anlamadım .  UART kütüphanesi ile bugünlerde cok haşır neşir oldunm fakat böyle bir komuta rastlamadım.

Merhabalar

  • İlk olarak bir düzeltme yapayım
    • &PORTB konusunu yanlış değerlendirmişim bu kullanımın bit düzeyinde işlem ile ilgisi yok bu işaretçiler(pointer) konusu ile ilgili yani bunu PORTB nin adresini almak için kullanıyor. Öncelikle bunu düzeltmiş olayım
  • Senin yapmak istediğin işlemin doğrusu "PORTB&=0x07" şeklindedir. Bit düzeyinde işlem bu şekilde yapılıyor.
  • Mantığını doğru kavramışsın sadece yazım şekli "PORTB&=0x07"  gibi daha önce ki gibi değil.( benim yanlış değerlendirmem sonucu)
  • Nerede kullanılacağına gelince
 // veri gönderme bölümü
  for(i=0;i<8;i++)
    {
      if((veri&0b10000000)==0b10000000)//gönderilecek bit 1 ise
        {
           //mutlaka en başta clock sıfıra çekilmelidir
           I2C_SCL=0;//clock sıfıra çekildi
           I2C_ILETISIM_HIZI;
           I2C_SDA=1;//veri yüklendi
           I2C_ILETISIM_HIZI;
           I2C_SCL=1;//clock bir'e çekilerek veri gönderildi
           I2C_ILETISIM_HIZI;
           I2C_SCL=0;//clock sıfıra çekildi
           I2C_ILETISIM_HIZI;
        }
      else// gönderilecel bit 0 ise
        {
           //mutlaka en başta clock sıfıra çekilmelidir
           I2C_SCL=0;//clock sıfıra çekildi
           I2C_ILETISIM_HIZI;
           I2C_SDA=0;//veri yüklendi
           I2C_ILETISIM_HIZI;
           I2C_SCL=1;//clock bir'e çekilerek veri gönderildi
           I2C_ILETISIM_HIZI;
           I2C_SCL=0;//clock sıfıra çekildi
           I2C_ILETISIM_HIZI;
        }

      veri=(veri<<1);//gönderilecek veri bir bit sola kaydırıldı
    }
  • Yukarıdaki kod kendi yazdığım I2C Kütüphanesine ait. Veri gönderme sistemi
  • "if((veri&0b10000000)==0b10000000)//gönderilecek bit 1 ise" bölümünde "ve(&)" bit düzeyinde operatörünü kullanmışım bu şekilde veri biti 1 mi yoksa 0 mı bunu anlıyorum
  • "veri=(veri<<1);//gönderilecek veri bir bit sola kaydırıldı" bu bölümde de veriyi gönderdikten sonra 1 bit sola kaydırıp sıradaki bitin 1 yada 0 olup olmadığının denetlenmesini sağlamışım
  • Daha çok örnek için Özgür Yazlımlar bölümünden kendi yazdığım özgün kütüphaneleri indirip içeriklerini okuyabilirsin hepsi açık kaynak ve açıklamaları var anlamadığın yeri sorabilirsin.
  • "UART1_Write_CText("text");" fonksiyonu ile ilgili olarak sanırım bu standart MikroC kütüphanesinde yok belki bunu yazan kendine ait bir fonksiyon olarak yazmış ve kullanmıştır.

İyi Çalışmalar

 

Sayfalar:123