Haberler:

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

Ana Menü

LM35 Uygulama kodlarım doğru mu?

Başlatan ErtAsL, 17 Mayıs 2015, 23:40:05

ErtAsL

Proje ödevi için pic uygulaması aldım. Projem lm35 ile sıcaklık ölçmek, bu sıcaklık değerinin lcd'ye yazdırmak, belli sıcaklık değerlerinde ledleri yakmak ve sıcaklık aralıklarında 2 fanı sırasıyla çalıştırmak. Proteus simu.da vereceğim kodları yazıp simule edince kod gayet güzel çalıştı fakat baskı devrede işler böyle gitmedi. Kodlarımda bir sıkıntı var mı sizce?

#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#define use_portb_lcd TRUE

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define LCD_ENABLE_PIN     PIN_b0      
#define LCD_RS_PIN         PIN_b1      
#define LCD_RW_PIN         PIN_b2      

#define LCD_DATA4    PIN_b4         
#define LCD_DATA5    PIN_b5          
#define LCD_DATA6    PIN_b6        
#define LCD_DATA7    PIN_b7       
#include <lcd.c>

unsigned long int analogiris;
float volt,temp;

void sicaklik_olcumu()
{
      analogiris=read_adc();
      volt=(0.0048823*analogiris)*1000;   // 16 bit 0-1023 arası ölçüm yapar. Max 5V gerilim alındığından 5/1023=0.0048823 mV/bit
      temp=(volt/10)+2;
}

void main ( )
{
   setup_psp(PSP_DISABLED);        
   setup_timer_1(T1_DISABLED);     
   setup_timer_2(T2_DISABLED,0,1); 
   setup_CCP1(CCP_OFF);            
   setup_CCP2(CCP_OFF); 
   
   set_tris_a(0x01);
   
   setup_adc(adc_clock_div_32);
   setup_adc_ports(AN0);
   
   set_tris_d(0x00);
   set_tris_c(0x00);
   output_d(0x00);
   output_c(0x00);
   
   set_adc_channel(0);
   delay_ms(20);
   
   lcd_init ();
   delay_ms(100);
   
   lcd_gotoxy(1,1);
   
   printf(lcd_putc,"\f ERTUGRUL ASLAN");
   
   delay_ms(1000);
   
   lcd_gotoxy(1,1);
   
   printf(lcd_putc,"\n   120205019   ");
   
   delay_ms(1000);
     
   printf(lcd_putc,"\f  PIC PROJE");
   delay_ms(200);
   
    While(1)
   {      
      sicaklik_olcumu();
      
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\n Sicaklik=%f",temp);
      delay_ms(100);
    
      if (temp<25)
   {
      output_toggle(pin_d4);
      output_low(pin_d5);
      delay_ms(100);
      output_low(pin_d6);
      output_low(pin_c4);
      output_low(pin_c2);
   }
      if ((temp>=25) && (temp<40))
   {  
      while ((temp>=20) && (temp<=40))
      {
      output_high(pin_c2);
      output_toggle(pin_d5);
      output_low(pin_d6);
      output_low(pin_c4);
      output_low(pin_d4);
      
      sicaklik_olcumu();
      
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\n Sicaklik=%f",temp);
      delay_ms(100);
      }
   }
      if (temp>=40)
   {
      while (temp>=35)
      {
      output_high(pin_c4);
      output_high(pin_d5);
      output_high(pin_c2);
      output_toggle(pin_d6);
      output_low(pin_d4); 
      
      sicaklik_olcumu();
      
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\n Sicaklik=%f",temp);
      delay_ms(100);
      }
   }
   }
}

vitruvius


baran123

Bir şeyi belirtmek de fayda var.Açıklamada "// 16 bit 0-1023 arası ölçüm yapar" denmiş fakat 16f877a da adc 16 bit değil.
#device ADC=10 satırında 10 bit olarak ayarlanmış.yani 2 üzeri 10 = 1024 adımdır (0-1023) olarak hesaplanır.Bu arada kodlarda problem yok gibi.

vitruvius

Bu arada B portu için #use fast_io kullanmışsınız. Bu durumda B portunun giriş çıkış pinlerini set_tris ile belirlemeniz gerekir.

Recep METE

Baskı devre kurulurken bu tip sıkıntılar çok oluyor.Hele breadboarda kurmak bazen deveye hendek atlatmaktan daha zor.Ben kodlarda bir hata görmüyorum. Baskı devrenin fotolarını paylaşırsan hatalarını söyleyebiliriz.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Tagli

Forumda daha önce birkaç kez daha dile getirmiştim, tekrarlayayım: Ortalıkta sahte LM35'ler var. Öncelikle LM35'e normal beslemesini verip PIC'e falan bağlamadan çıkış voltajını multimetre ile kontrol etmekte fayda var.
Gökçe Tağlıoğlu

ErtAsL

Şemayı paylaşmayı unutmuşum, buyrun:



Kodlarda ben de hata olduğunu düşünmüyorum tabi ufak tefek noktalar gözden kaçmamışsa. Fakat projeyi parçalara ayırıp tek tek deneyeyim dedim yine olmadı. Mesela baskı devredeki 3 ledle sıralı yakma yaptım sıralama yazdığım gibi gitmedi ve bir süre sonra bir ledde takılı kaldı. LCD uygulaması yapayım dedim hiçbir display çıktısı alamadım

ErtAsL

Hala çözebilmiş değilim sorunu. Aynı devrede sadece LED yakıyım diyorum krokodille şasenin (-) neresine deysem farklı şekilde tepki veriyor. Misal led sıralı yanmıyor hepsi yanıyor yada sıralı yanıp donuyor vs. Bir de lcd pinleriyle alakam olmadığı halde lcd'yi takmazsam led'ler çalışmıyor. Tüm pic hevesimi aldı şu proje. Yardımlarınızı bekliyorum

Recep METE

Arkadaşım akşam breadboarda kurup deneyeceğim sonucu sana söylerim.  Ama senin baskı devrende sorun var gibi.  Breadboarda kurup denermisin.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

tekosis

devrenin yüksek çözünürlüklü bir kaç fotoğrafını paylaşmanda fayda var. ayrıca tagli hocanın dediği denemeyi yaptın mı? bu işler sabır meselesi, ilk problemde hevesin kırılmasın olur böyle şeyler.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

vitruvius

Bence sen devrenin pcb çizimini de bir paylaş.

ErtAsL


tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

vitruvius

Evet sorun kart tasarımında. Hatalar mevcut. İşlemcine besleminin gitmediği gibi toprak da gitmiyor. Biraz daha düzenli çizmeye çalış ve bu sefer kartı basmadan önce paylaş ve bakalım.

ErtAsL

Aynı şemayı şu şekilde tekrar çizdim. Olmuş mudur?