Bir Kütüphanede tanımlanan pini değiştirme

Başlatan MrDarK, 24 Ağustos 2013, 09:17:53

MrDarK

Merhaba arkadaşlar ;

daha önce böyle birşeye ihtiyacım olmamıştı ama bir projede lazım oldu CCS'in 1 wire haberleşmesini kullanarak bir sensörü haberleştiriyorum.

Amacım 4 tane sensörü haberleştirmek ama hepsini aynı pine bağlayarak değil farklı farklı pinlere bağlamak ve tek kütüphane kullanmak.

/*-------1-wire definitions-------*/ 
 #define ONE_WIRE_PIN PIN_A0


Kütüphane içinde böyle bir kısım var şimdi sıkıntım şu ben bu sensörlerin adres numaralarını bilmiyorum keza bilmekte istemiyorum gerek yok. 4 tane pini 1 wire haberleşme için kullanıyorum. Şimdi bu kütüphaneye nasıl bir değişiklik yapmam gerekiyor ki

örneğin;
one_wire_read(0);
one_wire_read(1);
one_wire_read(2);

Şeklinde kod yolladığımda  #define ONE_WIRE_PIN PIN_A0 'daki A0'ı değiştirsin ?

Birkaç projede #ifdef fonksiyonlarını görmüştüm ama açıkçası pek anlayamadım. Hoş problemi 4 tane aynı kütüphane kullanarak zaten çözdüm ama :D saçma bir çözüm oldu aklıma takıldığı için sormak istedim.

Cevaplarınız için şimdiden teşekkür ederim.
Picproje Eğitim Gönüllüleri ~ MrDarK

Gökhan BEKEN

Örnekler:
Daha önce tanımlanmış mı diye kontrol etmek:
#ifndef MAX_VAL   // MAX_VAL tanımlanmamışsa
#define MAX_VAL 100   // MAX_VAL 100 olarak tanımla
#endif


#undef direktifi #define ile yapılan bir tanımlamayı geçersiz kılmak için kullanılır
#if MAKSIMUM < 100     // MAKSIMUM 100 den küçükse
#undef MAKSIMUM       // MAKSIMUM için yapılan tanımlamayı iptal et
#define MAKSIMUM 100 // MAKSIMUM 100 olarak tekrar tanımla
#endif


Geçen gün daha önce tanımlanmış bir önişlemci direktifini silip baştan oluşturmaya gerek kalmadan değiştirmeyi görmüştüm ama şimdi aradım bulamadım. Şimdilik #undef ile kaldırıp #define ile baştan oluşturun işiniz görülür.
Özel mesaj okumuyorum, lütfen göndermeyin.

yamak

Seninkine benzer bir olayla daha önce uğraşmıştım ve şu şekilde çözmüştüm:
Sensore ait fonksiyonlara parametre olarak kullanacağın port un adresini ve kullanacağın pini gönder.Bir tane de global olarak tanımladığın örneğin One_wire_tris,One_wire_data,One_wire_data_bit şeklinde değişkenlerin olsun ve her okuma yapacağında bu değişkenleri değerlerini okuyacağına porta göre değiştir.Aşağıdaki örneği inceleyerek ne demek istediğimi daha iyi anlayabilirsin.

Bu main dosyasında bir alıntı:
       sensor_oku=0;
            SHT75_TRIS=&TRISB;
            SHT75_TRIS_Bit=1;
            SHT75_DATA=&PORTB;
            SHT75_DATA_Bit=1;
            SHT75_SCK=&PORTB;
            SHT75_SCK_Bit=0;
            sht75_init();
            sht75(&temp_val[0],&rhlin[0],&rhtrue[0]);
            
            SHT75_TRIS=&TRISB;
            SHT75_TRIS_Bit=3;
            SHT75_DATA=&PORTB;
            SHT75_DATA_Bit=3;
            SHT75_SCK=&PORTB;
            SHT75_SCK_Bit=2;
            sht75_init();
          sht75(&temp_val[1],&rhlin[1],&rhtrue[1]);
            
            SHT75_TRIS=&TRISB;
            SHT75_TRIS_Bit=5;
            SHT75_DATA=&PORTB;
            SHT75_DATA_Bit=5;
            SHT75_SCK=&PORTB;
            SHT75_SCK_Bit=4;
            sht75_init();
          sht75(&temp_val[2],&rhlin[2],&rhtrue[2]);
               
            SHT75_TRIS=&TRISD;
            SHT75_TRIS_Bit=1;
            SHT75_DATA=&PORTD;
            SHT75_DATA_Bit=1;
            SHT75_SCK=&PORTD;
            SHT75_SCK_Bit=0;
            sht75_init();
          sht75(&temp_val[3],&rhlin[3],&rhtrue[3]);


Buda Sht75.c dosyasından bir alıntı:
void sht75_start(void)
{
    // ?leti?im satart?
    //       _____         ________
    // DATA:      |_______|
    //           ___     ___
    // SCK : ___|   |___|   |______

  //  SHT75_TRIS=1;
    bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    //SHT75_SCK=0;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    __delay_us(5);
    //SHT75_SCK=1;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
    __delay_us(3);
   // SHT75_TRIS=0;
    bit_level(SHT75_TRIS,SHT75_TRIS_Bit,0);
    __delay_us(3);
   // SHT75_DATA=0;
    bit_level(SHT75_DATA,SHT75_DATA_Bit,0);
    __delay_us(3);
    //SHT75_SCK=0;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    __delay_us(3);
    //SHT75_SCK=1;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
    __delay_us(3);
   // SHT75_TRIS=1;
    bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    __delay_us(3);
    //SHT75_SCK=0;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
}

