Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: universitelim54 - 09 Mayıs 2019, 12:46:08

Başlık: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: universitelim54 - 09 Mayıs 2019, 12:46:08
Mrb. arkadaşlar . int türünde sayac değişkenim var bunu bit bit incelemem gerekiyor . örnek olarak 0xb001100 sayısının 2. ve 3 bitlerinin degerini almam gerekiyor. nasıl bir döngü kurmalayım bu konuda yardımınızı rica ederim .
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: sımışka - 09 Mayıs 2019, 12:59:57
bit mask konusunu araştırın.
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: cripple - 09 Mayıs 2019, 15:33:33
unsigned char A; //(unsigned char = 8 bit) siz her ne kullanıyorsanız

for(uint8_t bit=0; bit < 8; bit++){
       
    if (((A>> bit) & 1) != 0){     // bit degeri 0 dan farkli mi
           
    }
    else{
   
    }
}

tam olarak kodu böyle doğrudan balık vermiş oldum ama balık tutma kısmını mutlaka inceleyin
değişken 8 defa yani tüm bitleri tek tek kaydırılarak 1 ile "ve"(&)  operatör işlemine tabi tutulur ve 0 dan farklı mı diye bakılır.
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: yas - 09 Mayıs 2019, 15:39:43
Hangi bitin 1 olduğunu anlamak için değişkeni sadece 1 bitin high olguğu sayılarla and işlemine tabi tutarsın işlemin sonucu and işlemi yaptığın sayıya eşitse bit 1 değerini almıştır.
Örneğin;

IF Sayac and 8 = 8 then
üçüncü bit high dır
else
üçüncü bit low dur
Endif

0. bit için 1 ile
1. bit için 2 ile
2. bit için 4 ile
3. bit için 8 ile
4. bit için 16 ile
5. bit için 32 ile
6. bit için 64 ile
7. bit için 128 ile
....... gibi uzar gider
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: Murat Mert - 09 Mayıs 2019, 16:14:24
Şunlara bir bak işini görör gibi.

#define BitVal(data,y) ( (data>>y) & 1)      /** Return Data.Y value   **/
#define SetBit(data,y)    data |= (1 << y)    /** Set Data.Y   to 1    **/
#define ClearBit(data,y)  data &= ~(1 << y)   /** Clear Data.Y to 0    **/
#define TogleBit(data,y)     (data ^=BitVal(y))     /** Togle Data.Y  value  **/
#define Togle(data)   (data =~data )         /** Togle Data value     **/
örnekler:
uint8_t number = 0x05; //0b00000101
uint8_t bit_2 = BitVal(number,2); // bit_2 = 1
uint8_t bit_1 = BitVal(number,1); // bit_1 = 0

SetBit(number,1); // number =  0x07 => 0b00000111
ClearBit(number,2); // number =0x03 => 0b0000011

Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: universitelim54 - 09 Mayıs 2019, 20:31:27
Alıntı yapılan: Murat Mert - 09 Mayıs 2019, 16:14:24Şunlara bir bak işini görör gibi.

#define BitVal(data,y) ( (data>>y) & 1)      /** Return Data.Y value   **/
#define SetBit(data,y)    data |= (1 << y)    /** Set Data.Y   to 1    **/
#define ClearBit(data,y)  data &= ~(1 << y)   /** Clear Data.Y to 0    **/
#define TogleBit(data,y)     (data ^=BitVal(y))     /** Togle Data.Y  value  **/
#define Togle(data)   (data =~data )         /** Togle Data value     **/
örnekler:
uint8_t number = 0x05; //0b00000101
uint8_t bit_2 = BitVal(number,2); // bit_2 = 1
uint8_t bit_1 = BitVal(number,1); // bit_1 = 0

SetBit(number,1); // number =  0x07 => 0b00000111
ClearBit(number,2); // number =0x03 => 0b0000011
Truestudio C++ da set bit ve clearbit fonksiyonları yoktur. Verdiğin bilgi mutlaka Baska arkadaşlarında işine yarayacaktır. Tşk ederim cevap için
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: Cemre. - 10 Mayıs 2019, 08:20:09
Bu da farklı bir yöntem;
Denemek için --> https://onlinegdb.com/S17g9tf2V
typedef struct{
    unsigned char Bit0:1;
    unsigned char Bit1:1;
    unsigned char Bit2:1;
    unsigned char Bit3:1;
    unsigned char Bit4:1;
    unsigned char Bit5:1;
    unsigned char Bit6:1;
    unsigned char Bit7:1;
} Bits_TypeDef;

typedef union{
    unsigned char   Byte;
    Bits_TypeDef    Bits;
} Byte_TypeDef;

