Butona bastıktan sonra başka görev nasıl yaptırabilirim?

Başlatan protezdiyot, 28 Ekim 2013, 22:45:53

protezdiyot

Merhaba,
şöyle bir sorum var.;
Bir butona bastım ve 5 led sırayla durmadan yanıyor ve sönüyor sonra herhangi bir anda 2. bir butona bastığımda basarbasmaz  başka bir ledi yakmak istiyorum.Bunu kesme ile yaptığımızı zannediyordum.Ama kesmede,bir program bitmeden diğerine geçmiyor.Nasıl yapabilirim?

RaMu

Hangi dil derleyici md. vs. ?
Sen bir örnek yaz bakalım.

Mantık şu;

Misal 16f877 RB0 kesmesi burası olsun
Interrupt bilmemne
>diğer led yansın  (misal ccsc de output_high(pin_c0);   // burada toggleda yaptırılabilir
interrupt sonu


buradada asıl program var;
5led butonunu kontrol et,
basıldıysa ledleri sırayla yak vs.     //butona tekrar basılırsa işlemi sonlandırda yapılabilir


Yani kesme rutini içinde bir pine bağlı ledi yakabilirsin sıkıntı yoktur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

protezdiyot

Pic css ile yazacağım.Basit olarak ;
b0 a bastım a0 ledi yansın.b1 e bastım,a0 sönsün a1 yansın.

selimkoc

RB0 kesmesi ile rahatlıkla yapabilirsin. Ana program çalışırken kesme oluştuğunda mikrodenetleyici derhal kaldığı yeri kaydedip kesme alt programına dallanır. Oradaki işini bitirdikten sonra ana programda kaldığı yerden devam eder.

daha teferruatlı bilgi için :

http://elektrokod.wordpress.com/2013/10/12/portb-change-interrupt-portb-degisim-kesmesi/

protezdiyot

Teşekkür ederim.Birşey  soracağım.RBIF bayrağı tam olarak ne yapıyor?Birde kesme yaptığım an diğer işlemlerin sonlanmasını ve en baştan başlamasını istiyorum.Pic css ile nasıl yapacağım konusunda sıkıntım var.Serdar çiçeğin kitabında birşey göremedim kon ile alakalı

mustafa_cmbz

Alıntı yapılan: protezdiyot - 28 Ekim 2013, 22:45:53
Merhaba,
şöyle bir sorum var.;
Bir butona bastım ve 5 led sırayla durmadan yanıyor ve sönüyor sonra herhangi bir anda 2. bir butona bastığımda basarbasmaz  başka bir ledi yakmak istiyorum.Bunu kesme ile yaptığımızı zannediyordum.Ama kesmede,bir program bitmeden diğerine geçmiyor.Nasıl yapabilirim?

kesmelere kalmadan iyi bir hesap kitap yaparsanız for next döngüleri ile de yapılabilir gibi duruyor şayet yanlış anlamadı isem.

RaMu

RBIF zaten demişsin bayrak,
serdar hoca kitapta 16f877 yi anlatıyor
16f877de portb nin sıfırıncı biti 33 nolu bacak
artık harici kesme nasıl kurulduysa
ya bu pin 0 dan 1 e yada 1 den 0 a geçerken kesme oluşturur
kesme oluşunca programda rb0 interrupt rutinine girilir,
kesme oluşunca RBIF harici kesme bayrağı set (1, high) olur
istenirse kesme rutini oluşturmadan
program içindede RBIF kontrol edilerek kesme oluşmuşmu anlaşılabilir,
bu bayrak kendiliğinde silinmez o yüzden kesme işlemi olmuş diye baktıktan sonra
RBIF bayrağı silinmelidir.

Diğer işlemlerin sonlanmasını istiyorum..... demişsin
bunu yapmanın birkaç yolu var,
kesme rutini yazdıysan
kesme rutini içine girilirse misal bir değişkeni set edersin
normal programdada bu değişkeni kontrol edersin
eğer bu değişken set olmuşsa
programı ledleri söndürecek veya başlangıç konumuna gidecek şekilde yazarsın
yani ne istiyorsan yaparsın,
kesme rutini yazmadıysan zaten rbif yi kullanırsın değişkende tanımlamazsın yine aynı işlemi yapabilirsin.
Bunların örneğini görmek iyi olur ama ne yaptırmak istediğini kendi yöntemlerinle çözersin aslında
yani kitap bunu vermek zorunda değildir hoş buda yine görülen örneklerden kazınılan tecrübeyle olur birazda, birazda yetenek.


Şimdi senin dediğin işi zaten kesmeyle yapmaya gerekde yok aslında,
kağıt üzerinde bunu yapan diagramı yazarsan while dı if di vs. di kullanarak program haline daha kolay getirebilirsin zaten.

Diyorsunki
b0 a bastım a0 ledi yansın.b1 e bastım,a0 sönsün a1 yansın.


buton kontrol nasıl yapılır kitapda var,
led nasıl yakılır kitapda var,
butona basılınca led nasıl yakılır-söndürülür kitapda var
e bunları birlerştirmekte biraz sana kalmış,
dediğim gibi sen birşeyler yaz, kodunu şemanı paylaş
biz elimizden geldiğince yardımcı olmaya çalışalım,
yoksa dediğini ben yazıp koysam önüne ne işine yarayacak?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

protezdiyot

Bir proje veya uygulama yapmıyorum.Öncelikle bunu söyleyeyim.Tek amacım var ,pic'i öğrenmek.Onun için algılayamadığım noktaları soruyorum.

Aşağıda yazdığım kodda,pic e enerji verinde RA da olan ledler sırayla 1 kez yanarken ben rb0 a basınca hiçbirşey olmuyor.Basılı tutunca,tüm ledler söndükten sonra 2 defa ra1 deki led yanıp sönüyor.
Benim amacım ise rb0 a basarmasmaz tüm işlemlerin sonlanıp,RA0 daki ledin yanması.
isis devresi
http://s3.dosya.tc/server12/RkpMYG/led.rar.html

#include "C:\Users\Fujitsu\Desktop\pik\projeler\kesme.h"
#use fast_io(b)
#int_ext
void ext_kesmesi()
{

if (input(pin_b0))
{
output_high(pin_a1);
delay_ms(200);
output_low(pin_a1);
delay_ms(200);
output_high(pin_a1);
delay_ms(200);
output_low(pin_a1);
delay_ms(200);

}
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   

output_high(pin_a2);
delay_ms(100);
output_low(pin_a2);
delay_ms(100);
output_high(pin_a3);
delay_ms(100);
output_low(pin_a3);
delay_ms(100);
output_high(pin_a5);
delay_ms(100);
output_low(pin_a5);
delay_ms(100);

set_tris_b(0x01);
output_b(0x00);
   ext_int_edge(h_to_l);
   enable_interrupts(int_ext);
   enable_interrupts(global);
while(1);
}

protezdiyot

Şu sistem üzerinden açıklayayım.Daha iyi olacak.
Ben bu rb kesmelerinde 1. butona bastım,led yansın.Sonra led yanarken 2. butona bastığımda 2.  led yansın.Ama bu işlem benim istediğim gibi olmuyor.Döngü bittikten sonra butona basınca ,butonu algılayıp işlemi yapıyor.Döngü tamamlanmadan butonu algılamıyor.

isis dosyası

http://www.dosya.tc/server18/2CSfpa/rb0_kesmesi.rar.html


#include "C:\Users\Fujitsu\Desktop\pik\projeler\rbo kesmesi.h"
#use fast_io(b)
#int_rb
void b_degisiklik()
{if (input(pin_b4))
output_high(pin_b0);
if (input(pin_b5))
output_high(pin_b1);
if (input(pin_b6))
output_high(pin_b2);
if (input(pin_b7))
output_high(pin_b3);
delay_ms(2000);
output_b(0x00);
}
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   set_tris_b(0xf0);
   output_b(0x00);
  
   enable_interrupts(int_rb);
   enable_interrupts(global);
   while(1);

}

