2 LM35 2 Interrupt 2 röle ve 1 motor sürme

Başlatan cer, 11 Ocak 2012, 23:49:40

cer

Merhaba, 2 tane LM35'ten veri okumaya çalışıyorum ama 2.sinde sıcaklık arttıkça aldığım gerilim düşüyor. ADC kanalı açtığım portları da giriş olarak ayarladım set_tris'le ama içinden çıkamadım bir türlü. Kodlarımı kontrol eder misiniz? Günlerdir uğraşıyorum içinden çıkamadım.

#include "16F88.h"
#device ADC=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay (clock=8000000)

//#use fast_io(a)    Burada ve bir alt satırda problem olduğunu düşünüyorum. Normalde aktif değil ama aktive edince de garip çıktılar veriyor. 
//#use fast_io(b)
/*#int_ext
void ust_bumper()
   {
    
      output_low(pin_a4);
      output_low(pin_a3);
      output_low(pin_a2);
      
      output_b(0x00);
     
   }*/
   
/*#int_RB
void alt_bumper()
   {
      if(input(pin_b3))
      {
      output_low(pin_a4);
      output_low(pin_a3);
      output_low(pin_a2);
      }
      output_b(0x00);
   }*/


unsigned int32 bilgi_ic, bilgi_dis;

void menfez_ac()
      {
      output_high(pin_b6);
      output_high(pin_b5);
      output_low(pin_b4);
      }
      
void menfez_kapat()
      {
      output_high(pin_b6);
      output_low(pin_b5);
      output_high(pin_b4);
      }
      
      

void main()
{

setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
//set_tris_a(0b00000011);
//set_tris_b(0b00000011);
setup_adc(adc_clock_div_32);
setup_adc_ports(sAN0|sAN1);
/*ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);*/

//Burada PIC çalışmasını görmek için LED yaktırıyorum

output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500);
output_high(pin_b7);


while(TRUE)
{
set_adc_channel(1); //DIŞ SENSÖR OKUNUYOR
delay_us(20);
bilgi_dis=read_adc();
while (bilgi_dis>79)
{
output_high(pin_a7);
//menfez_kapat();
}

while(bilgi_dis<79)
{
set_adc_channel(0); //İÇ SENSÖR OKUNUYOR
delay_us(20);
bilgi_ic=read_adc();
if (bilgi_ic>79)
{
fan1_calis();
fan2_calis();
output_high(pin_a6);
//menfez_ac();
}

else if(bilgi_ic<79 && bilgi_ic>62)
{
fan1_calis();
fan2_kapat();
//menfez_ac();
}

else if(bilgi_ic<62)
{
fan1_kapat();
fan2_kapat();
//menfez_ac();
}
}
}
}



Bir de başka bir devre üzerinde sadece sensörleri ve motoru denemek için aşağıdaki kod var. Tek ADC okuduğum zaman problem yok;

while(TRUE)
{
set_adc_channel(0); //DIŞ SENSÖR OKUNUYOR
delay_us(20);
bilgi_dis=read_adc();

set_adc_channel(1); //İÇ SENSÖR OKUNUYOR
delay_us(20);
bilgi_ic=read_adc();
/*voltaj_dis=(0.0048828125*bilgi_dis)*1000;
sicaklik_dis=(voltaj_dis/10)-8;
if (sicaklik_dis>35)*/
   if (bilgi_dis>79)
   {
   output_high(pin_b6);
   menfez_kapat();
   }
   else
   {
   output_low(pin_b6);   
   motor_durdur();
   }


ama bu şekilde 2 ADC okuduğum zaman problem oluyor.

while(TRUE)
{
set_adc_channel(0); //DIŞ SENSÖR OKUNUYOR
delay_us(20);
bilgi_dis=read_adc();

set_adc_channel(1); //İÇ SENSÖR OKUNUYOR
delay_us(20);
bilgi_ic=read_adc();
/*voltaj_dis=(0.0048828125*bilgi_dis)*1000;
sicaklik_dis=(voltaj_dis/10)-8;
if (sicaklik_dis>35)*/
   if (bilgi_dis>79)
   {
   output_high(pin_b6);
   menfez_kapat();
   }
   else
   {
   output_low(pin_b6);   
   motor_durdur();
   }
   
   while (bilgi_dis<79)
   {
   
   
      if(bilgi_ic>79)
      {
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      }
    }
   }
   }
   else if(bilgi_ic<79 && bilgi_ic>62)
   {
   output_high(pin_b2);
   delay_ms(300);
   output_low(pin_b2);
   delay_ms(300);
   output_high(pin_b2);
   delay_ms(300);
   output_low(pin_b2);
   delay_ms(300);
   }
   else if(bilgi_ic<62)
   {
   output_high(pin_b2);
   delay_ms(100);
   output_low(pin_b2);
   delay_ms(100);
   output_high(pin_b2);
   delay_ms(100);
   output_low(pin_b2);
   delay_ms(100);
   }
   
   }
   
   
   


