butona ilk basıldığında belli bir süre çıkış verilmesi ?

Başlatan hakansefau, 23 Nisan 2012, 18:00:27

hakansefau

Merhabalar bir projem var kısaca bahsedeyim size daha sonra yardımı nerede istediğimi belirteyim size:

Arkadaşlar bir butonum var butona ilk bastığım zaman bir çıkış verecek belli bir süre.

Sonra aynı butona bir kere daha bastığımda bu çıkış kesilecek.

Sonra bir kere daha aynı butona bastığımda başka bir çıkış verecek belli bir süre.

Hatta olayı ben şöyle düşündüm bir bastık sonra birkez daha bastığımızda kestiğin algılamak için bir tane daha çıkış ver bu çıkışı kesmek anlamında.

uğraştığım yazdığım kodu göstereyim size :


#include <16f628a.h>
#use delay(clock=4000000)

#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

unsigned int j=0;

void bekle()      //90 saniye bekleme yakalar
{
      for(j=0;j<=2;j++)
      {
         delay_ms(1000);
      }

}

void main(void)
{
set_tris_a(0x01);                         
set_tris_b(0x00);                         
output_low(PIN_B7);                       
output_low(PIN_B6);                       
output_low(PIN_B5);                       

delay_ms(20);                       

while(TRUE)                       
{
if(input(PIN_A0)==0 )           
{  delay_ms(50);
   if(input(PIN_A0)==1);         
   output_high(PIN_B5);             
   bekle();                         
   output_low(PIN_B5);             
   delay_ms(25);}                   
         if(input(PIN_A0)==0 )           
{        delay_ms(50);
         if(input(PIN_A0)==1);           
         output_high(PIN_B6);             
         delay_ms(50);  }                 
             if(input(PIN_A0)==0)           
               
{              output_low(PIN_B6);
               delay_ms(50);
               if(input(PIN_A0)==1);         
               output_high(PIN_B7);             
               bekle();                         
               output_low(PIN_B7);             
               delay_ms(25);                   
}
}
}

koddaki olay şu ben şimdi butona bastım çıkışı verdim istediğim süre o arada bir kere daha butona bastığımda çıkışı kesmiyor bırakmıyor illaki o sürenin bitmesini beklemek zorunda kalıyorum.

Elimde serdar çiçeğin kitabı var oradan da bakıyorum buradan bir kaç arkadaşada sordum bir türlü sonucu alamadım.

Kullanmak zorunda olduğum işlemci 16f628a ben 877a da yapmaya çalışıp daha sonra buna uyarlıyım dedim ama bir türlü sonuç alamadım.

Şimdiden teşekkür ederim.

MrDarK

yapman gereken şey basit bence, bekle() fonksiyonundaki delay_ms(1000) süresini kısalt 100 yap mesela döngüyü ne kadar zaman istiyorsan j<= değerini ona göre ayarla. O döngü içinde hangi butona basınca sistemi durdurmak istiyorsan o butonun ifli yapısını yaz eğer basılmışsada break; yapıp for döngüsünü süresi dolmadan bitirirsin.
Picproje Eğitim Gönüllüleri ~ MrDarK

hakansefau

öncelikle teşekkür ederim ilginiz için, fakat gene olmadı :'( , hatta dediğinizden sonra aklıma bir şey geldi

butona bastığım kadar bir değişkeni arttırayım sonra o değişken mesela 3ün katları olduğunda diğer çıkışı versin hatta o çıkışı verirken de gene butonu kontrol etsin dedim neyse kodu şu şekle getirdim en son :

#include <16f628a.h>
#use delay(clock=4000000)

#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

unsigned int j=0;
unsigned int s=0;

void bekle()     
{   
   for(j=0;j<=2;j++)
      {
         if(input(PIN_A0)==0 )
            {
            delay_ms(20);
            s++;
               if(input(PIN_A0)==1)
               {
               output_b(0x00);
               break;
               }
            }
      delay_ms(100);
      }
   output_b(0x00);
}

void main(void)
{
set_tris_a(0x01);                         
set_tris_b(0x0F);                                             
output_low(PIN_B6);                       
output_low(PIN_B5);                       
delay_ms(20);                        // 20 msn bekle

while(TRUE)                        // Sonsuz döngü
   {

      if(input(PIN_A0)==0)
      {
      s++;
         if(input(PIN_A0)==1)
            {
            output_high(PIN_B5);
           
            bekle();
            delay_ms(20);           
               if(s%3==0)
               {
               output_high(PIN_B6);
               bekle();             
               }
            }         
      }

   }
}


devreyi nasıl eklerim bilmiyorum fakat zaten siz anlıyosunuzdur beni proteusta simüle ediyorum bağlantıları doğru yapıyorum b5 ve b6 çıkışlarına led ve a0 a buton koyuyorum bastığımızda toprağa çekicek şekilde. Yardımlarınızı bekliyorum tekrar teşekkürler


shark27

çok karışık olmuş başım ağrıdı bakarken :) sornununuzu daha net ve kısa yazarmısınız şu olunca şöle olsun bu olunca böle olsun gibi...

MrDarK

