Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Float ile PutC kullanimi ?

Başlatan rakkoc, 11 Nisan 2012, 20:16:20

rakkoc

Merhaba Arkadaslar asagidaki sekilde bir kodum var. restemp ve truehumid degiskenlerini PC'ye aktariyorum bunun icin putC kullaniyorum. float olduklari icin anlamsiz seyler geliyor. bunlar int yapip aktariyorum o zamanda virgulden sonrasini alamiyorum bu noktada cozum bulamadim acaba bana bir akil verbilirmisiniz _?

// Detaylar : http://blog.rakkoc.com/2012/03/ccs-pic-c-ile-sht-xx-serisi-kullanimi/#ixzz1rkkA3UKU

#include <16F877A.h>
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP
#use delay(clock=20000000)
 
#include<lcd.c>
#include<sht75.c>
 
void main()
{
 float restemp, truehumid;
 lcd_init();
 sht_init();
 
 while(1)
 {
  sht_rd (restemp, truehumid);
  lcd_gotoxy(1,1);
  printf(lcd_putc, "Temp : %3.1f %cC   ", restemp, 223);
  printf(lcd_putc, "\nRH   : %3.1f %%   ", truehumid);
  delay_ms(500);        //delay 500 ms between reading to prevent self heating of sensor
 }
}

mcn

printf("%f",restemp);

şeklinde yaptığında direk olarak gitmesi lazım.Ben bu şekilde float olan voltaj değişkenini rahatlıkla yollayabiliyorum.

ayrıca kodunda putc göremedim,ordaki putc 2x16 lcd ye veri yazma komutu,seri port ayarlarınıda göremedim?
Yanlış kodu koymadığından emin misin???
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

rakkoc

#2
// (MCU = Micro Controler Unit)

// MCU tanimlama dosyasini cagiralim
#include <16F877A.h> 

// MCU kullanimi icin gereken sigorta tanimi
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP 

// Clock Kristalinin hizi herz bazinda (20MHZ) 
#use delay(clock=20000000) 

// LCD kutuphanesi
#include<exlcd.c>

// Isý ve Nem sensoru Kutuphanesi
#include<sht75.c> 

// PC baglantisi icin gerekli Tx, Rx ve baudrate hizi 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


void main()
{
 // Olcum sonuclarinda kullanilacak float degiskenler.
 // hassa algilama icin float kullaniliyor.
 float restemp, truehumid;

 // PC'ye gonderirken int algiliyoruz
 INT16 intRestemp, intTruehumid;

 // 16x2 LCD'nin acilma kodunu gonder
 lcd_init(); 

 // ISI ve NEM sensorunun acilma kodunu gonder
 sht_init(); 

 // Sonsuz Dongu
 while(1) 
 {
  // SHT uzerinden isi ve nem'i olc
  sht_rd (restemp, truehumid); 

  // putC ile RS232'den Byte gonderecegimiz icin
  // Olcum sonuclarini INT'e ceviriyoruz 
  // (ilerde virgulden sonrasinida algilatacak bir sistem yapacagiz)

  // float ISI'dan int isi'ya
  intRestemp = restemp;

  // float NEM'den int nem'e
  intTruehumid = truehumid;

  // putC ile once isiyi, sonra Nem'i gonderdik.
  putc(intRestemp);
  putc(intTruehumid);

  // LCD'nin ilk satir ilk sutununa git
  lcd_gotoxy(1,1); 

  // LCD'ye isi ve Nem degerlerini yazdiralim. (\f ekrani temizler \n alt satira gecer)
  printf(lcd_putc, "\f ISI : %3.1f %cC   ", restemp, 223); // 223 derece simgesindeyi yuvarlak
  printf(lcd_putc, "\n NEM : %3.1f %%   ", truehumid);  // cift yuzde 1 yuzde yazdirir.


  // (Clock hizina gore bekleme suresini kendi hesaplar.
  // Bu yuzden clock hizinin dogru olmasi onemlidir)
  delay_ms(3000); // 3 sn bekle 
 } 
}


Suan calisan hali bu sekilde. Odev icin oldugundan direk int yapip hocaya gostermem gerekti.

Printf ile RS232'den veri gonderile biliyormu ?

mcn

asıl printf ile gönderilir RS232 den veri :)

sen yukarda gösterdiğim şekilde yapmayı bir dene,çalışması lazım.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

rakkoc

suanda odevin 3. ayagi olan Android programini yaziyorum aksam uzeri PIC'e donup deniyecegim. Peki karsi taraftan (bilgisayardan) veriyi nasil okutabilirim ?

Odevin nasil olacagini tabi bastan anlatmadigim icin bende hata :(

Bir cihazla isiyi ve nem'i olcuyorum (SHT11)
RF ile Baska bir devreye aktariyorum.
o devreden de PC'ye aktarip bir veritabanina yaziyorum.
Web servisi ile Veritabanina erisip ; Windows Mobile, Iphone ve Android de birer uygulama ile raporlama yapicam

mcn

Alıntı yapılan: rakkoc - 12 Nisan 2012, 09:23:03
Peki karsi taraftan (bilgisayardan) veriyi nasil okutabilirim ?


o Ayrı bir konu,visual basic veya c# ile arayüz yapman lazım.forumda bi bak örnek çalışma olması lazım seri porttan veri okuma ile ilgili c# la yapılmış.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

rakkoc

C# ile yapiyorum seri porttan normaldede (byte) olarak okutuyorum; Float'i direk yollarsam float 2 byte'a tekabul etmesi lazim (virgulden once ve sonra) onu nasil birlestiricegm kismi beni dusundurdu

mcn

onda pic teki gibi byte byte alıp birleştirme olmuyor diye biliyorum.Seri porttan ne geliyorsa alıp direk işleme koyabiliyorsun sanırım.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

rakkoc

C# da text olarak alacak isen dedigin gibi direk cekersin ama uzerinde islem yapilacak ise byte byte okumak zorundasin (yada ben bugune kadar oyle bildigimden hep oyle yaptim)

yoksa 62 geldi mesela 62 ASCII olarak 'b' karakterine aitken 62 derecede olabilir %62 de olabilir. Kullandigim kod asagidaki sekilde:

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                // Label'larin icini bosalt
                label1.Text = "";
                label2.Text = "";

                // Kac Byte geliyor kontrol et
                int bytes = serialPort1.BytesToRead;

                // 2 byte ise (int olarak isi ve nem)
                if (bytes == 2)
                {
                    // Create a byte array buffer to hold the incoming data
                    byte[] buffer = new byte[bytes];

                    // Read the data from the port and store it in our buffer
                    serialPort1.Read(buffer, 0, bytes);

                    // buffer dan textboxlara int olarak aktar.
                    for (int i = 0; i < bytes; i++)
                    {
                        if (i < 1)
                            label1.Text += Convert.ToInt32(buffer[i]).ToString();
                        else
                            label2.Text += Convert.ToInt32(buffer[i]).ToString();
                    }
                }
            }
            finally
            {
                
            }
        }

taso

virgulden sonra 1 hane yolluyor isen  10 ile carp integer yap sonra 2 parcaya bolup yolla

yeni=float*10;
//veirici 2 parca 16 bit yollarsın
fputc(make8(yeni,1));
fputc(make8(yeni,0));


//alıcıda da
//2 farklı 8 bitlik degeri birlestirecek kucuk bir fonksiyon

void make16(int a,int b){
int16 c;

return c=((int16)a<<8)+(int16)b;

}


sonrada    printf("float deger=02.1f",(float)make16(a,b)/10);