Şu kısımlarda problem olduğunu düşünüyorum ama kestiremedim ne olduğunu
#include "16F88.h"
#device ADC=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD,NOIESO
#use delay (clock=8000000)
#use fast_io(b)


/*#int_ext
void bumper()
{
if(input(pin_b0))
{
output_low(pin_a4);
output_low(pin_a3);
output_low(pin_a2);
output_high(pin_b2);
}
}*/

/*#int_ad
void ad_interrupt()
{
output_high(pin_b6);
output_low(pin_b6);
}
*/
void menfez_kapat()
{
output_high(pin_a4);
output_high(pin_a3);
output_low(pin_a2);

}

void menfez_ac()
{
output_high(pin_a4);
output_low(pin_a3);
output_high(pin_a2);
}

void motor_durdur()
{
output_low(pin_a4);
output_low(pin_a3);
output_low(pin_a2);
}
unsigned long int bilgi_dis, bilgi_ic;
/*float ,voltaj_dis,sicaklik_ic,sicaklik_dis;*/

void main()
{
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
set_tris_a(0x00000011);
set_tris_b(0x00000000);
output_b(0x00);
setup_adc(adc_clock_div_32);
setup_adc_ports(sAN0|sAN1); //Dış sensör
/*ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);*/
      output_high(pin_b5); 
      delay_ms(500);
      output_low(pin_b5);
      delay_ms(500);
      output_high(pin_b5); 
      
     

cer

Giriş çıkış için trisleri doğru set ediyorum. #use fast_io(x) i iki port için de yazıyorum. Kodlardaki parantezlerin hatalı olmasına bakmayın, copy paste yaparken aktif olmayanları filan kaldırdım ondan dolayı yanlış görünüyor. Normalde olması gerektiği gibi. output_x() komutunu bir yerde kullanmam gerekiyor da kullanmıyor muyum? Ondan mı problem çıkıyor acaba?

justice_for_all

#2
setup_adc_ports(sAN0|sAN1);
referans gerilimlerini ayarlamamissin.

setup_adc_ports(sAN0|sAN1|VSS_VDD);
olcak

fast io dersen portlari giris cikis olarak ayarlamalisin.

AYRICAAA internal osilator secmissin ama osilator ayarini yapmamissin

main kisminin en basina kodu yazman gerek.
setup_oscillator(OSC_8MHZ);
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

cer

Teşekkür ederim hocam, bir deneyeyim. Çalışırsa sana bir yemek ısmarlamak isterim :) Çalışmazsa da ısmarlarım, bir şey daha öğrendim çünkü.

cer

Hocam AN1 'e bağlı sensörün verdiği gerilim ısındıkça düşüyor, soğudukça artıyor hala. Sensörde bir problem olabilir diye AN0'dakine bağlı olan(düzgün çalışan)la yer değiştirdim yine hata verdi. Problemin AN1'in giriş çıkışıyla alakalı olduğunu düşündüm. Bunun için set_trisleri terkrar kontrol ettim, hata yok.  fast_io'da problem olabilir diye onları kaldırdım, yine aynı hatayı veriyor.

Güç verdiğim anda AN1'deki sensör ADC'den bilgi_ic<62 algıladığı için o koşulun altını çalıştırıyor. Bu esnada AN0'daki sensörü ısıtsam bile bilgi_dis>79 olmasına rağmen "if bilgi_ic<62" deki koşulu çalıştııyor. Nasıl bir çözüm uygulamam lazım? Vaktiniz varsa ve yardımcı olursanız sevinirim.

Kodun toparlanmış hali aşağıdaki gibi.

#include "16F88.h"
#device ADC=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD,NOIESO
#use delay (clock=8000000)
#use fast_io(b)
#use fast_io(a)

