CCS C de Zaman rölesi nasıl yapabilirim???

Başlatan alidede, 07 Haziran 2013, 21:37:23

alidede

Üniversitede sistem analizi için bir projemiz var bu proje için ccs c de 16f877 ile bir zaman rölesi yapmamız lazım.
Olay şundan ibaret;
Devreye bir anahtar bağlıcaz bu anahtar 1 iken süre devrede, 0 iken süre devre dışı olacak. Süre kısmı da şu şekilde;1-180 dk arasından zaman ayarlıcaz ve bu süre sonunda bir motor çalışacak(Röle kontrolü ile). Bu motorun durması için sağ konum butonuna basmamız gerekiyor,
motor durunca tekrar ayarlamış olduğumuz süre devreye girecek ve süre sonunda motor tekrar çalışacak bu sefer sol konum butonuna basınca motor duracak ve tekrar ayarlamış olduğumuz süre devreye girecek ve bu şekilde döngü içinde olacak. Motorun süre kısmını lcd de görerek  artır-azalt ile dışarıdan iki ayrı buton ile yapacağız.
Bu konu hakkında yardımcı olabilir misiniz?


Aşağıdaki programı bir arkadaşımızın yardımı ile yapmıştık motor zamanı kısmını o yapmıştı ama çalışmayan bir aksamı var.
1,2 dk sorunsuz çalışıyor daha sonraki zamanları ayarladığımızda ise süre tutarlı çalışmıyor 3 dk ya ayarlıyoruz 1 dk sonra çalışıyor,
60 dk ya ayarlıyoruz 10 sn sonra çalışıyor gib...
bu sorunu çözemedik.
Projenin tamamında bir kuluçka makinasında lm35 ile sıcaklık kontrolü, direç tipi nem sensörü ile nem kontrolü, motor zamanı ile de iç aksamdaki raf kontrolünü yapıyoruz.

#include <16f877.h>
#device ADC=10
#fuses xt
#use delay(clock=4M)
#include <lcd.c>
#use fast_io(a)

#define sol_konum PIN_A5
#define sag_konum PIN_A4
#define motor PIN_B6
#define buzzer PIN_B7
#define nem_cks PIN_B5
#define isi_cks PIN_B0

#define menu PIN_B1
#define arttir PIN_B2
#define azalt PIN_B3
#define sec PIN_B4

#define motorcevir PIN_A2

int16 deger,deger1,motorsure,motorsay=0,anahtar=0;
int set=0,nemac;
float voltaj,isi,olcum,sicaklik,
      voltaj1,nm,olcum1,nem,isiac;

int motor_sure;
short kur=0,calis=1,bekle;
//////////////////// WRITTEN BY SAPPHIRE  /////////////////////////////////////
void ayarlar()
{
   if(set==0)
   {
   lcd_putc("\f  Ayarlar");
   while(input(menu));
   printf(lcd_putc,"\f*ISI: %5.2fßC\n NEM: %3u%%",isiac,nemac);
      while(1)
      {
         lcd_gotoxy(7,1);
         printf(lcd_putc,"%4.1f",isiac);
         if(input(arttir))
         {
            isiac=isiac+0.1;
            while(input(arttir));
         }
         if(input(azalt))
         {
            isiac=isiac-0.1;
            while(input(azalt));
         }
         if(input(sec))
         {
            set++;
            while(input(sec));
            break;
         }
         if(input(menu))
         {
            while(input(menu));
            goto ileri;
         }
      }
   }

   if(set==1)
   {lcd_gotoxy(1,1);
    lcd_putc(" ");
    lcd_gotoxy(1,2);
    lcd_putc("*");
      while(1)
      {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"%3u",nemac);
         if(input(arttir))
         {
            nemac=nemac+1;
            while(input(arttir));
         }
         if(input(azalt))
         {
            nemac=nemac-1;
            while(input(azalt));
         }
         if(input(sec))
         {
            set++;
            while(input(sec));
            break;
         }
         if(input(menu))
         {
            while(input(menu));
            goto ileri;
         }
      }
   }

   if(set==2)
   {
   lcd_putc("\fMotor Suresi\n");
      while(1)
      {
         lcd_gotoxy(1,2);
         printf(lcd_putc,"  %3u dk.",motor_sure);
         if(input(arttir))
         {
            motor_sure=motor_sure+1;
            while(input(arttir));
         }
         if(input(azalt))
         {
            motor_sure=motor_sure-1;
            while(input(azalt));
         }
         if(input(menu))
         {
            while(input(menu));
            goto ileri;
         }
      }
   }

  ileri:
    write_eeprom(1,nemac);
    write_eeprom(2,motor_sure);
    motorsure=motor_sure*124;
    set=0;
}