void sht75_comreset(void)
{
    // Reset: Data hatt? 1 iken 9 clk cycle'? gelir ve sonra ileti?im start? ile devam eder
    //       _____________________________________________________         ________
    // DATA:                                                      |_______|
    //          _    _    _    _    _    _    _    _    _        ___     ___
    // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
    unsigned char i;
    //SHT75_DATA=1;
        bit_level(SHT75_DATA,SHT75_DATA_Bit,1);
   // SHT75_SCK=0;
       bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    for(i=0;i<9;i++)
    {
        //SHT75_SCK=1;
         bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
        __delay_us(3);
        //SHT75_SCK=0;
         bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
        __delay_us(3);
    }
    sht75_start();
}

unsigned char sht75_softreset(void)
{
    //Interface'i resetler, status register'i default de?erine döndürür
    unsigned char error=0;
    sht75_comreset();
    error=sht75_write_byte(RESET);		// Reset komutu gönderiliyor
    __delay_ms(15);						// En az 11ms beklenmeli
    return error;						// 1'ise sensörden tepki yok, hata var
}

unsigned char sht75_write_byte(unsigned char veri)	// 1 byte yaz?l?yor
{
    unsigned char i, error=0;
   // SHT75_TRIS=0;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,0);
    __delay_us(3);
    for(i=0x80;i>0;i/=2)
    {
        //SHT75_SCK=0;
            bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
        __delay_us(3);
        if(i&veri)
           // SHT75_DATA=1;
                bit_level(SHT75_DATA,SHT75_DATA_Bit,1);
        else
           // SHT75_DATA=0
                bit_level(SHT75_DATA,SHT75_DATA_Bit,0);
        __delay_us(3);
        //SHT75_SCK=1;
            bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
        __delay_us(3);
    }
   // SHT75_TRIS=1;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    __delay_us(3);
   // SHT75_SCK=0;
        bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    __delay_us(3);
    //error=SHT75_DATA;
    error=read_bit(SHT75_DATA,SHT75_DATA_Bit);
    __delay_us(3);
    //SHT75_SCK=1;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
    __delay_us(3);
    //SHT75_SCK=0;
    bit_level(SHT75_SCK,SHT75_SCK_Bit,0);

    return error;
}

unsigned int sht75_read_byte(void)		// 2 byte okunuyor
{
    unsigned int kay=0x0001,veri=0;
    unsigned char i;
  //  SHT75_TRIS=1;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    __delay_us(3);
    for(i=0;i<8;i++)
    {
        veri=veri<<1;
       // SHT75_SCK=1;
            bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
        __delay_us(3);
        //if(SHT75_DATA)
        if(read_bit(SHT75_DATA,SHT75_DATA_Bit))
            veri=veri|kay;
        __delay_us(3);
     //   SHT75_SCK=0;
            bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
        __delay_us(3);
    }
  //  SHT75_TRIS=0;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,0);
    __delay_us(3);
    //SHT75_DATA=0;
        bit_level(SHT75_DATA,SHT75_DATA_Bit,0);
    __delay_us(3);
   // SHT75_SCK=1;
        bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
    __delay_us(3);
  //  SHT75_SCK=0;
        bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    __delay_us(3);
   // SHT75_TRIS=1;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    __delay_us(3);

    for(i=0;i<8;i++)
    {
        veri=veri<<1;
       // SHT75_SCK=1;
            bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
        __delay_us(3);
       // if(SHT75_DATA)
        if(read_bit(SHT75_DATA,SHT75_DATA_Bit))
            veri=veri|kay;
        __delay_us(3);
       // SHT75_SCK=0;
            bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
        __delay_us(3);
    }
    //SHT75_TRIS=0;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,0);
    __delay_us(3);
    //SHT75_DATA=1;
        bit_level(SHT75_DATA,SHT75_DATA_Bit,1);
    __delay_us(3);
   // SHT75_SCK=1;
        bit_level(SHT75_SCK,SHT75_SCK_Bit,1);
    __delay_us(3);
    //SHT75_SCK=0;
        bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    __delay_us(3);
   // SHT75_TRIS=1;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    __delay_us(3);

    return veri;
}

void com_wait(void)		// Çevrimin bitmesi bekleniyor
{
    int i;

    //SHT75_TRIS=1;
        bit_level(SHT75_TRIS,SHT75_TRIS_Bit,1);
    __delay_us(3);
  //  SHT75_SCK=0;
        bit_level(SHT75_SCK,SHT75_SCK_Bit,0);
    __delay_us(3);
    for(i=0;i<32;i++)
    {
 //   if(!SHT75_DATA)
        if(!read_bit(SHT75_DATA,SHT75_DATA_Bit))
        break;
    __delay_ms(10);
    }
}

unsigned char sht75_write_statusreg(unsigned char veri)
{
    unsigned char error=0;
    sht75_start();
    error+=sht75_write_byte(STATUS_REG_W);
    error+=sht75_write_byte(veri);

    return error;
}

unsigned int measure_temp(void)		// S?cakl?k hesaplan?yor
{
    unsigned char ack;
    unsigned int veri;
    sht75_start();
    ack=sht75_write_byte(MEASURE_TEMP);
    com_wait();
    veri=sht75_read_byte();
    return veri;
}