botun ve ledler üzerine bir soru, sorun....

Başlatan Franisto, 25 Temmuz 2010, 16:33:14

Franisto

Mrb arkadaşlar kafam şu an durduğu için belkide çok basit belkide zor olan bir kodu yazamıyorum.  Amaçlanan durumu anlatmak için şöyle bir örnek devre olsun; 5 adet buton ve 5 adet lamba var. herhangi bir butona basınca ilgili lamba yanıyor. butonu bırakınca sönüyor. örneğin 4. butona bastık 4. lamba yanıyor. butonu bıraktık sönüyor...pic olmadan düşünün. 4. butona bastık 4.lamba yandı. bırakmadan 2. butonada bastık 2. lamba yandı onuda bırakamadan mesela 1. butonada bastık 1. lamba yandı. bu arada 2. butonu bıraktık 2. lamba söndü. 1. ve 4. lamba yanmaya devam ediyor tabi bizde 1. ve 4. butona basıyoruz bu arada. 5 buton 5 lamba bu şekilde karma karışık kontrol ediliyor. elektrik devresi çok basit buton ile lamba seri bağlanır. butonlara basıldıkça lambalar yanar bırakıldıkça lambalar söner...

şimdi bu sistemin aynısını pic ile yapalım. pic e 5 buton girelim. ve 5 adet led/ lamba çıkalım. 5 adet butonun herhangi bir öncelik sırası olmadan basıldığı ve bırakıldığını bir butona basılı ilken hangi butonların basılıp bırakıldığını analiz edecek be buna göre çıkışları verecek bir kod yazmak gerekli.

Bu sistem için nasıl bir algoritma düşünmek lazım. düşündükçe kafam karıştı... bir butonun basılıp basılı kaldığı sürece işlem yapılamasını while veya if goto gibi komutlar ile hazırlamak tamam. ama bu işlem olurken diğer butonlarda rastgele basılıp bırakılacak.... Aklıma gelen çözüm her botun için bir alt yordam yazıp bir döngü gurubu içierisinde sürekli kontrol yaptırmak ama oldukça uzun olur gibi geldi gözüme. pic olmadan çok basit olan bir lamba buton ilişkisi araya pic girince bu kadar karmaşıkmı olur yoksa benimmi kafam durdu.

pratik düşünebilen arkadaşların fikirlerini bekliyorum.

Maxim

eğer yanlış anlamadıysam çok basit bu
neden karışık gibi geldi ?



LOOP:

IF PORTA.0 =1 THEN PORTB.0=1 : ELSE : PORTB.0=0
IF PORTA.1 =1 THEN PORTB.1=1 : ELSE : PORTB.1=0
IF PORTA.2 =1 THEN PORTB.2=1 : ELSE : PORTB.2=0
IF PORTA.3 =1 THEN PORTB.3=1 : ELSE : PORTB.3=0
IF PORTA.4 =1 THEN PORTB.4=1 : ELSE : PORTB.4=0

GOTO LOOP


RcALTIN

#2
yukarıda doğru görünen bir kod verilmiş ancak farklı bir yol olarak, bir metod ile o an basılı olan tuşlar için değer ataması yaparsınız, c ile örneklemek gerekirse;
BYTE Tus()
{
int t=0;
if(input(PIN_x0))
{t+=1;}
if(input(PIN_x1))
{t+=2;}
if(input(PIN_x2))
{t+=4;}
if(input(PIN_x3))
{t+=8;}
if(input(PIN_x4))
{t+=16;}
return t;
}


bu şekilde örneğin 1. ve 3. buton basıldığında t=5 olacaktır. t değeri üzerinden bir formül geliştirebilirsiniz ama en basit haliyle her tuş kombinasyonu yazarsınız, led sayısı çok fazla olmadığından... 

Veya yine farklı bir yol olarak bir 5 boyutlu bir dizi tanımlarsınız, her led için ayrı bir boyuta gelen tuşa göre 1 veya 0 bilgilerini yazarsınız daha sonra bunları kontrol edip hangi ledlerin o sırada aktif, hangilerinin pasif olacağını elde edebilirsiniz...

Ayrıca bence işin içinden çıkamama sebebiniz kendinizi while kullanmaya zorun hissetmiş olmanız... Oysaki o yöntem yalnızca tek tuşun basılabilir olması gereken alanlarda kullanılır :)
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

Klein