/*#int_ext
void bumper()
{
if(input(pin_b0))
{
output_low(pin_a4);
output_low(pin_a3);
output_low(pin_a2);
output_high(pin_b2);
}
}*/

/*#int_ad
void ad_interrupt()
{
output_high(pin_b6);
output_low(pin_b6);
}
*/
void menfez_kapat() //drive motor forward
{
output_high(pin_a4);
output_high(pin_a3);
output_low(pin_a2);

}

void menfez_ac() //drive motor backwards
{
output_high(pin_a4);
output_low(pin_a3);
output_high(pin_a2);
}

void motor_durdur()  //stop motor
{
output_low(pin_a4);
output_low(pin_a3);
output_low(pin_a2);
}
unsigned long int bilgi_dis, bilgi_ic;  //data_inside, data_outside
/*float ,voltaj_dis,sicaklik_ic,sicaklik_dis;*/

void main()
{
setup_oscillator(OSC_8MHZ);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
set_tris_a(0x00000011);
set_tris_b(0x00000000);
output_b(0x00);
setup_adc(adc_clock_div_32);
setup_adc_ports(sAN0|sAN1|VSS_VDD); //
/*ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);*/
      output_high(pin_b5); 
      delay_ms(500);
      output_low(pin_b5);
      delay_ms(500);
      output_high(pin_b5); 
      
      
while(TRUE)
{
set_adc_channel(0); //DIŞ SENSÖR OKUNUYOR  //for outside sensor
delay_us(20);
bilgi_dis=read_adc();

   if (bilgi_dis>79)
   {
   output_high(pin_b6);
   menfez_kapat();
   }
   else
   {
   output_low(pin_b6);   
   motor_durdur();
   }
   
   while (bilgi_dis<79)   // if data_out is smaller than 79 look to the inside sensor and do follow
   {
   set_adc_channel(1); //İÇ SENSÖR OKUNUYOR //inside sensor reading
   delay_us(20);
   bilgi_ic=read_adc();
   
      if(bilgi_ic>79)  //if inside sensor data>79 do follow
      {
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      output_high(pin_b2);
      delay_ms(1000);
      output_low(pin_b2);
      delay_ms(1000);
      }
      else if(bilgi_ic<79 && bilgi_ic>62)
      {
      output_high(pin_b2);
      delay_ms(300);
      output_low(pin_b2);
      delay_ms(300);
      output_high(pin_b2);
      delay_ms(300);
      output_low(pin_b2);
      delay_ms(300);
      }
      else if(bilgi_ic<62)
      {
      output_high(pin_b2);
      delay_ms(100);
      output_low(pin_b2);
      delay_ms(100);
      output_high(pin_b2);
      delay_ms(100);
      output_low(pin_b2);
      delay_ms(100);
      }
    }
} //end while
} //end main


Teşekkür ederim.

skara1214

#5
yok  hocam hiçbir şey seçilmezse zaten otomatik vdd-vss yi alıyor referans olarak kristal kullanımıda doğru use delay kullanmıs bende hep öyle kullanıyorum problem  onlardan kaynaklı değil gibi görünüyor.Benim önerim hiç fast io yada set tris kullanma ne geliyorsa onlardan geliyor sen input deyince o otomatik input oluyor zaten.Birde interruptlara priority koy aynı anda olşurlarsa hangisinin önce olması gerektiği gibi v.s.Şimdi
baktımda 16f88.h dosyasına  kanalları tanıtırken (sAN0|sAN1) gibi tanıtabilirsiniz diye birşey yok belkş bu gösterim sekli yanlıştır.ALL_ANALOG deyip denermisiniz?acaba gösterimdenmi kaynaklı problem
Herkes ölür ama herkes gerçekten yaşamaz

cer

skara1214, hocam tris ve fast_io ları kaldırdım, sensörler düzgün çıkış vermeye başladı. Teşekkürler. Şöyle bir problem var şimdi; gücü verir vermez LM35 adc_channel(0)'ın içindeki şartları sağlıyor. adc_channel(1)'in şartlarını sağlayacak şekilde diğer LM35'i ısıtıyorum, şartı sağlamasına rağmen 0. kanalın şartlarından çıkıp 1. kanalın şartlarındaki işlemleri yapmıyor. Ne yapmam gerekiyor? Port sıfırlamam mı lazım?

