süre ayarlı çıkış on-off

Başlatan gokhangokcen, 06 Şubat 2016, 10:46:49

gokhangokcen

cümleten merhabalar,

üstadlar kafam durma noktasına geldi epeyce aynı iş üzerinde yoğunlaşınca herkeste bazen oluyordur.Sizlere danışmak istedim.

yapmak istediğim 7 tane çıkışımız var. lcd menü üzerinden çıkışların açık ve kapalı kalma süreleri giriliyor.eepromda saklanıyor.Açık kalma süreleri 7 çıkış içinde farklı kapalı kalma süreleri ortak.Buraya kadar sıkıntı yok bunları lcd menü ile kullanıcıdan değerleri alıp kayıt ediyorum.İşlemci üzerine timer kurup dakika ve saniye bazlı işlemde de sıkıntı yok. Fakat nasıl kıyaslayıpta bu süre içinde açık kal ya da kapalı kal diyebilirim?

muhtemelen program gereksiz bir sürü satır ile dolmuştur. Ama kıyasladığım nokta hemen main altındaki if(sn==59)... diye başlayan blok.Buraya nasıl bir algoritma kurayım ki süre bazında açılsın kapalı kalma süresi bazında kapalı kalsın. Sonsuz döngü şeklinde devam edecek. Girilen süre kadar çıkış aktif olacak.Girilen süre kadar o çıkış kapalı kalacak.

#include <16F648A.h>
#FUSES INTRC_IO, PUT, NOMCLR, BROWNOUT, NOLVP, NOCPD, PROTECT, NOWDT
#use delay(internal=4MHz)

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



#include <flex_lcd.c>
#define ONE_WIRE_PIN PIN_A1
#define dta   PIN_A6
#define en  PIN_A7
#define clk PIN_A0
#define asagi PIN_A2
#define yukari PIN_A3
#define esc PIN_A5
#define enter PIN_A4




float termo=0;
int hataa=0,mask,role=0,c=0,x=0,f=0;
int8 i=0,menu=0,menu_say=0,set_m=0,m_sn=0,sn=0,dkk=0;
unsigned int degerler[10],k,sureler[10],z=0;



#int_timer0  // Timer0 kesmesi
void  timer0_kesme ()   // Kesme fonksiyonu ismi
{
    set_timer0(60);   // TMR0 değeri belirleniyor
    i++;   // i değeri 1 arttırılıyor   
    if (i==16)  // i değeri X'ye eşitse 
       {
          sn++;
          m_sn++;
          i=0;
       }
       else if (sn>59){dkk++;sn=0;}
       else if (dkk>59){dkk=0;}
}


//........DS18B20.LIB.......//       
void onewire_reset() 
   {
   output_low(ONE_WIRE_PIN);
   delay_us( 500 ); 
   output_float(ONE_WIRE_PIN); 
   delay_us( 500 );
   output_float(ONE_WIRE_PIN);
   } 

void onewire_write(int data)
   {
   int count;
   for (count=0; count<8; ++count)
   {
   output_low(ONE_WIRE_PIN);
   delay_us( 2 ); 
   output_bit(ONE_WIRE_PIN, shift_right(&data,1,0));
   delay_us( 60 ); 
   output_float(ONE_WIRE_PIN);
   delay_us( 2 ); 
   }
   } 

int onewire_read()
   {
   int count, data;
   for (count=0; count<8; ++count)
   {
   output_low(ONE_WIRE_PIN);
   delay_us( 2 ); 
   output_float(ONE_WIRE_PIN);
   delay_us( 8 );
   shift_right(&data,1,input(ONE_WIRE_PIN));
   delay_us( 120 );
   }
   return( data );
   } 

float ds1820_read()
   {
   int8 busy=0, temp1, temp2;
   signed int16 temp3;
   float result;
   onewire_reset();
   onewire_write(0xCC);
   onewire_write(0x44);
   while (busy == 0)
   {busy = onewire_read();}
   onewire_reset();
   onewire_write(0xCC);
   onewire_write(0xBE);
   temp1 = onewire_read();
   temp2 = onewire_read();
   temp3 = make16(temp2, temp1);
   result = (float) temp3 / 16.0;
   return(result);
   }  
//..........................// 
       
