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?
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.
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.
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/ (http://elektrokod.wordpress.com/2013/10/12/portb-change-interrupt-portb-degisim-kesmesi/)
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ı
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.
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?
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 (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);
}
Ş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 (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);
}
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.
#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.
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?
buton kontrolüyle ilgili ayrıntılı bilgiler aşağıdaki linkten edinilebilir
http://elektrokod.wordpress.com/2013/11/18/buton-kontrolu/ (http://elektrokod.wordpress.com/2013/11/18/buton-kontrolu/)
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ı.
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
@Teğmen ustam.kodun hepsi carmi acaba
@serkancetin Hepsi char derken ?
sadece burda basılı tutacağın butonun zamanı ayarlanmakta koduna direk ekleyip kullanabilirsin MikroC de çalışıyor.CCS de de çalışır diye düşünüyorum
Belki birkaç spelling rule(yazım kuralı) değişir. Burada süre 10 saniyeye set edilmiştir.İf içerisindeki sayıyı 50 yaparsan 5 sn olur.
delay_ms(100); ///100 ms bekle
if içerisinde de bu döngüye gönderilmektedir. 100*100=10000ms=10 sn.
Kolay Gelsin
Hocam ccs c de çalişmaz bu ama saolasin mantigini fikir yureteyim
Çalışır neden çalışmasın?
@Teğmen Kodun hepsi var mı diye sormuş arkadaş. Char değil :)
Kodun hepsi var mi 😁
@vitruvius @serkancetin Kusura bakma ya ben char anladım :)
Kodlar var epey ama karışık programların içinde yarın sabah sade bir kod atarım.
Kolay Gelsin
Bu kod ccs c de çalışır zaten. olay kodun mantığını kavramakta..
Butona basılı tuttuğunuz sürece btnCounter değişkeni 100ms'de 1 artacaktır. Butondan elinizi çektiğinizde ise size 1 ile 100 arasında bir sayı gönderecek (return)
Bu gelen sayıya göre butona ne kadar süre basmış olduğunuzu tayin etmiş olucaksınız.
Gelen sayı : 10 ise 10x100ms=1000ms yani 1 sn basmışsınız anlamı taşır.
Gelen sayı : 25 ise 25x100ms=2500ms yani 2.5 sn basmışsınız..
if(btnCounter>10)// Butona 1sn'den fazla basılmış şeklinde kullanabilirsiniz.
İyi çalışmalar.
Aynen kodun mantığı anlaşıldıktan sonra her derleyicide çalışır