Alıntı yapılan: Maxim - 25 Temmuz 2010, 16:49:19
eğer yanlış anlamadıysam çok basit bu
neden karışık gibi geldi ?



LOOP:

IF PORTA.0 =1 THEN PORTB.0=1 : ELSE : PORTB.0=0
IF PORTA.1 =1 THEN PORTB.1=1 : ELSE : PORTB.1=0
IF PORTA.2 =1 THEN PORTB.2=1 : ELSE : PORTB.2=0
IF PORTA.3 =1 THEN PORTB.3=1 : ELSE : PORTB.3=0
IF PORTA.4 =1 THEN PORTB.4=1 : ELSE : PORTB.4=0

GOTO LOOP


Evet çok basit ama daha da basiti var :)
PORTB.0 = PORTA.0
PORTB.1 = PORTA.1
PORTB.2 = PORTA.2
PORTB.3 = PORTA.3
PORTB.4 = PORTA.4

veya
PORTB =  PORTA  ( maskelenmezse 8 bit )

Franisto

evet istediğim cevaplar bunlardı. Benim yaptığıma okyanusu aşıp derede boğulmak denir. :) Bazen insanın kafası duyuror işte... Aslında bu projemde takıldığım noktalardan biriydi. arkada o if ilerin arasına sıkışacak bir sürü kod var. Sanıyorum bunlar kafamı karıştırdı. bu şekilde bir deneme yapıyım bakalım ne olacak. (bunun neresi denenecek diyenler haklı tabiki ama kafamda başka tilkilerde dolanıyor...)

teşekkürler.

Franisto

tamam ilk sorunla karşılaştım. işin içinde bir de lcd olsun.


LOOP:

IF PORTA.0 =1 THEN
LCDOUT  " ŞU ANDA BASILI OLAN TUŞLAR: 1 "
PORTB.0=1 :
ELSE : PORTB.0=0
endif
GOTO LOOP

Yine kafam karıştı... Maxim arkadaşın verdiği örneğe LCD komutları sıkıştıralım. LCD de hangi tuşların basılı olduğu yazsın. "Şu anda basılı olan:1,3,4" gibi ifade olsun. hangi tuşların basılı olduğunu bir yerde hafızada tutmak lazım. bunları dizide saklamam lazdım. bir yandan yazıyor bir yandan düşünyor bir yandan saçmalıyor olabilirim.. dediğim gibi kafam karıştı. gerçekte tuş sayım 10 adet. dizide altı eleman olmalı ve ilk basılan tuş 1. elemana yerleşmeli. 6. tuş 6. elamana.. 7. tuşa basılınca. dizinin 1. elemanı silinmeli ve elemanlar. 2. ve 7. basılan tuşa göre sıralanarak diziye 1 den 6 ya kadar yerleşmeli. neyse bu dizi işine takılmayın onu bir şekilde hallederiz. ama diğer durumlar için referans bir yol bulamadım kendime...

tabi burda ki başka bir sıkıntıda hız sorunu lcd ye pause koymadan bilgi gönderirsem hızdan lcd sapıtır. aralar pause koyarsam tuşların basma bırakma zamanlarında sorunlar çıkar...

Sanırım şimdi sıkıntımı daha iyi anlatabildim...

Franisto


muhittin_kaplan


Franisto

henüz tam düşünemiyorum dizi yapmak şart değil.

"Maxim arkadaşın verdiği örneğe LCD komutları sıkıştıralım. LCD de hangi tuşların basılı olduğu yazsın. "Şu anda basılı olan:1,3,4" gibi ifade olsun"

bu kadarı yapacak bir kod benim için yeterli referans olacaktır.

Maxim

@franisto
hepimizin kafası ara sıra karışabilir, onu dert etme .

ne yapmak istediğini daha yalın bir dille belki de şema çizerek anlatırsan sanırım anlaşılır olacak .

bu arada lcdout komutunda yazı nereye yazılacak belirtmen lazım ,
2. satır başı vs vs

Franisto

If btn1=1 Then 
    Print At 2,1,"BASILI BUTON: 1 "

bt1:
LED1=1                                           ' BUTON BASILI KALDIĞI SÜRECE LEDİ YAK. 
    If btn1=1 Then GoTo bt1
CLS           ' BUTON BIRAKILDIĞINDA EKRANI TEMİZLE
LED1=0                                           ' LEDİ SÖNDÜR.
EndIf


