Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

sıcaklık okuma sorunu

Başlatan beeroll, 10 Eylül 2010, 02:00:55

beeroll

selam arkadaşlar.pc kontrollü röle kartı yaptım.c# ile röleleri çok güzel kontrol edebiliyordum.bu devre ds1820 ısı probu ekledim.işler değişti :)
sorunum şu: sıcaklığı c# ile devamlı okuyamıyuorum.herhangi bir röle yi açmak için komut gönderdiğimde sıcaklık değeri geliyor ve hızlı bir şekilde röleleri açık kapatırsam pic ve program kilitleniyor.acaba sorun nerdedir.fikri olan ya da bilen arkadaşlar yardımcı olabilir mi.kodlarını veriyorum ama sorun olabileceğini düşündüğüm kısımları sadece.
c# kodu:

      Application.Exit();
        }
          void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
               Thread.Sleep(50);
               string data = com1.ReadLine();
               this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });

            }
            catch (Exception ex)
            {
               MessageBox.Show("Okuma süresi aşıldı veya cihaz upload modunda değil! Sistem mesajı: " + ex.Message, "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void si_DataReceived(string data)
        {
            listBox1.Items.Insert(0, data.Trim());
            textBox2.Text = ("");
             
        }

pic kodu:

#include "C:\Users\toshıba\Desktop\Yeni Klasör (4)\role6.h"
#use delay (clock=10000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1, uart1)
#include <1wire.c>
#define LEDA PIN_B0
#define LEDB PIN_B1
#define LEDC PIN_B2
#define LEDD PIN_B3
#define LEDE PIN_B4
#define LEDF PIN_B5

int8 tH,tL,Conf;

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;

onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
delay_ms(200);
while (busy == 0)
busy = onewire_read();

onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
tH=onewire_read();
tL=onewire_read();
Conf=onewire_read();
temp3 = make16(temp2, temp1);

//result = (float) temp3 / 16.0;   // 0.1 deg C resolution
result = (float) temp3 / 2.0; //0.5 deg C resolution
delay_ms(200);
return(result);
}

void main()
{
   
   char c;
   
   float temperature;
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   //for 10 bit resolution mod
   onewire_write(0xCC);
   onewire_write(0x4E);

   onewire_write(125);
   onewire_write(-55); //this should be done for proper working of DS18B20
   onewire_write(127);

   onewire_reset();
   onewire_write(0xCC);
   onewire_write(0x48);
   delay_ms(15);

   while(TRUE)
      {
        temperature = ds1820_read();
        printf("%f\n\r",temperature);
        delay_ms(1000);
       
        c=getch();
       
        if(c =='A')
            {
               output_high(LEDA);
            }             
            if(c=='1')

muhittin_kaplan

ben görmediysem bağışlayın,
ilk olarak röleyi picmi kontrol ediyor ediyorsa kodlar nerede ?
ikincisi eğer pc den bir kod gidiyorsa "send" komutunuz nerede ?

beeroll

selam öncelikle ilginiz için tşk ederim.
öncelikle c# writeline komutu ile pic e veri gönderiyorum.

bu komutla;
private void Form1_Load(object sender, EventArgs e)
        {
           
            com1.Handshake = Handshake.None;
            com1.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
            com1.ReadTimeout = 500;
            com1.WriteTimeout = 500;
            com1.Open();
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            com1.WriteLine("F");   
           
            textBox1.Text = ("1. role açık");

            button1.BackColor = Color.Red;


pic kısmında ise;

void main()
{
   
   char c;
   
   float temperature;
while(TRUE)
      {
         temperature = ds1820_read();
         printf("%f\n\r",temperature);
         delay_ms(1000);
         
         c=getch();
         
         if(c =='A')
            {
               output_high(LEDA);
            }           
            if(c=='1')
               {
                  output_low(LEDA);
               }

getch ile gelen veriyi alıp işletiyorum.

sorunum şu.röle kontrolünde hiçbir sorunum yoktu.çok güzel çalışıyordu sıcaklık okumaya çalışana kadar.
şimdi ise sıcaklığı sürekli okuyamıyorum.seri porttan veri gelince sıcaklık bilgisi geliyor pic den.normal şartlarda gelmiyorum.sürekli veri gönderincede pic kilitleniyor.

aşağıda ki kod mu yanlış acaba sıcaklık için
while(TRUE)
      {
         temperature = ds1820_read();
         printf("%f\n\r",temperature);
         delay_ms(1000);
         
         c=getch();
aynı while içinde hem roleleri kontrol ediyorum hemde sıcaklık bilgisini okuyor.
umarım sorunu anlatabilmişimdir :(



muhittin_kaplan

getc ile usart tan bilgi bekliyorsunuz.
usart tan bilgi okuma işini #int_rda kesmesi ile yaparsanız sadece bilgi geldiğinde okur ve tekrar ana programa devam eder.

beeroll

ilginiz için teşekkür ederim muhittin bey.sorunumu şu şekilde çözdüm kesme kullanmadım.
while(TRUE)
      {   
         c=getch();
                                   
         if(c=='K')
            {
               temperature = ds1820_read();
               printf("%f\r",temperature);
            }
         if(c =='A')
            {
               output_high(LEDA);

getch komutuyla röleleri kontrol edebildiğim gibi sıcaklık bilgisinide okuyabileceğimi düşündüm ve denedim oldu.'K' bilgisi usarttan gelince sensörü okuyup printf ile geri gönderiyor.pc den ise timer ile gelen veriyi her 10 sn yede bir okuyup bir label a yazdırıyorum.izlediğim yol ne kadar verimli ya da daha farklı yöntemler var mı bilmiyorum ama şu an için gayet güzel çalışıyor.