erpay

Programı multitask mantığına göre yaparsan kesmeye ihtiyaç duymadan butonların basılıp basılmadığını kontrol edebilirsi. Mesela ilk buton basılırsa bir bayrak aç ledlerde bu bayrağa göre yansın bu şekilde döngüye ihtiyaç duymadan sadece birer durak gibi davransınlar.

RaMu

#int_ext
void ext_kesmesi()
{

if (input(pin_b0))
{
output_high(pin_a1);
delay_ms(200);
output_low(pin_a1);
delay_ms(200);
output_high(pin_a1);
delay_ms(200);
output_low(pin_a1);
delay_ms(200);

}
}



burada if (input(pin_b0)) denmez
zaten şurada
   ext_int_edge(h_to_l);
   enable_interrupts(int_ext);
   enable_interrupts(global);

(ayrıca bu 3 satırda TODO USER CODE yazan satırın üstünde olsamalıdır)

sırayla hesbir satırda
harici kesme high dan low a düşerken (yani RB0 pini 1 den sıfıra 5V dan 0 V a gibi düşerken) olacak
harici kesmeye izin ver (aç)
tüm kesmelere izin ver (aç)
diyorsun bu nedenle artık RB0 pini ne durumda diye kontrol etmezsin
zaten rb0 pinindeki değişim neticesinde kesme oluşur ve program
artık  #int_ext nereye yazılıysa oraya gider, oradaki kodları işlemeye başlar.


