Şimdi Ara

Ccs C, DS18B20 sorunu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
11
Cevap
0
Favori
169
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba. Fidenet Clock ürünü için firmware derlerken üründe bulunan DS18B20 sensör ait fonksiyon olan, ds1820_read() fonksiyonunu çağırınca undefined identifier hatasını alıyorum. Ccs c hata açıklamasında fonksiyonun önündeki aç kapa parantezleri işaret ediyor.

    Fonksiyonu çağırdığım şu if ifadesini /* */ ile devre dışı bırakıp compile ettiğimde hata ortadan kalkıyor.

     if ((genCounter % 500)==450) 
          {
             
             temperature = ds1820_read();
             adres(1,3);
             printf(lcd_yaz,"Hava %3.1f%cC",temperature,223);
          }   


    quote:

    C:\Users\*******\Documents\CCS C Projects\fidenet_clock\fidenet_clock.c" Line 252(35,36): Undefined identifier -- ds1820_read


    Ürün bu:
    https://fidenetgaraj.blogspot.com/2018/06/masaustu-dijital-saat-yapalm.html?m=1

    Sorun nerede acaba?

     
    #define ONE_WIRE_PIN PIN_c0
    void onewire_reset() {
    output_low(ONE_WIRE_PIN);
    delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
    output_float(ONE_WIRE_PIN); //1-wire bir yapılır
    delay_us( 500 );// sensörün hazırlanması için beklenir.
    output_float(ONE_WIRE_PIN);
    }

    void onewire_write(int data)
    {
    int count;
       for (count=0; count<8; ++count)
       {
       output_low(ONE_WIRE_PIN);
       delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
       output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
       delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
       output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,delay_us( 2 ); // 1us'den fazla beklenir.
       }
    }
       
    int onewire_read()
    {
    int count, data;
       for (count=0; count<8; ++count)
       {
       output_low(ONE_WIRE_PIN);
       delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
       output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
       delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
       shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
       delay_us( 120 ); //Okuma işlemi zamanı doldurulur.}
       return( data );
       }

    float ds1820_read()
    {
    int8 busy=0, temp1, temp2;
    signed int16 temp3;
    float result;
    onewire_reset();
    onewire_write(0xCC);
    onewire_write(0x44);
    while (busy == 0)
    busy = onewire_read();
    onewire_reset();
    onewire_write(0xCC);
    onewire_write(0xBE);
    temp1 = onewire_read();
    temp2 = onewire_read();
    temp3 = make16(temp2, temp1);
    result = (float) temp3 / 16.0;delay_ms(200);return(result);
    }



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 4 Mart 2024; 18:54:17 >







  • ds1820_read(); fonksiyonunu bulamıyor. Bunun geçtiği (kodlarını mesaj içerisinde paylaştığınız kütüphane) .h veya .c dosyasını bu fonskiyonu kullandığınız unit içerisinde üstte


    #include <dosyaadi.c> şeklinde projenize dahil etmeniz gerekiyor.

  • rafet32 kullanıcısına yanıt
    ds18b20.c dosyası include edildi. Programın başında include <ds18b20. c> satırı var. O kısma defalarca baktım. Sürücü dosyası ds18b20.c olarak kayıtlı burada da hata yok.


    Ccs C, DS18B20 sorunu


     //Bismillahirrahmanirrahim 
    #include <main.h>
    #include <def.h>
    #include <regs.h>
    #include <2465x.c>
    #include <ds_1307.c>
    #include <ds18b20.c>
    #include <func.c>
    #include <lcd4x16.c>
    #include <shtxx.c>

    #include <string.h>

    #INT_EXT0
    void ext0_isr(void)
    {

    }

    #INT_RDA
    void rda_isr(void)
    {

    }

    #INT_RDA2
    void rda2_isr(void)
    {
    counterData=0;
    counterTemp=0;
    permissionToAttend=0; //eğer debug porttan veri varsa çalışmayı kes ve veri ile uğraş burası tehlikeli olabilir
    hiX(buzzer);
    do{
    if(kbhit(dbg))
    {
    counterData=fgetc(dbg);
    if(counterData < maxRda2Data) //gelen veriler fazla uzun ise 250 karakterden sonrasını önemseme
    {

    rda2Data[counterData]=counterData;
    counterData++;
    rda2Data[counterData]='\0';

    //gsm_rda_data[counterData]='\0';
    counterTemp=0;
    }
    }
    counterTemp++;

    }while(counterTemp<2500);
    //gsm_rda_data[counterData]=0;


    //fprintf(dbg,"Data:%s\r\n"rda2Data);
    rda2IntActivity=1;
    loX(buzzer);


    }



    void main()
    {




    //setup_adc_ports(NO_ANALOGS, VSS_VDD);
    //setup_adc_ports(sAN0, VSS_VDD);
    //setup_adc(ADC_CLOCK_DIV_8 | ADC_TAD_MUL_0);
    setup_adc_ports(sAN0, VSS_VDD);
    setup_adc(ADC_CLOCK_DIV_16 | ADC_TAD_MUL_2);

    setup_adc_ports(sAN0, VSS_VDD);
    setup_adc(ADC_CLOCK_DIV_32 | ADC_TAD_MUL_2);


    init_ext_eeprom();
    bekle(tKisa);
    ds1307_init(); // saat init
    bekle(tKisa);
    //enable_interrupts(INT_EXT0);
    //enable_interrupts(INT_RDA);
    enable_interrupts(INT_RDA2);


    enable_interrupts(INTR_GLOBAL);


    //Pin Konfigurasyonu burada
    //userLed
    output_drive(userLed);
    //buzzer
    output_drive(buzzer);
    //Butonlar
    output_float(buton1);
    output_float(buton2);
    output_float(buton3);
    output_float(buton4);
    output_float(buton5);

    //HMTRP RF pin konfigurasyon
    output_drive(rfEnable);
    output_drive(rfConf);

    //lcd ayarlama rutini
    lcd_ayarla();
    setBacklight(disable);

    //HMTPRP rf modül ayarla
    hmtrp(disable);
    bekle(tSn);
    hmtrp(enable);
    bekle(tSn);
    bekle(tKisa);



    //Başlıyoruz
    backlightVal=lHi;
    setBacklight(backlightVal);
    /* // LCD Backlight Test rutini
    for ( genCounter=0; genCounter<120; genCounter++)
    {
    backlightVal=genCounter * 500;
    setBacklight(backlightVal);
    adres(1,1);
    printf(lcd_yaz,"LCD Backlight Dimm: %lu"backlightVal );
    bekle(tSn);
    }
    */

    fprintf(dbg,"FiDeNet\r\n");
    fprintf(dbg,"Digital Environment Board\r\n");

    fprintf(CommRf,"FiDeNet\r\n");

    genCounter=0;

    lcd_sil();
    adres(1,1);
    printf(lcd_yaz,"PCB Ref:%s"deviceData[cHWID].hwStr);
    adres(1,2);
    printf(lcd_yaz,"Sw Ver: %s"deviceData[cSWVersion].hwStr);
    adres(1,3);
    printf(lcd_yaz,"Hw Rev: %s"deviceData[cHWRev].hwStr);
    adres(1,4);
    printf(lcd_yaz,"By: %s"deviceData[mfc].hwStr);

    bekle(tSn);
    lcd_sil();
    adres(1,1);
    printf(lcd_yaz," FiDeNet");
    adres(1,3);
    printf(lcd_yaz," Digital Clock");

    beep(2,2);

    bekle(tSn);
    lcd_sil();
    //saat ayarlama kısmı
    /*
    ds1307_set_time(23,12,00); //Saat ayarla
    bekle(tKisa);
    ds1307_set_date(2,5,20,6); //Tarih ayarla dow değeri önemli olmasa da ayrla belki ilerde kullanılır.
    bekle(tKisa);
    */



    /* //eeprom test rutini
    fprintf(dbg,"EEPROM Test Rutini %s \r\n"strGen1);
    eepromWrTest();
    bekle(tMini);
    eepromRdTest();
    */

    //read_dev_id();
    isReadDevIdValid=0;

    if(readDevId()==1)
    {
    fprintf(dbg,"Dev ID:%s \r\n"devId);

    }
    else
    {
    fprintf(dbg,"devId N/A\r\n");
    }
    genCounter=0;

    //Işık seviyesi ölçümü için adc kanal ayarı
    adcCh=lightLevelCh;
    set_adc_channel(adcCh);
    bekle(tMini);

    while(TRUE)
    {

    enable_interrupts(INT_RDA2);
    genCounter++;


    bekle(tMicro);
    output_toggle(userLed);




    if ((genCounter % 500)==0)
    {
    //myClock.year=year+2000;
    ds1307_get_time(myClock.hrs,myClock.min,myClock.sec);
    adres(1,1);
    printf(lcd_yaz,"Saat: %2u:%2u:%2u"myClock.hrs,myClock.min,myClock.sec);
    }

    if ((genCounter % 500)==150)
    {
    ds1307_get_date(myClock.day,myClock.month,myClock.year,myClock.dow);
    adres(1,2);
    printf(lcd_yaz,"Tarih: %2u/%2u/20%u"myClock.day,myClock.month,myClock.year);
    }

    if ((genCounter % 500)==250)
    {
    //eğer adc başka kanala ayarlı ise lightLevel kanalına al ve 10ms bekle
    if (adcCh!=lightLevelCh)
    {
    adcCh=lightLevelCh;
    set_adc_channel(adcCh);
    bekle(tMini);
    }
    lightLevel=read_adc();

    sht_init();
    sht_rd (resTemp, trueHumid);
    delay_ms(2);

    adres(1,4);
    printf(lcd_yaz,"T:%4.1f H:%4.1f L:%lu ", resTemp, trueHumid, lightLevel);

    }


    if ((genCounter % 500)==450)
    {
    temperature = ds1820_read();
    adres(1,3);
    printf(lcd_yaz,"Hava %3.1f%cC"temperature,223);
    }

    if(input(buton1)==0)
    {
    fprintf(dbg,"buton1\r\n");
    bekle(deBounce);
    }

    if(input(buton2)==0)
    {
    fprintf(dbg,"buton2\r\n");
    bekle(deBounce);
    }
    if(input(buton3)==0)
    {
    fprintf(dbg,"buton3\r\n");
    bekle(deBounce);
    }
    if(input(buton4)==0)
    {
    fprintf(dbg,"buton4\r\n");
    bekle(deBounce);
    }
    if(input(buton5)==0)
    {
    fprintf(dbg,"buton5\r\n");
    bekle(deBounce);
    }


    if(rda2IntActivity==1)
    {
    //fprintf(dbg,"Data2:%s\r\n"rda2_data);
    rda2IntActivity=0;


    strcpy(tempBuffer,myCmd[AT].str);// AT
    if(strcmp(rda2Data,tempBuffer)==0)
    {
    fprintf(dbg,"AT:OK\r\n");
    }
    strcpy(tempBuffer,myCmd[ATI].str);// GET device_id

    if(strcmp(rda2Data,tempBuffer)==0)
    {
    fprintf(dbg,"ATI:%s\r\n"devId);
    }

    strcpy(tempBuffer, myCmd[ATHW].str);// GET cHW_id
    if(strcmp(rda2Data,tempBuffer)==0)
    {
    fprintf(dbg,"ATHW:%s\r\n"deviceData[cHWId].hwStr);
    }

    strcpy(tempBuffer, myCmd[ATHWr].str);// GET Hardware revizyon
    if(strcmp(rda2Data,tempBuffer)==0)
    {
    fprintf(dbg,"ATHWr:%s\r\n"deviceData[cHWRev].hwStr);
    }

    strcpy(tempBuffer, myCmd[ATSW].str);// GET Sofware revizyon
    if(strcmp(rda2Data,tempBuffer)==0)
    {
    fprintf(dbg,"ATSW:%s\r\n"deviceData[cSWVersion].hwStr);
    }

    strcpy(tempBuffer,myCmd[ATC].str); // clear device_id
    if(strcmp(rda2Data,tempBuffer)==0)
    {
    for (counterTemp=0;counterTemp<20;counterTemp++)
    devId[counterTemp]='\0';
    writeDevId();
    fprintf(dbg,"ATC:OK\r\n");
    }

    strcpy(tempBuffer,myCmd[ATr].str); // clear device_id
    if(strcmp(rda2Data,tempBuffer)==0)
    {
    fprintf(dbg,"ReBoot\r\n");
    bekle(tOrta);
    reset_cpu();
    }


    strcpy(tempBuffer,myCmd[ATW].str);//write device_id
    if(strstr(rda2Data,tempBuffer)>13)
    {
    //fprintf(dbg,"ATW\r\n");
    counterGen2=strlen(rda2Data);
    if((counterGen2<26)&&(counterGen2>20))
    {

    for(counterData=0;rda2Data[counterData]!=':';counterData++)
    {}
    counterData++;

    //fprintf(dbg,"str_len:%lu\r\n"strlen(rda2_data));

    counterGen2=counterGen2-counterData-2;
    for(counterTemp=0;counterTemp!=counterGen2;counterTemp++)
    {
    devId[counterTemp]=rda2Data[counterTemp+counterData];
    }
    devId[counterTemp]='\0';
    writeDevId();
    fprintf(dbg,"ATW:OK\r\n");

    }
    else
    {
    fprintf(dbg,"ATW:ERROR\r\n");
    }
    }


    }



    //TODO: User Code

    }

    }



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 4 Mart 2024; 20:16:32 >




  • Hazır kurulu ccs yok bende ama ccsnin standart kütüphaneleri içindede ds1820.c var diye hatırlıyorum. İsim benzerliğinden dolayı kendi standart olanı önce görüyor olabilir.


    Bunu anlamanın kolay yolu sizin kullandığınız ds1820.c nin dosya ismini farklı bir şey yapın ve #include yaptığınız yerde bu yeni ismi kullanın. Yukarıdaki paylaştığınız kod örneğinde bir problem görünmüyor.

  • Koda bakınca konu ile çok alakalı olmayan ama gereksiz / hatalı kullanım gözüme çarptı.


       while(TRUE)

       {


          enable_interrupts(INT_RDA2); // <<----- bu kısım gereksiz. Zaten yukarıda enable yapıldı. Başka yerdede disable yapılmıyor.

          genCounter++;

  • Üstadım bu kodlar uğraştığınız geliştirme kartı ile birlikte gelen örnek kodlarmı?


    Gözüme  


    #INT_RDA2

     void rda2_isr(void) 

    {

    .......

    }



    içindeki kullanım çarptı. Kesme içerisinde do While kullanımı çok çok yanlış bir uygulama.

  • rafet32 kullanıcısına yanıt
    Çalıştığım kartla birlikte bana gönderilen örnek kodlar. Saat üzerinde çalışan bir Firmware var. Sıcaklığı DS18B20'den mi alıyor yoksa SHT11'den mi aliyor bilmiyorum.

    Açıkçası şu aşamada hata veren ds1820_read fonksiyonuna odaklandığım için kesmelere dikkat etmedim. Kesme içinde sonsuz döngü kullanılması hatalı bir kullanım evet. Kesme fonksiyonun işi bittiğinde kesmeden çıkmayı engelleyecek bir şeydir bu. Belki de saatteki laglı çalışma bundan kaynaklanıyordur. Saniyeler bazen iki üç saniye takılıyor. 1,2,3,4 diye düzenli gitmiyor.

    Alette kod koruması yok, içindeki kodu okutup yedeğini aldım. O da kenarda duruyor.



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 4 Mart 2024; 21:29:3 >
  • ds18b20.c dosyasının adını değiştirince düzeldi.
  • Tahminimiz doğru çıktı, ama bu durum beni şaşırttı doğrusu. Derleyiciler sistemde aynı isimde kütüphaneler olduğunda, kaynak kodların bulunduğu klasördekine öncelik tanır ve onu import eder. CCS bu noktada farklı bir yol tercih etmiş demekki  


    Alıntı

    metni:
    saniyeler bazen iki üç saniye takılıyor. 1,2,3,4 diye düzenli gitmiyor.


    Kart ile birlikte gelen kodların paylaştığınız kadarından edindiğim intibaya göre kötü kodlama / algoritma ve sistem kaynaklarının düzgün kullanılmaması gibi durumların geri kalan kütüphane ve örneklerdede olacağını tahmin ediyorum. Bu nedenle performans problemi çıkartacak farklı durumlar ile karşılaşmanız kuvvetle muhtemel.


    Alıntı

    metni:
    Sıcaklığı DS18B20'den mi alıyor yoksa SHT11'den mi aliyor bilmiyorum.


    Kodlara bakmadan, eğer her iki sensörde bağlı ise, bir tanesini biraz ısıtın, test uygulamalarında ekranda sıcaklık gösteren bir örnek varsa sonucu oradan gözlemleyebilirsiniz. Ayrıca SHT11 in nem ölçme özelliğide var. Örnek uygulamada nem ile ilgili bir şey varsa oradanda ayrıştırabilirsiniz.




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 5 Mart 2024; 23:8:11 >




  • rafet32 kullanıcısına yanıt
    Saatin içindeki yazılımdan. Saati yapan adam çeşitli forumlarda fide kullanıcı adıyla yer alıyor. Burada yok sanırım. Bana söylediğine gore:

    Ccs C, DS18B20 sorunu
    Hava yazan yerdeki sıcaklık bilgisi DS18B20'den geliyormuş. Alt satırda T yazan yerdeki sıcaklık SHT11'den geliyormuş.

    H yazan yer Nem(humidity), L de ortam ışığı miktarı.



    < Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 6 Mart 2024; 20:53:57 >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.