pic ile aynı anda iki işlem

Başlatan yusuffyk, 31 Temmuz 2012, 00:09:36

yusuffyk

arkadaşlar picte aynı anda iki işlemi nasıl yaptırabiliriz?
örneğin iki buton var ve bu iki buton iki ledi kontrol ediyor ve ben iki butona aynı anda bastığımda ikisininde yanmasını istiyorum,
klasik if ile veya switch case ile yapılınca malumunuz üzre çalışmıyor, bunun için kesme mi eklememiz gerekiyor, bu konuyu araştırdım ama pek yararlı döküman bulamadım,
veya başka bir çözüm yolu var mıdır?
soruda iki buton iki led dedim ama başlangıç olarak böyle olacak, kendimi geliştirmek için başladığım nokta bu, aynı anda birden fazla işlem yaptırtmak istediğim için bu soruyu soruyorum.
şimdiden teşekkürler
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

influx

Aslında if ile yapabilirsin ama if döngüsünde programı bekletirsen yada sonsuz döngüye falan sokarsan olmaz durum böyle ise kesme kullanarak yapacaksın, timer kesmeside olur, rb0... kesmelerinide kullanabilirsin.

yusuffyk

hocam ben ilerisini düşünüyorum şimdi basit bir uygulamada yapılabilir if ile ama ileride sadece buton değilde işin içine farklı şeyler girdiğinde; pot olur, lcd olur olur yani; kullanabileceğim en mantıklı olay kesme gibi geldi bana ama işte örnek bi koda ve kaynağa ihtiyacım var aradım aradım elle tutulur bir döküman bulamadım, basit bir kod yazar mısın rica etsem ?
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

alper.y

Aynı anda birden fazla işlem yaptırmanız kelimenin tam anlamıyla mümkün değildir. Ama bilgisayarınızdaki işletim sistemi gibi aynı anda işlem yapabiliyor izlenimi verebilirsiniz. Şu an yeni nesil bilgisayarlarda olmasa da tek çekirdekli işlemci (PIC'te olduğu gibi) kullanan bilgisayarlarda da aynı anda birden fazla program çalıştırabiliyoruz. Ama aslında tek bir anda sadece bir programın kodu çalışıyor. Her program az az çalışarak genel görünüş olarak kullanıcıya hepsi çalışıyormuş izlenimi veriyor.

Klasik if ile niye çözemediğinizi anlamadım.

while(1){

if(buton1) led1yak(); else led1sondur();
if(buton2) led2yak(); else led2sondur();

}

şeklindeki yapının işe yaraması lazım.

influx

#4
aşağıdaki linkte kesme leri güzelce anlatmış, incele istersen. eve gidincede örnek bişeyler gönderirim. kabaca açıklık getireyim, verdiğin örnek üzerinden gidelim, bir butona basıldığında bir led yanacak başka bir butona basınca başka bir led, bir timer o kesmesi oluştur ve 50ms de bir keme oluşsun ve timer0 kesmesinin içinede butonlara basıldığında yapılması gereken işlemleri yaz, yada rb4 ve rb5 kesmelerini kullan butona bastığında keme oluşsun ve kesmenin içine yapılacak kodları yaz. umarım anlatabilmişimdir.

http://www.teknobakis.com/ccs-c-ile-pic-programlama-pic-interrupts-kesmeler

serdararikan

aynı an kavramı yanlış.aynı anda sadece tek işlem yapabilirsin.ama timer kesmelerini kullanarak kesik kesik olacak şekilde çok sayıda işlem yapabilirsin. bakınız multitasking

gökhan_

bende yeniyim ancak iç içe iki if döngüsü kursan olmazmı?

yusuffyk

#7
teşekkürler influx hocam, inceliyorum ayrıca ekleyeceğin kodlarıda bekliyorum :)

serdar hocam niyetimiz aynı, anlatmak istediğim şeyi anladığınızı sanıyorum, uzunca belirtmek istemedim anlaşılır, basit bir dilde ifade ettim.

gökhan hocam dediğiniz olabilir ama bu geliştirilebilir birşey olacağı için, ilerisinide düşünüyorum ben, zaten belirtmiştim iki buton iki ledle başlayıp belki bir pot belki lcd belki başka şeyler ekleyip yoluma öyle devam edeceğim için if kullanımının dışına çıkmaya çalışıyorum.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

influx

Alıntı yapılan: yktronik - 31 Temmuz 2012, 00:44:42
teşekkürler hocam, inceliyorum ayrıca ekleyeceğin kodlarıda bekliyorum :)

hocam niyetimiz aynı, anlatmak istediğim şeyi anladığınızı sanıyorum, uzunca belirtmek istemedim anlaşılır, basit bir dilde ifade ettim.


Sana katılıyorum, zaten birazcık programlama ile uğraşmıs herkes programın bir döngü şeklinde yukarıdan aşaıya doğru herbir komutu işleyerek gideceğini bilir ve sana cvp yazacak arkadaslarda derdini anlayıp cvp yazacaklardır . Uzun lafın kısası , "lafın uzunu aptala anlatılır".