dediğimi doğru anlamışsın tebrik ediyorum :) ama şöyle bir hata var yanlış görüp yanlış anlamadıysam :) Not: Bu arada sahidende programın çok karışık görünüyor CCS'i sırf bu yüzden sevmiyorum :p

Bekle fonksiyonunun içindeki 1000 sayısını düşür demiştim evet düşürmüşsün 100 yapmışsın süper ama orada j koşulun hala j<=2 haliyle sen orada hiçbirşeye basmasan bile 300ms gecikme yapacaksın, elle butona bastığını varsayarsak 300ms'de butona basıp döngüyü kırma ihtimalin hmmm :o bence yok :D

mesela oradaki j<= sayısını 20 yap 2 saniye için bu, 3 saniye için 30 sana kalmış. Bu arada proteus kullanımında yenisin sanırım kodu atarken pic üzerine çift tıklayıp kodu girmişsin oradaki kristal ayarını 1mhz'den 4mhz'e alman gerekir. Ayrıca proteustaki ekran görüntününün print screen'ini al ve buraya at daha kolay yardım alırsın.

Hatırlatma : Umarım devreni kurarken butonun ucunu dirençle +'ya çekmişsindir :) CCS serdar çiçeğin kitabı sayfa 182. resimde görünüyor butonu dirençle +ya çekmek.

Kolay gelsin (:
Picproje Eğitim Gönüllüleri ~ MrDarK

hakansefau

Uğraşıyorum gene ama durumu şöyle anlatayım size.

Arkadaşlar 3 uçlu motorum var bunu sağa ve sola döndüreceğim. Sağa dönerken 90 saniye sola dönerken de 90 saniye dönecek. ve tek bir butonum var.

Butona bir kez bastığımda sağa sonra bir kere daha bastığımda duracak. Sonra bir daha bastığımda sola sonra tekrar basınca duracak. Proje bu.
Bende şimdi bunu butonla çıkış vermek diye söylüyorum ki yardım alayım :D konu kolay olur da hızlı yardım alırım diye:D

kodun sorunlu tarafı motor sağa veya sola dönerken eğer butona basıldıysa durması lazım

hakansefau


serhat1990

Bu işlemi kesme kullanarak yapman daha basit , kesmenin içindede değişken saydır sayısına göre durumlarını belirle ilk basmada örnegin
if(deger==1)delay_ms(10);
if(deger==2)delay_ms(20); vs gibi kesme içinde bir değişken saydır.

hakansefau

kardeşim çok teşekkür ederim "justice_for_all" isimli arkadaş bana yardım etti. simüle ettim sorun yok gibi deniycem pratikte sorun yoksa bitmiş olacak. Ilginiz için tekrar hepinize teşekkür ediyorum

hakansefau

çalışan kod :


#include <16f628a.h>
#use delay(clock=4000000)

//#use FIXED_IO( B_outputs=PIN_B1,PIN_B0 )
#define buton1   PIN_A0
#define led1   PIN_B0
#define led2   PIN_B1

int8 sayac=0,birsaniye=0;
int16 kontrol=0;

#int_RTCC
void  RTCC_isr(void)
{

   set_timer0(0);
   if(++kontrol>=1375)///65.5ms x 1375 =90 saniye
   {
      birsaniye=1;
      kontrol=0;
   }
}



void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);      //65.5 ms overflow
   output_b(0x00);
   output_a(0x01);
   set_tris_b(0x00);
   set_tris_a(0x01);
   disable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      if(!input(buton1))
      {
         while(!input(buton1));
         birsaniye=0;
         if(++sayac==5)
            sayac=1;
         if(sayac%2)
         {
            set_timer0(0);
            kontrol=0;
            enable_interrupts(INT_RTCC);
         }
         else
            disable_interrupts(INT_RTCC);
      }
     
      if(birsaniye)
      {
         birsaniye=0;
         disable_interrupts(INT_RTCC);
         output_b(0x00);
         sayac++;
      }

     
      if(sayac==1 && !birsaniye)
         output_high(led1);
      if(sayac==2)             
         output_low(led1);
      if(sayac==3 && !birsaniye)
         output_high(led2);
       if(sayac==4)             
         output_low(led2);
   }

}



taso

Alıntı yapılan: hakansefau - 24 Nisan 2012, 11:34:50
devre bu şekilde

(Resim gizlendi görmek için tıklayın.)

belki işini kolaylaştırır


//yon=0 sag yon=1 sol
int button,yon;

#define sag pin_a1;
#define sol pin_a2;

#int_ext
void motor_control(){

output_low(sag);
output_low(sol);

button=button^1;

if(button && !yon )
yon=!yon;     output_high(sag);   delay_ms(90000);  output_low(sag); button=0;
}


if(button && yon )
yon=!yon;    output_high(sol);     delay_ms(90000);  output_low(sol);  button=0;
}



}



void main(){

ext_int_edge(H_TO_L); //butonu bırakınca tetikler
enable_interrrupt(int_ext);
enable_interrrupt(globall);

while(1);

}




taso

yukarda yazıdığımda hatalı olan yerler var

su linktekini incelersen sanırım işine yarayacak şekilde düzenlersin :) proteus dosyasını bir calıştır incele derim :)

http://letitbit.net/download/48724.4422560146b2acdb750b3bb1fc31/basit.rar.html