void ds_kontrol()
   {
   output_low(ONE_WIRE_PIN);
   delay_us(500);
   input(ONE_WIRE_PIN);
   delay_us(100);
   if(input(ONE_WIRE_PIN))
   {hataa=1;}
   else
   {hataa=0;}
   }
   
void eprom_oku()
{
for (k=0;k<9;k++)
{
degerler[k]=read_eeprom(k);
}
if(degerler[9]!=0x07)
{
degerler[9]=0x07;

for (k=0;k<9;k++)
{
degerler[k]=0x00;
write_eeprom(k,degerler[k]);
delay_ms(10);
}


}
}   
   
void kayan_yazi()
{
for(x=16;x>1;x--)
{
lcd_gotoxy(x,1);
lcd_putc("Mevlut Ozyoruk  ");
delay_ms(250);
}
}

void role_aktar()
{
mask=0x80;
for(f=0;f<8;f++)
{
if (mask &role) 
{output_high(dta);}
Else { output_low(dta);}
output_high(clk);
delay_ms(1);
output_low(clk);
mask=mask>>1;
}
output_high(en);
delay_us(100);
output_low(en);
}


void lcd_bilgi()
{
ds_kontrol();
    if(hataa==0)
     {
            termo = ds1820_read();
               lcd_gotoxy(1,2);
            printf(lcd_putc,"    %3.1f%cC       ",termo,223);
     }else  
          {
            lcd_gotoxy(1,2);
               lcd_putc("   Sensor Yok!");//sensör hatasını göster               
          }
}
   