serdararikan

olaya yeni başlıyorsan if blokları ile birden falz kontrolü sıra ile yapabilirsin.ilerleyen aşamalarda bunun sana yetmediğini farkedeceksin.

berat23

yapmaya çalıştığın şeyi iç içe if bloğu halleder. komutların işlenme süresinde butonlara aynı anda basman mümkün değil.

aynı anda birden fazla işlem yapmak,bu anlattığın gibi birşey değil.onu yapmak içinde çok kabaca timer kurup,bitene kadar birini sonra diğerini yapıyorsun.bu en ilkel formu.senin isteğin iş bu değil.paralel programming ayrı bir derya,led yakıp söndürmek gibi değil.

atioky_216

#11
Alıntı yapılan: yktronik - 31 Temmuz 2012, 00:09:36
arkadaşlar picte aynı anda iki işlemi nasıl yaptırabiliriz?
örneğin iki buton var ve bu iki buton iki ledi kontrol ediyor ve ben iki butona aynı anda bastığımda ikisininde yanmasını istiyorum,
klasik if ile veya switch case ile yapılınca malumunuz üzre çalışmıyor, bunun için kesme mi eklememiz gerekiyor, bu konuyu araştırdım ama pek yararlı döküman bulamadım,
veya başka bir çözüm yolu var mıdır?
soruda iki buton iki led dedim ama başlangıç olarak böyle olacak, kendimi geliştirmek için başladığım nokta bu, aynı anda birden fazla işlem yaptırtmak istediğim için bu soruyu soruyorum.
şimdiden teşekkürler

Ben yanlış mı anladım soruyu yoksa siz mi çok karışık düşünüyorsunuz bilemiyorum ama bit bazında düşünürseniz, mesela Port 1 diyelim sekiz tane girişimiz var bunlar giriş olsun Port2 sekiz çıkışımız olsun,

Gerkli giriş-çıkış tanımlamasından sonra hiç kesme kullanmaya gerek kalmadan (yada kesmeli de olur farketmez)


//Yanıp sonen led uygulaması olsun
P2=0x00;yada 0b00000000 
while (1){
if (   (P1 & BIT1 | P1&BIT2) && 0x03  ) {

    P2= BIT1+BIT2; yada mesela 0x03
    bekle(bilmem ne kadar sure);   }

}

fatih6761

İleriyi düşünüyorsanız CCS nin built-in RTOS u var.Örnekler klasöründe RTOS uygulamalarını inceleyebilirsiniz...

influx

Tamam "yktronik" in sorduğu soruyu değiştirelim konuya açıklık gelsin,

SORU:
Benim bir lcdim var ve bir uc, yapmak istediğim 2 bilinmeyenli bir denklemi çözmek ve x,y,sonuc degerlerinide lcd de göstermek ayrıca
1.butona basıldığında x değerini 1 artırmak
2.butona basıldığında x degerini 1 azaltmak
3.butona basıldığında y değerini 1 artırmak
4.butona basıldığında y degerini 1 azaltmak
fakat program herzaman butonları kontrol edip boşuna zaman kaybetmesin ayrıca sonuc değişmedende lcd.c kütüphanesini koşmasın,bunu nasıl yapabilirim?

CEVAP:
Kesme kullanarak yapabilirsin.

Erol YILMAZ

#14
Alıntı yapılan: yktronik - 31 Temmuz 2012, 00:24:25
hocam ben ilerisini düşünüyorum şimdi basit bir uygulamada yapılabilir if ile ama ileride sadece buton değilde işin içine farklı şeyler girdiğinde; pot olur, lcd olur olur yani; kullanabileceğim en mantıklı olay kesme gibi geldi bana ama işte örnek bi koda ve kaynağa ihtiyacım var aradım aradım elle tutulur bir döküman bulamadım, basit bir kod yazar mısın rica etsem ?

Öncelikle terminolojiye geçmiş doğru kelimeyi yakalamak lazım...
Bahsettiğin şey "Multitasking"  yani çok görevlilik diye geçiyor,

İlk zamanlarda yaptığım projelerde bu problemi birçok farklı şekilde yaşadım,

Bu konu ile ilgili olarak çok fazla kaynak old. düşünüyorum:

http://www.eetimes.com/design/automotive-design/4006764/Embedded-multitasking-with-small-MCUs-Part-1--State-Machine-Constructs
http://www.eetimes.com/design/automotive-design/4006771/Embedded-multitasking-with-small-MCUs-Part-2--Cooperative-vs-pre-emptive

Özellikle Part-1 kısmı senin için çok anlamlı olacaktır.
STATE MACHINE yapısını kullandığında problemlerinin büyük kısmını rahatlıkla çözeceğini söyleyebilirim.

Embedded Multitasking : Keith Curtis
http://www.4shared.com/office/rExIUNwQ/Embedded_Multitasking_with_Sma.html