Şimdi tek butonlara tek tek basılıyorken (aynı anda diğer butolar kullanılmıyordu) bu kodla işimi görüyordum. ilk başta lcd ye data gidiyordu sonra buton basılı kaldığı sürece led yanıyordu...
(kodlar proton ama fark yok önemli olan mantığı aksettirmek)

şimdi butonlara rastgele aynı anda basılabiliyor. Lcd de o anda hangi butonların basılı olduğunu görmek istiyorum. tabiki basılı butonların led leride yanacak. derdim bu. bu işi yapacak kodu henüz yazamadım.

Maxim

#11
ayak üstü birşeyler yaptım
mutlaka başka şekilde de yapılabilir .

2*16 lcd kulanıldığını düşünürsek
döngüye girmeden 1 satıra sabit bir yazı yazıyoruz BT1 BT2 ...
hangi butona basılırsa ,basıldığı süre boyunca 2. satırda ON yazacak buton bırakılınca on yazısı kaybolacak , nasıl ?

BT1 BT2 BT3 ..
ON         ON

gibi..


'
'
'2*16 LCD
Print At 1,1," B1-B2-B3-B4-B5 "
'
'
LOOP:
'
'
If PORTA.0 =1 Then
PORTB.0=1
Print At 2,2,"ON"
LED1=1
Else
PORTB.0=0
Print At 2,2,"  "
LED1=0
EndIf
'
'
If PORTA.1 =1 Then
PORTB.1=1
Print At 2,5,"ON"
LED2=1 
Else
PORTB.1=0
Print At 2,5,"  "
LED2=0
EndIf
'
'
If PORTA.2 =1 Then
PORTB.2=1
Print At 2,8,"ON"
LED3=1
Else
PORTB.2=0
Print At 2,8,"  "
LED3=0
EndIf
'
'
If PORTA.3 =1 Then 
PORTB.3=1
Print At 2,11,"ON"
LED4=1
Else
PORTB.3=0
Print At 2,11,"  "
LED4=0
EndIf
'
'
If PORTA.4 =1 Then 
PORTB.4=1
Print At 2,14,"ON"
LED5=1
Else
PORTB.4=0
Print At 2,14,"  "
LED5=0
EndIf
'
'
GoTo LOOP

Franisto

#12
Hocam benim için kafa yorduğun için çok teşekkür ederim. Güzel pratik bir düşünce ama benim ihtiyacımı karşılamaz.

Maxim

istediğin şeyin kodunu yukarıda verdim ,
şimdi usb falan diyorsun, o kadarını bilemiyorum valla .

Franisto

arkadaşlar işin özünü bir daha anlatıyorum... Maxim arkadaşın fikri çok güzel ama benim için uygun değil...

10 adet buton ve 10 adet led 2x16 lcd ve pic.

butonlar pic e giriyor. ledler picten çıkıyor. lcd de durumu gösteriyor. çalışması şöyle olmalı. 1. butona basınca 1. led yanmalı butonu bırakınca sönmeli. lcd de : basılı btn: 1 yazmalı... diğer buton ve ledler içinde aynı şekilde.

buraya kadar bir sorunum yok bu kısım kolay. şu şekilde çalışsaydı program;

rastgele bir butona basalım. örn. 4. buton. bırakmadık 4. led yandı lcd de basılı btn;4 dedi...

4. butonu bırakmadan rastgele şeçtiğimiz 7. butona da bastık ve bırakmadık. 7. led de yandı. lcd de basılı btn :4,7 ibaresi geldi... bu şekilde basılan tuşu bırakmadan diğer tuşlarda kontrol edilecek. örn. 3. bir tuşa daha bastık. 1 olsun. lcd de 4,7,1 ifadesi çıkacak. sonra ikinci bastığımızı bırakacaz diyelim... 7 led sönecek lcd 4,1 olacak....

bu şekilde bir program yazmak mümkün mü? ben nerden başlayacağımı buılamadım bir fikir verebilirmisiniz?

benim aklıma gelen fikir çok kötü. her btun için bir if yazarak ilk butonu yazacam. sonra bu iflerin içine 10 tane daha if sonra bu 10 tanenin içine 9 tane  daha if.... gibi yakşalık 10x10 tek buton olasılığı x 10 btun kabaca 1000 adet if yazmak gerekir. bu fikir bana kötü geliyor....