void isi_olcumu()
{  int z,t;
   set_adc_channel(0);
   delay_us(20);
   sicaklik=0;
   for(t=0;t<1;t++)
   {
      olcum=0;
      for(z=0;z<=99;z++)
      {
      deger=read_adc();
      delay_us(5);
      voltaj=(0.00486803*deger)*1000;
      isi=(voltaj/10)+1.3;
      delay_us(100);
      olcum=olcum+isi;
      }
      sicaklik=(olcum/100);
   }
   if(sicaklik<isiac)
   {
      output_high(isi_cks);
   }
   else if(sicaklik>=isiac)
   {
      output_low(isi_cks);
   }
}


void nem_olcumu()
{  int a,b;
   set_adc_channel(1);
   delay_us(20);
   nem=0;
   for(a=0;a<1;a++)
   {
      olcum1=0;
      for(b=0;b<=99;b++)
      {
      deger1=read_adc();
      delay_us(5);
      voltaj1=(0.098*deger1);
      nm=voltaj1;///10);

      delay_us(100);
      olcum1=olcum1+nm;
      }
      nem=(olcum1/100);
   }
   if(nem<nemac)
   {
      output_high(nem_cks);
   }
   else if(nem>=nemac)
   {
      output_low(nem_cks);
   }
}


void motor_donme()
{calis=1;
motorsay=0;
   while(calis)
   {
   output_high(motor);
   output_high(buzzer);
   if(bekle==0)
   {
   while(!input(sol_konum));
   if(input(sol_konum))
   {
      output_low(motor);
      output_low(buzzer);
      calis=0;
   }
   }
   if(bekle==1)
   {
   while(!input(sag_konum));
   if(input(sag_konum))
   {
      output_low(motor);
      output_low(buzzer);
      calis=0;
   }
   }
   }
   bekle=~bekle;
}
//////////////////// WRITTEN BY SAPPHIRE  /////////////////////////////////////
void main()
{
   isiac=36.5;
   nemac=read_eeprom(1);
   motor_sure=read_eeprom(2);
   motorsure=motor_sure*124;
   set_tris_a(0x3F);
   setup_adc(adc_clock_div_32);
   setup_adc_ports(AN0_AN1_AN3);

   lcd_init();
   lcd_putc("\f VATAN KULUCKA");
   delay_ms(500);
   while(1)
   {
      isi_olcumu();
      nem_olcumu();
      printf(lcd_putc,"\fISI: %5.2fßC\nNEM: %3.0f%%",sicaklik,nem);
      if(input(menu))
         ayarlar();

      set_adc_channel(3);
      delay_us(20);
      anahtar=read_adc();
      if(anahtar>=512)
      {
         if(kur==0)
         {   motor_donme();   kur=1;   }
         motorsay=motorsay+1;
         if(motorsay-1>=motorsure)
         {   motor_donme();     }
      }
      else
      {
         motorsay=0;
         kur=0;
      }

      if(input(motorcevir))
      {
         output_high(motor);
         output_high(buzzer);
         while(input(motorcevir));
         output_low(motor);
         output_low(buzzer);
         motorsay=0;
      }
   }
}

LÜTFEN YARDIM EDİN...

pwm.c

Bence daha kararlı zamnalama için Timer0 kesmesini kullan derim.
şu sitede birisine örnek uygulama hazırlamıştım. 12 saat süreli bir yemleme sistemi. bunun kodlarını incelersen olayı kavrayabilirsin.
http://elektronikprojeler.com/index.php/topic,4001.msg17486.html#msg17486

diğer türlü ise RTC kullan diyeceğim ama bunun ayarları ve donanımı kısa süreli bir zamnlayıcı için gereksiz olur. o nedenle kesme yöntemi işini görür. eğer yinede RTC düşünürsen yardımcı oluruz elbette.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-