void main()
{
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
   set_timer0(60);   // TMR0 değeri belirleniyor
   enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
   enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver
   setup_comparator(NC_NC_NC_NC);
  // set_tris_a(0x3E);
  //  set_tris_b(0x00);
   output_high(pin_b0);
   eprom_oku();
   role=0;
   role_aktar();
   lcd_init();
   kayan_yazi();
   delay_ms(3000);




   termo = ds1820_read();
   
   while(TRUE)
   {
   
   if(sn==59)
   {
   for(k=0;k<6;k++)
   {
   if(sureler[k]!=degerler[k]){sureler[k]++;}
   }
   while(sn==59);
   
if(sureler[0]!=degerler[0]){role=role&0x01;}else {role=role&11111110;}
if(sureler[1]!=degerler[1]){role=role&0x02;}else {role=role&11111101;}
if(sureler[2]!=degerler[2]){role=role&0x04;}else {role=role&11111011;}
if(sureler[3]!=degerler[3]){role=role&0x08;}else {role=role&11110111;}
if(sureler[4]!=degerler[4]){role=role&0x10;}else {role=role&11101111;}
if(sureler[5]!=degerler[5]){role=role&0x20;}else {role=role&11011111;}
if(sureler[6]!=degerler[6]){role=role&0x40;}else {role=role&10111111;}
role_aktar();
   }
   
   
   
   
   if (menu==0)
   {
   c++;
   delay_ms(10);
   if(c==25)
   {
   lcd_gotoxy(1,1);
   lcd_putc(" Ortam sicaklik");   
   lcd_bilgi ();
   c=0;
   }
   }
    
          
//***********************************************
  if (!input(ENTER)&&(menu==0))
   {
   lcd_putc("\f");
   menu=1;
   menu_say=0;
   m_sn=0;
   }
  
  if ((menu>0)&&(set_m==0))
  {
     
   switch(menu_say)
         {
            case 0:
               lcd_gotoxy(1,1);
               lcd_putc(">1.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(" 2.CIKIS        ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;
            case 1:
               lcd_gotoxy(1,1);
               lcd_putc(" 1.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(">2.CIKIS        ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;
            case 2:
               lcd_gotoxy(1,1);
               lcd_putc(">3.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(" 4.CIKIS        ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;
            case 3:
               lcd_gotoxy(1,1);
               lcd_putc(" 3.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(">4.CIKIS        ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;
            case 4:
               lcd_gotoxy(1,1);
               lcd_putc(">5.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(" 6.CIKIS        ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;
            case 5:
               lcd_gotoxy(1,1);
               lcd_putc(" 5.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(">6.CIKIS        ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;  
            case 6:
               lcd_gotoxy(1,1);
               lcd_putc(" 6.CIKIS        ");
               lcd_gotoxy(1,2);
               lcd_putc(">KAPANMA SURESI ");
               if (!input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;lcd_putc("\f");} //set menüye git
               break;                   
        
         }
       
               
         if(!input(ASAGI)&&(menu_say<6))
         {
             while(!input(ASAGI));
             ++menu_say;
             //if(menu_say==5)
              // menu_say=0;
               }
          else if(!input(YUKARI)&&(menu_say>0))     
               {
             while(!input(YUKARI));
             --menu_say;
             //if(menu_say==0)
             //  menu_say=0;
               }
           
           
      if (!input(Esc)&&(menu==1)&&(m_sn>1))
      {
      lcd_putc("\f");
       menu=0;
         }
   
      } 
      
      if ((menu>0)&&(set_m==1))
  {
     
   switch(menu_say)
         {
            case 0:
               lcd_gotoxy(1,1);
               lcd_putc("1.CALISMA SURESI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[1]);
               if(!input(ENTER)) {write_eeprom (0,degerler[1]);delay_ms(100);} 
              if(!input(ASAGI)&&(degerler[1]>0))
              {
              while(!input(ASAGI));
              --degerler[1];
               }
             else if(!input(YUKARI)&&(degerler[1]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[1];
               }
               
               break;
               
            case 1:
               lcd_gotoxy(1,1);
               lcd_putc("2.CALISMA SURESI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[2]);
               if(!input(ENTER)) {write_eeprom (1,degerler[2]);delay_ms(100);}
                if(!input(ASAGI)&&(degerler[2]>0))
              {
              while(!input(ASAGI));
              --degerler[2];
               }
             else if(!input(YUKARI)&&(degerler[2]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[2];
               }
               break;
            case 2:
               lcd_gotoxy(1,1);
               lcd_putc("3.CALISMA SURESI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[3]);
               if(!input(ENTER)) {write_eeprom (2,degerler[3]);delay_ms(100);}
                if(!input(ASAGI)&&(degerler[3]>0))
              {
              while(!input(ASAGI));
              --degerler[3];
               }
             else if(!input(YUKARI)&&(degerler[3]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[3];
               }
               break;
            case 3:
               lcd_gotoxy(1,1);
               lcd_putc("4.CALISMA SURESI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[4]);
               if(!input(ENTER)) {write_eeprom (3,degerler[4]);delay_ms(100);}
                if(!input(ASAGI)&&(degerler[4]>0))
              {
              while(!input(ASAGI));
              --degerler[4];
               }
             else if(!input(YUKARI)&&(degerler[4]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[4];
               }
               break;
               case 4:
               lcd_gotoxy(1,1);
               lcd_putc("5.CALISMA SURESI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[5]);
               if(!input(ENTER)) {write_eeprom (4,degerler[5]);delay_ms(100);}
                if(!input(ASAGI)&&(degerler[5]>0))
              {
              while(!input(ASAGI));
              --degerler[5];
               }
             else if(!input(YUKARI)&&(degerler[5]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[5];
               }
               break;
                case 5:
               lcd_gotoxy(1,1);
               lcd_putc("6.CALISMA SURESI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[6]);
               if(!input(ENTER)) {write_eeprom (5,degerler[6]);delay_ms(100);}
                if(!input(ASAGI)&&(degerler[6]>0))
              {
              while(!input(ASAGI));
              --degerler[6];
               }
             else if(!input(YUKARI)&&(degerler[6]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[6];
               }
               break;
               case 6:
               lcd_gotoxy(1,1);
               lcd_putc("KAPANMA SURESI ");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2d dk",degerler[7]);
               if(!input(ENTER)) {write_eeprom (6,degerler[7]);delay_ms(100);}
                if(!input(ASAGI)&&(degerler[7]>0))
              {
              while(!input(ASAGI));
              --degerler[7];
               }
             else if(!input(YUKARI)&&(degerler[7]<=59))     
               {
             while(!input(YUKARI));
             ++degerler[7];
               }
               break;               
               }               
            if ((!input(ESC))&&(m_sn>0)) {set_m=0;m_sn=0; }
           


//////////****************************
}
}
}
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

ete

#1
Bu tür işlerde kullandığım bir yöntemim var.
C dili ile aram pek iyi olmadığı için genel anlamda anlatmaya çalışacağım.

Sistem nasıl başlıyor bilemiyorum ama mantığımız şöyle olmalı.
Elimizde 7 adet ACIK süresi ki bunu 7 adet dizi değişkenine yerleştirmeliyiz. Buna ACIK[X] şeklinde kullanacağız ve X burada çıkışı temsil eden bit sayısı olacak.

Elimizde yine 7 adet KAPALI süremiz var bunuda KAPALI[X] şeklinde kullanacağız.
Birde hangi bitin açık hangi bitin kapalı olduğunun kaydını tutmak için DURUM şeklinde bir BYTE değişkeni kullanacağız.
DURUM değişkeninin ilk 7 biti biz çıkışların durumunu verecek ve 1 olanlar açık 0 olanlar ise kapalı anlamına gelecek.
Başlangıçta ;
ACIK[0]=10 (örnek olarak 10 dak yazdım neyse onu vereceksin
KAPALI[0]=5 (örnek olarak 5 verdim sen ne gerekiyorsa verirsin.
ACIK[1]=11:KAPALI[1]=6
ACIK[2]=12:KAPALI[2]=7
ACIK[3]=13:KAPALI[3]=8
ACIK[4]=14:KAPALI[4]=9
ACIK[5]=15:KAPALI[5]=10
ACIK[6]=16:KAPALI[6]=11

Böylece değişkenlerimize değerlerini yerleştirmiş olduk. Şimdi Durum değişkeninin bitlerini SET ederek çıkışları aktif ediyoruz
DURUM=%01111111 :PORTX=DURUM denilince o porta ait bitlerde çıkış konumuna geleceklerdir.
Hemen anlayacağınız gibi DURUM bitlerinin 7 tanesini AÇIK olarak ayarlamış oldu.
Bu aşamada 7 tane de CIKIS[7] şeklinde değişken tanımlıyoruz.
İlk açılışta çıkışları açtığımız için Açık kalma sürelerini CIKIS isimli değişkene eşitliyoruz.
FOR I=0 to 6
  CIKIS[I]=ACIK[I]
Next

Şimdi işin kontrol kısmına bakalım.
Ben kontrol işini dakika bazında yaptım ve yukarıdaki süre değişken değerlerinide dakika cinsinden aldım. Sen gerekirse sn cisniden de yapabilirsin.
Programda her dakika değiştiğin de aşağıdaki kodu çalıştırman gerekiyor.
FOR I=0 to 6
  CIKIS[I]=CIKIS[I]-1
  IF DURUM.0[I]=1 then 'şayet I biti ÇIKIŞ ise     
     IF CIKIS[I]=255 THEN 'sürenin sonuna gelinmiş ise
       TOGGLE DURUM.0[I]  'Durum değişkeninin I biti konum değiştirerek CIKIS kapandı
       CIKIS[I]=KAPALI[I]   'yeni çıkış süre değeri KAPALI süresi oldu
     ENDIF
  ELSE
     IF CIKIS[I]=255 THEN  'şayet I bitine karşılık gelen bit kapalı olan bit ise ve süre dolmuş ise
       TOGGLE DURUM.0[I]  'çıkışı aç 
       CIKIS[I]=ACIK[I]  'cıkıs açıldı ve yeni süre değeri olarak açık kalma süresi verildi
     endIF
  ENDIF
NEXT            
PORTX=DURUM verilerek çıkışlar son duruma ayarlandı.


Bu komutları C diline çevirebilirsen istediğin olur sanırım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

dursuncemal

acma kapama durekli mi olacak her yoksa komut ile mi   (boton vs) birde minimum  maximum acma veya kapama sureleri?
:=

gokhangokcen

Açma kapama süre zarfında sürekli devam edecek kesintisiz süre kadar çalışacak süre kadar duracak
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

dursuncemal

#4
minimum acma kapama ne kadar?
:=

gokhangokcen

Min 1 dk max 60dk olacak programda da görünüyor zaten
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

dursuncemal

#6
unsigned char acik1,kapali1;

acik1 = aciksure[0];
kapali1 = kapalisure[0];


if(acik1){acik1--; ilgiliport = 1;} else{ if(kapali1){kapali1--; ilgiliport = 0; }else{ kapali1 = kapalisure[0];    acik1 = aciksure[0];   }          }

parantezlerde sikinti olabilir mantik olarak yazdim.

:=