Kesme sayacı ile sıcaklık okunamıyor.

Başlatan baran123, 29 Mayıs 2015, 23:40:34

baran123

Demin fark ettim.Alttaki kodda okuma işlemini ana döngüdeki if'in içine alınca okuma yapmıyor.Sıfır olarak kalıyor.Ama while içinde okuma yapıyor.Bu okuma işlemi yaklaşık 700-750 ms sürüyormuş sanırım.Benim kesme küsüral ile 1 saniyeden biraz fazla neden böyle bir durum oluyor. ?

#include "main.h"

int1 ds_flag2=0;
static float temp;
static unsigned int8 counter=0;

static void Init_MCU(void);

#Int_Timer0
void Interrupt_Timer0(void)
{
   set_timer0(60);
   if(counter == 20)
   {
      counter=0;
      ds_flag2=1;
   }
   else
   {
      counter++;
      ds_flag2=0;
   }
}

void main(void)
{  
   Init_MCU();
   Init_LCD();
   
   while(TRUE)
   {
      if(ds_flag2==1)
      {
         ds_flag2=0;
         printf(lcd_putc, "\fTemp : %2.1f%cC", temp, 223);
      }
      temp = ds1820_read(); 
      
      enable_interrupts(INT_Timer0);
   }
}

static void Init_MCU(void)
{
   setup_timer_0(T0_INTERNAL | T0_DIV_256 | T0_8_BIT);
   setup_timer_1(T1_DISABLED);   
   setup_timer_2(T2_DISABLED, T2_DIV_BY_1, 1);
   setup_timer_4(T4_DISABLED, T4_DIV_BY_1, 1);
   setup_timer_6(T6_DISABLED, T6_DIV_BY_1, 1);
   setup_vref(VREF_OFF);
   setup_dac(DAC_OFF);
   setup_spi(SPI_DISABLED);
   setup_spi2(SPI_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_ccp1(CCP_OFF); 
   setup_ccp2(CCP_OFF); 
   setup_ccp3(CCP_OFF);
   setup_ccp4(CCP_OFF);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_vref(FALSE);    
   
   set_timer0(60);
   
   enable_interrupts(INT_Timer0);
   enable_interrupts(GLOBAL);
}

RaMu

Bilmediğin kütüphaneyi kullanmamak lazım. :)
Neden böyle olduğunu açıklamayı sana bırakıyorum,
sıcaklık okuma lcd de gösterme kısımları kesme ile çalışan hali aşağıda
http://www.mediafire.com/download/wsl7gokn924linc/3_2_DS18B20_beklemesiz_int8_Lcd_ok.rar
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

Sıcaklık bilgisi okunmaya hazır olduğunda kütüphanenin içinde ki ds_flag 1 olur.Bu değişkeni extern(Her yerden erişilebilir) yapıp ana programda kontrol ederek okunmaya hazır olduğunda okuma işlemi yapmalıyız.Teşekkür ederim hocam. :)

Hocam şu kısmı tam anlamadım.
#if ( 8!=definedinc( ds_flag )  ) //özellikle bu kısım, burada neyin kontrolu yapılıyor ?
#error  STAT1C 1NT1 ds_flag=1; TANIMI DS18B20_INT8.C //yukarıda kı ıf sağlanmadığında bu satırlar error verecek ve derlenmeyecek dıye bılıyorum
#error  DEN ONCE GL0BAL ALANDA YAPILMAK ZORUNDA.//
#warning RaMu//sadece uyarı verecek ksıım 
#endif

RaMu

main içindeki ds_flag değişkenini tanımlama,
yada ds18b20_int8... kütüphanesinden sonra tanımla,
o zaman bu hata mesajı derleyici ekranına yazılacak,
kütüphaneyi kullanana bilgi verecek.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

Hm hocam ben #ifndef kullanmıştım.Şu kısım karıştırdı da 8!=definedinc

RaMu

#5
CcsC help kısmına definedinc yaz:


mesaj birleştirme:: 30 Mayıs 2015, 18:07:06

Tanımlanan değişkenin türünü kontrol ediyor,
bizim değişkenimiz global tanımlanmalı,
misal sen local bir alanda tanımlasan ve
#ifdef ile kontrol etsen yine tanımlanmış deyip devam edebilir
ama bu şekilde olunca
hata vermemesi için kesinlikle global olarak tanımlanmış olması gerecek.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html