Not: interruptların aynı anda oluşmalarının imkanı yok hocam, onun için öncelik atamadım. Teşekkür ederim yine de.

necati

#include "16F88.h"
#device ADC=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay (clock=8000000)

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

void menfez_ac   (void);
void menfez_kapat(void);
void fan1_calis  (void);
void fan2_calis  (void);
void fan1_kapat  (void);
void fan2_kapat  (void);

#int_ext
void ust_bumper(){
   
      output_low(pin_a4);
      output_low(pin_a3);
      output_low(pin_a2);
      output_b(0x00); 
   }
   
#int_RB
void alt_bumper(){
      if(input(pin_b3)){
      output_low(pin_a4);
      output_low(pin_a3);
      output_low(pin_a2);
      }
      output_b(0x00);
   }

unsigned int32 bilgi_ic, bilgi_dis;

void menfez_ac(void){
      output_high(pin_b6);
      output_high(pin_b5);
      output_low(pin_b4);
      }
     
void menfez_kapat(void){
      output_high(pin_b6);
      output_low(pin_b5);
      output_high(pin_b4);
      }     
////////////////////////////////////////////////////////////////////////////////
void main(){

setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
set_tris_a(0b00000011);
set_tris_b(0b00000011);
setup_adc(adc_clock_div_32);
setup_adc_ports(sAN0|sAN1);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);

//Burada PIC çalışmasını görmek için LED yaktırıyorum

output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500);
output_high(pin_b7);


while(TRUE)
{
set_adc_channel(1); //DIŞ SENSÖR OKUNUYOR
delay_us(20);
bilgi_dis=read_adc();
while (bilgi_dis>79)
{
output_high(pin_a7);
menfez_kapat();
}

while(bilgi_dis<79)
{
set_adc_channel(0); //İÇ SENSÖR OKUNUYOR
delay_us(20);
bilgi_ic=read_adc();

if (bilgi_ic>79){
fan1_calis();
fan2_calis();
output_high(pin_a6);
menfez_ac();
}

else if(bilgi_ic<79 && bilgi_ic>62)
{
fan1_calis();
fan2_kapat();
menfez_ac();
}

else if(bilgi_ic<62)
{
fan1_kapat();
fan2_kapat();
menfez_ac();
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
void fan1_calis  (void){   }
void fan2_calis  (void){   }
void fan1_kapat  (void){   }
void fan2_kapat  (void){   }
[email]entegreterbiyecisi@yahoo.com[/email]

skara1214

verilen sınır değerleri çok yakın yani 79> 79dan küçük gibi bunları hafif genişletmek gerekşli <80  >79 gibi belki orada bir çakışma olup hep aynı şeyi yapıyordur
Herkes ölür ama herkes gerçekten yaşamaz

cer

Necati fonksiyon değişkenlerini void vapmak nasıl bir değişiklik gösterir? Şimdi deneyemiyorum, bir kaç saat içinde dener sonucu bildiririm. skara doğru söylüyorsun, farketmedim onu, düzelteyim. Hala adc_channel(0) dan çıkmıyor. 1. kanalı da her döngüde okuması için 0. kanalın sonuna bir şey mi yazmalıyım? Yani iç sensörü okurken dış sensördeki değişime tepki vermiyor.

skara1214

lm75 ten bu kadar hızlı veri okuyamassın 0.75 sn de güncelliyordu veriyi heralde 20 us bir  okuduklarının  manası yok gibime geldi
Herkes ölür ama herkes gerçekten yaşamaz

cer

adc_channel(0)'ın içindeki şartlar sağlanıp içinde işlem yapılırken, aynı anda adc_channel(1)'in şartları sağlandığında channel(0)dan çıkıp channel(1)in şartlarını okumasını nasıl sağlarım?

skara1214

timer interruptıyla  yaparsın,her 1 sn de bir bir timer  ayarlarsın ,interruptada channel 1 okuması yaparsın  böylece int mainin içinde chanel 0 ı okursun interruptada chanel biri okursun.
Herkes ölür ama herkes gerçekten yaşamaz

cer

Interrupta girmeden yapmanın yolu yok mudur hocam? Kod sonunda başa döndürerek filan? break; vs. tarzı bir şeyle her döngüde adc_channel(1)'den okumaya başlasa?