Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
9
Cevap
795
Tıklama
0
Öne Çıkarma
Ccs C, DS18B20 sorunu
İ
2 yıl
Yarbay
Konu Sahibi

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);
}

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





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

< Bu ileti mini sürüm kullanılarak atıldı >

R
2 yıl
Binbaşı

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.


Bu mesaja 1 cevap geldi.
İ
2 yıl
Yarbay
Konu Sahibi

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.


< Resime gitmek için tıklayın >


 //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 >

< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @rafet32
R
2 yıl
Binbaşı

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.



R
2 yıl
Binbaşı

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++;



R
2 yıl
Binbaşı

Ü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.


Bu mesaja 1 cevap geldi.
İ
2 yıl
Yarbay
Konu Sahibi

Ç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 >

< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @rafet32
İ
2 yıl
Yarbay
Konu Sahibi

ds18b20.c dosyasının adını değiştirince düzeldi.



< Bu ileti mini sürüm kullanılarak atıldı >

R
2 yıl
Binbaşı

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

quote:

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.

quote:

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 >
Bu mesaja 1 cevap geldi.
İ
2 yıl
Yarbay
Konu Sahibi

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:

< Resime gitmek için tıklayın >
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 >

< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @rafet32
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.