Ben şu anda dahi program yazarken sıralı yazarım programı
yani lcd saat entegresi sıcaklık entegresi led vs kulllanacağım bir kod yazıyorsam
tek tek led lcd saaat sıcaklık entegreleri vs. için kodu yazar denerim hepsini adım adım bir çalıştırırım
sonra birbirlerine eklemeye başlarım
bu sayede nerede hangiadımda problem var daha kolay çözülür.

Sen önce sadece led yakan bir kod yaz
sonra bir butona basılınca ledi yakan program yaz
sonra bir butona basınca yakan
diğer butona basınca söndüren
sonra tek butonla ilk basışta yakan sonraki basışta söndüren
sonra iki ledi 2 butonla 4 butonla aynı şekilde yukarıdaki adımlardaki gibi yak söndür olayları,
daha sonra atraksyonlara gir bence daha kolay çözersin işi,
kesme işinide tek başına ele al
kesme olunca sadece bir ledi sadece yakan program yaz,
sonra ilk kesmede yakan ikinci kesmede söndüren gibi devam et.
Sonra led yakma söndürmeyi başka hangi mantıklarla yapabilirim diye düşün,
misal c0 da bir buton var, bu butona ilk basıldığında d0 daki led yanacak
birdaha basılırsa sönecek, birdaha basılırsa yanacak, birdaha basılırsa sönecek böyle devam edecek
yani led toogle uygulaması,
sen bunu yaptın diyelim,
sonra şunuda ekleyeceksin üstüne
c0 butonuna basıldımı
evet o zaman d0 daki ledi toggle yap
değişken0 ı toggle yap

şimdi bu program parçasına şunuda ekleyebilirsin
eğer d0 ledi yanıyorsa ve c1 butonunada basılırsa d1 ledini yak

if(  degisken_0  &   input(pin_c1)  )    //eğer d0 ledi yanıyorsa değişken0 = 1 durumundadır
{
output_high(pin_d1);
delay_ms(100);
}













Ayrıca
misal A ve B butonları olsun
A butonuna basılırsa ve B butonunada basılırsa
(ikisine beraber basılmak zorunda değil şartı ile)
L ledini yakan program nası olabilir;

A butonuna basıldımı?
Evet basıldı > değişkenA = 1 yap
hayır basılmadı > tekrar kontrol etmeye git

değişkenA = 1 mi ve B butonuna basıldımı?
Evet basıldı > L ledini yak ve
                      değişkenA = 0 yap (birdaha kontrol ettiğimizde işe yarayacak)

bu kadar, şimdi bunu koda dönüştürebilirsin rahatlıkla önemli olan mantığı kurmak

while(1)
{

if  (   input(pin_A0);                               //A butonuna basıldımı?
{
  degisken_A=1;                                   //Evet basıldı > değişkenA = 1 yap
  delay_ms(100);
  }
//hayır basılmadı > tekrar kontrol etmeye git

     if  (degisken_A  &  input(pin_b0)   )      //değişkenA = 1 mi ve B butonuna basıldımı?
    {
     output_high(pin_d0);                         //Evet basıldı > L ledini yak ve
     degisken_A=0;                                   //değişkenA = 0 yap (birdaha kontrol ettiğimizde işe yarayacak)
     delay_ms(100);
     }

}


//burada butona basılınca bağlı olduğu pinin high 1 5V olduğu kabul edildi.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

protezdiyot

Merhaba;
Detaylı açıklamalar ve yönlendirme için çok teşekkür ederim.Söylediklerinizi deneyeceğim.Takıldığım yerlerde tekrar bilginize başvuracağım.
Not : Şu onay verme sorununu yöneticiye mesaj olarak attım.Yardım almada zaman kaybına uğruyoruz.Gönderilen mesajları hemen yansıtabilmeniz mümkün değil mi?


sifirzero

Ustalarım konu açilmasin siye buraya yazmak istedin.butona 5 sn basılı tutunca led yansın.bu işlemin mantıği açiklayan kod var mı.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Teğmen

Merhaba
Bende birinden bu kodu duymuştum ve yapmıştım,
char checkBtn(void)
{
   char btnCounter=0;
   while(enter)
   {
	  delay_ms(100);
	  if(++btnCounter>=100)
	     break;
   }
   return btnCounter;
}


ile zamanı ayarlayabilirsin


Kolay Gelsin
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.