Byte_TypeDef x;

int main()
{
    x.Byte = 0xAA;

    printf("%i, %i, %i, %i, %i, %i, %i, %i", x.Bits.Bit0, x.Bits.Bit1, x.Bits.Bit2, x.Bits.Bit3,
                                            x.Bits.Bit4, x.Bits.Bit5, x.Bits.Bit6, x.Bits.Bit7);
    return 0;
}
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: ahuramazda - 10 Mayıs 2019, 08:49:44
Alıntı yapılan: universitelim54 - 09 Mayıs 2019, 20:31:27Truestudio C++ da set bit ve clearbit fonksiyonları yoktur. Verdiğin bilgi mutlaka Baska arkadaşlarında işine yarayacaktır. Tşk ederim cevap için


Murat mert kendi makrolarını yazmış zaten. Truestudio'da bu fonksiyonların olup olmaması bu durumu değiştirmez ki.
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: MrDarK - 10 Mayıs 2019, 09:55:31
Alıntı yapılan: Murat Mert - 09 Mayıs 2019, 16:14:24Şunlara bir bak işini görör gibi.

#define BitVal(data,y) ( (data>>y) & 1)      /** Return Data.Y value   **/
#define SetBit(data,y)    data |= (1 << y)    /** Set Data.Y   to 1    **/
#define ClearBit(data,y)  data &= ~(1 << y)   /** Clear Data.Y to 0    **/
#define TogleBit(data,y)     (data ^=BitVal(y))     /** Togle Data.Y  value  **/
#define Togle(data)   (data =~data )         /** Togle Data value     **/
örnekler:
uint8_t number = 0x05; //0b00000101
uint8_t bit_2 = BitVal(number,2); // bit_2 = 1
uint8_t bit_1 = BitVal(number,1); // bit_1 = 0

SetBit(number,1); // number =  0x07 => 0b00000111
ClearBit(number,2); // number =0x03 => 0b0000011


Hocam değerli yanıtınız için teşekkürler. Kesinlikle doğru ifadeler bunlar. Temel c ve universal. Daha detaylı anlamak için bitwise ünitelerini araştırabilir arkadaşlar. Embedded sistemlerde sürekli bitwise işlemleri kullanılıyor.
Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: MCansız - 10 Mayıs 2019, 10:53:29

struct    bytex
            {
              unsigned int bit_0 : 1;        // Byte 1, Bit 0
              unsigned int bit_1 : 1;        // Byte 1, Bit 1
              unsigned int bit_2 : 1;        // Byte 1, Bit 2
              unsigned int bit_3 : 1;        // Byte 1, Bit 3
              unsigned int bit_4 : 1;        // Byte 1, Bit 4
              unsigned int bit_5 : 1;        // Byte 1, Bit 5
              unsigned int bit_6 : 1;        // Byte 1, Bit 6
              unsigned int bit_7 : 1;        // Byte 1, Bit 7
              unsigned int bit_8 : 1;        // Byte 0, Bit 0
              unsigned int bit_9 : 1;        // Byte 0, Bit 1
              unsigned int bit_10: 1;        // Byte 0, Bit 2
              unsigned int bit_11: 1;        // Byte 0, Bit 3
              unsigned int bit_12: 1;        // Byte 0, Bit 4
              unsigned int bit_13: 1;        // Byte 0, Bit 5
              unsigned int bit_14: 1;        // Byte 0, Bit 6
              unsigned int bit_15: 1;        // Byte 0, Bit 7
          };

union
{
struct  bytex byte;
char low_higt[2];
int all;
}gpiox;



kullanımı


gpiox altında all isminde int tipi değişkenimiz var bu değişkenin
gpiox.low_higt[0]=> low nibble (ilk 8 bit)[/li][/list]
gpiox.low_higt[1]=> high nibble (son 8 bit)  olur.
gpiox.byte.bit_15  all değişkenini 15. bitini gösterir ve değiştirebilirsiniz.


örnek:

gpiox.low_higt[0]=0x1F;
gpiox.low_higt[1]=0x2A;
değerleri verilirse
gpiox.all=0x2A1F  olur


Başlık: Ynt: 8 bit lik bir sayıyı bit bit incelemek
Gönderen: universitelim54 - 19 Mayıs 2019, 15:33:17
Alıntı yapılan: ahuramazda - 10 Mayıs 2019, 08:49:44Murat mert kendi makrolarını yazmış zaten. Truestudio'da bu fonksiyonların olup olmaması bu durumu değiştirmez ki.

Özür diliyorum kodu anlamamışım . haklısın kendi makrosunu yapmıs..