nedir bu (bit)

Başlatan nonstradam, 12 Nisan 2007, 17:15:53

nonstradam

merhabalar
Hi-Tech C ile yapılmış örnekleri gezerken bir PWM uygulaması gördüm
kod içerisinde daha önce görmediğim bi parça vardı merak ettim hi-tech C nin manueline baktım ama göremedim.

   DC1B0=(bit)DUTYCYCLE;
   DC1B1=(bit)(DUTYCYCLE>>1);
   CCPR1L=(DUTYCYCLE>>2);

DUTYCYCLE denen değişken unsigned int tipinde
DC1B0 ve DC1B1 ise pic in PWM ile ilgili iki biti
bu (bit) denen fonksiyonmudur neyse artık int değişkeni bit e mi atıyor
atarken int değikenin ilk bitinemi bakıyor son bitinemi bakıyor

kısacası bu (bit) ne iş yapar?

çalışmalarınızda başarılar...

mp3dragon

kod içerisinde "typedef" ile tür ataması yapılmış olmalı.

struct ve typedef geçen satırlara bir bak.

(bit)DUTYCYCLE; satırında tür dönüşümü yapılıyor. Yani int türü daha önce tanımlanmış bit türü ne dönüştürüyor. sağa kaydırma olduğu için DUTYCYCLE değişkeninin en düşük anlamlı bitini DC1B0 bitine atıyor. DC1B0 ve DC1B1 hangi registerin ilgili biti olduğunu bilmiyorum.
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

nonstradam

struct ve typedef gibi bir tip tanımlaması yapılmamış programda zaten çok kısa bir program. sanırım pic18.h dosyasının içinde tanımlı bu (bit) ama ne işe yaradığını bulamadım hala.

DC1B0 ve DC1B1 CCP1CON un bitleri pwm le alakalı ama bundanda pek bişey anlamadım.

mp3dragon

typedef.h gibi bir header dosyası include edilmiş mi? ANSI-C de bit olarak bir tür yok.
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.

ustad

hi-tech içerisinde include dosyalarına bakarsanız. PWM ile ilgili kontrol registerlerinda verilmiş isimlerdir , DC1B0, DC1B1 ve CCPR1L.

/*   CCP1CON bits   */
static volatile bit   CCP1X   @ (unsigned)&CCP1CON*8+5;
static volatile bit   CCP1Y   @ (unsigned)&CCP1CON*8+4;
static volatile bit   CCP1M3   @ (unsigned)&CCP1CON*8+3;
static volatile bit   CCP1M2   @ (unsigned)&CCP1CON*8+2;
static volatile bit   CCP1M1   @ (unsigned)&CCP1CON*8+1;
static volatile bit   CCP1M0   @ (unsigned)&CCP1CON*8+0;

16F877 için hi-techin PWM yazmaçlarından birisi, hi-tech in içerisinde yukarıda gibi tanımlanmıştır. Sizin gösterdiğiniz program muhtemelen  18 serisi picler için tanımlardandır.

DC1B0=(bit)DUTYCYCLE; Duytcyclein son biti DC1B0 a yazdırılmaktadır.

DC1B1=(bit)(DUTYCYCLE>>1); Dutycycle in 1. biti. DC1B0 a yazdırılmıştı.r

CCPR1L=(DUTYCYCLE>>2); Bu kısımda ise 16 bitlik değer sola doğru 2 bit kaydılılıp CCPR1L ye yazdırılıyor...

nonstradam

Alıntı Yaptypedef.h gibi bir header dosyası include edilmiş mi? ANSI-C de bit olarak bir tür yok.


malesef mp3dragon pic18.h haricinde hiç bir tanımlama yok.

ustad sanırım senin dediğin gibi çalışıyor bu meret ama manuelinde bile yazmayan bişey bu (bit). bilmediğimiz daha neler var ki.

kurumahmut

hitech kurulum klasöründe user guide var. Data tipleri bölümünde bit tipi anlatılmakta. boolean demektir. Yani bir bitlik data tanımlamak için kullanılır. Boolean anci-C ce desteklenen bir tipdir. Hi-tech firması bide bit demiş birde.

bit yerine boolean koy ve tekrar kodu incele.

C Compilerlar genelde litte endian (LSB en sağda) çalışır. Çoğu mikrodenetleyici ya da işlemci üreticisi de LSB yi en sona alır. ARM işlemcilerde ve FPGA de LSB en solda da olabilmektedir. Keil C Compiler big endian (LSB en solda) derleyebilmektedir.

Hi-Tech PICC18 kullandığına göre işlemcin PIC18 serisi. Benim bildiğim microchip lsb sağda çalışır. C Compiler da öyle derlese gerek.

DC1B0=(bit)DUTYCYCLE;
DC1B1=(bit)(DUTYCYCLE>>1);
CCPR1L=(DUTYCYCLE>>2);

DUTYCYCLE kaç bit bir sayı bunu bilmiyorum ama bildiğim bir şey var ki o da DC1B0 değeri bit tipinde tanımlanmış olması gerekmektedir. ve DUTYCYCLE değerinin lsb biti yani en sağdaki bitinin değeri DC1B0 a kopyalanmaktadır.


iyi çalışmalar...

arslan74

18F452'in Datasheetinden alıntı:
Alıntı Yap
CCP1CON REGISTER

bit 7 bit 0

bit 7-6 Unimplemented: Read as '0'

bit 5-4 DCxB1:DCxB0: PWM Duty Cycle bit1 and bit0
PWM mode:
These bits are the two LSbs (bit1 and bit0) of the 10-bit PWM duty cycle. The upper eight bits
(DCx9:DCx2) of the duty cycle are found in CCPRxL.


Burada 10 bit PWM mode kullanılıyor. bit0-> DC1B0, bit1->DC1B1 registerinde tutuluyor. CCPR1L registeri (bit9-2) 8 bit bilgiyi tutuyor. "1" rakamı ise PWM1'in kullanıldığı anlamındadir.
Eğer DC1B0 ve DC1B1 register bitlerini sıfır yapar ve kullanmaz isen ve sadece CCPR1L registerindeki bilgiyi kullanırsan o zaman 8 bit cözünürlükte PWM1 kullanmış olursun.

Çalışmalarında başarılar.

ise

(bit) , (unsigned char), (char),(int),(float)  vs.vs. bu tür parantez içerisindeki yapılar mod dönüşümleri için kullanılır.
long sayi; // 32 bit değişken
x=(bit)(sayi>>2);  //sayiyi 2 sola kaydır.  ilk bite bak  ilk bitin değerini x ata,
x=(char) (sayi);  // ilk 8 bitini atar,
x=(int)(sayi);// ilk 16 bitini atar.
x=(double)(sayi); // long double float byte uzunlukları aynı olduğu için direkt olarak olarak atanır fakat float değişkenden dönüşümlerde sayının sadece , den sonraki kısmı dönüştürülür.