SIRALI LED YAKMA

Başlatan Y_K, 31 Aralık 2021, 22:35:32

Y_K

TRISA = %00110000
PORTA  = 0
TRISB = %00000000
PORTB = 0
LED VAR BYTE
symbol TUS1=PORTA.4
SYMBOL TUS2=PORTA.5
LED=0
-----------------------------------------------------------------
BASLA:
PORTB=LED
IF TUS1=0 THEN
LED=LED*2
ENDIF
IF TUS2=0 THEN
LED=LED/2
IF LED=0 THEN LED=1
ENDIF
WHILE TUS1=0 OR TUS2=0:WEND
PAUSE 5
GOTO BASLA
END
öncelikle ete hocama saygılarımı sunuyorum.arkadaşlar hepinize kolay gelsin yukarıdaki şekilde yazdığımda sadece B portunda bulunan ledleri yakabildim.devre şuanda istediğim şekilde çalışıyor fakat ledler yanık kalmasın tuşa basılı olduğu süre kadar yanık kalsın tekrar tuşu bırakıp basınca bir sonraki led yansın A portundaki ledlerden sonra B portundan devam etsin son led söndükten sonra ikinci tuşa basmadan veya enerjiyi kesip tekrar açmadan başa dönmesin istiyorum.neyi eksik yaptım bilemedim yardımcı olursanız sevinirim.

alisumer

#1
tüş sorgusunda if yerine WHILE-WEND döngüsünü kullanabilirsiniz
Hep meraktan

mehmet

İki adet bit kaydırma operatörü
var. '<<' ve '>>'.
Bir de pin durumumu tersleyen
TOGGLE komutu var.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

ete

Eksik olan yada unuttuğun şeyler şunlar
- ledleri yakan PORTB=LED komutu if-ENDIF Sorgusu içinde yer almalı böylece tuşa basınca şart gerçekleşir ve ledler yanar.
-Diğer bir konu da ledleri yakmışsın ancak söndürecek bir komut koymamışsın. Mademki tuşu bırakınca ledler sönecek demişsin o halde ledlerin söndüğü nokta olan,
While Tus1=0 or Tus2=0:wend
Komut satırından hemen sonra bütün ledleri söndürecek olan Portb=0 komutunu eklemen gerekir.
Bu iki husus istediğini ywrine getirecektir. Gerisinde başka bir şey var ise peogramı çalıştırarak bakıp yapmak lazım.
Ete

Y_K

#4
Teşekkür ederim Hocam bunları yaptıktan sonra bir eksiğim daha kalıyor bu işlemi ben A portundaki RA0 dan başlatıp B portundaki RB7 ye kadar olan 12 adet led için uygulayacam yani a portundan başlayıp b portuna geçişi yapamadım.

ete

#5
İşin içine A portunuda dahil ettiğinde biraz daha kapsamlı düşünmen gerekiyor. Kullandığın LED değişkeni 8 bit ve yanlızca B portunu kullanabilir. A portunuda dahil etmek istersen LED değişkenini WORD değişkeni haline getirmen gerekecek. Yada A portu için LEDA gibi başka bir byte değişkeni de kullanabilirsin. Şimdi diyelimki tek bir Word değişkeni kullandın.
LED=1 ile başladın.
1. ci kademe LED=1
2. ci kademe LED=LED*2=2
3. cü kademe LED=LED*2=4
4. cü, kademe LED=8
5. ci kademe LED=16
6. cı kademe LED=32
7 ci kademe LED=64
8 .ci kademe LED=128
işte bu kademeden sonra A portuna geçeceksin bu iş aslında WORD değişkeni ile otomatik olacaktır.
9. kademe LED=256 
10. cu kademe LED=512
11. ci kademe LED=1024
12. ci kademe LED=2048
buraya kadar işlem tamamlanmış oldu ve bir sonraki değer artışında LED=4096 olacak ve sen burada artık led artırmayacaksın ne yapacağını bilemediğim için bir öneride bulunamıyorum.
Şimdi tek sorun 128 den sonra gelen 256 rakamına karşılık gelen bit ki bunu LED.byte0 ve LED.Byte1 isimli 8 er bitlik yardımcı değişkenlerle bulabiliyorsun. LED=256 olduğunda , LED.byte0=0 olacak ve led.byte1=1 olacaktır. Hemen anlaşılacağı gibi LED=2048 olduğunda  led.byte1=8 olacaktır.
Şimdi iş kaldı bu sayılara karşılık A portunda hangi bitler çıkış verecek.
Şayet PORTA=LED.byte1 dersen önce PORTA.0 çıkış verecek sonra PORTA.1 sonra PORTA.2 ve sonunda PORTA.3 çıkış verecektir. Bu şekilde B portunun hareket yönü tersine bir gidiş olacak gibi
Şayet LED=256 olduğunda PORTA.0 değilde PORTA.3 çıkış versin dersen ufak bir kod eklemek gerekecek. Bu kod LED.BYTE1 sayısının bitlerini ters çevirmek için kullanılacak ama yanlızca 4 bitinin bitleri ters çevrilecek. Bunun yolu da SAYI=(LED.BYTE1) REV 4 şeklindedir.
Burada REV (yani REVERSE) komutu yanına yazılan rakam kadar biti ters çevirir ve başlangıç daima sıfır nolu bit dir. Yanıa 4 yazarak 4 adet biti ters çevirmiş olduk. Böylece LED.byte1=1 iken 8 olacak, 2 iken 4 olacak, 4 iken 2 olacak ve 8 ikende 1 olacaktır. Ters çevrilmiş sayıyı direk A portuna verirsen böylece ledlerin yanış sırası daha mantıklı olacaktır.

Ancak!!, verdiğin şemaya bakılırsa ledlerin yanması A portundan başlayarak yapılıyor. Bu durumda daha farklı bir algortima kullanmak gerekecek. Dikkat edilirse A portunda yanlızca 4 bit çıkış kullanılıyor. O halde LED isimli değişkenimizin ilk 4 biti A portuna verilecek. Toplam çıkış sayımız 12 bit olacak. %0000bbbb bbbbaaaa. Burada görülen a bitleri A portuna yazılacak bitler, b bitleri ise PORTB ye yazılacak bitleri gösteriyor. Yine dikkat edilirse B portunun bitlerinin yarısı LED.BYT0 da yer alıyor diğer yarısıda LED.BYTE1 de yer alıyor. Bu nedenle bu bitlerin LED değişkeninden ayrılıp uygun biçime getirilmesi gerekiyor. Peki ne yapılacak onu sırası ile açıklayalım.
- ortalarda yer alan 8 tane b biti  LEDB=(LED & %0000111111110000) komutu ile ayrılır.
- ancak bitlerin yeri yanlış durumda o halde doğru konuma getirmek için bütün bitleri 4 bit sağa kaydırmak gerekir ki onuda LEDB=(LED & %0000111111110000)>>4 komutu yapar.
Bu aşamada sonra LEDB artık PORTB ye yazılacak durumua gelmiş demektir.
Burada dikkat edilecek husus LED=LED*2 komutu ile LED sayısının 2048 i aşması engellenmelidir. Basit bir IF komutu ile bu sağlanabilir.

Umarım anlaşılmıştır.
Ete

Y_K

#6
Sağolun hocam teşekkür ederim

Y_K

[TRISA = %00110000
PORTA  = 0
TRISB = %00000000
PORTB = 0
LED VAR BYTE
SEYMBOL TUS1=PORTA.4
SYMBOL TUS2=PORTA.5
LED=0
-----------------------------------------------------------------
BASLA:
IF TUS1=0 THEN
PORTB=LED
LED=LED*2
PAUSE 100 'AŞAĞI LED YANIK KALMA SÜRESİ
ENDIF

IF TUS2=0 THEN
PORTB=LED 
LED=LED/2
IF LED=0 THEN LED=1
PAUSE 100 'GERİ LED YANIK KALMA SÜRESİ
ENDIF

WHILE TUS1=0 OR TUS2=0:WEND
PORTB=0
PAUSE 5
GOTO BASLA
END]
Ete hocam yazılımı bu şekilde düzelttim tam istediğim şekilde çalışıyor fakat çok uğraştım ama A portundan başlatarak çalıştırmayı yapamadım.birde şunu farkettim.

  Resimdeki 2. Yani alttaki geri saydırma tuşu ve aynı zamanda start veren alt tuşa basarak B0 pininini aktif ettiğimde üstteki
    1.tuşa basıp ledleri sıra ile aşağıya doğru yakıyorum ortada durup veya son ledi yakmadan durup
    2.tuş start veya geri sayma yapan tuşa bastığımda bir sonraki led yanıp ondan sonra geri saymaya başlıyor.
    Benim istediğim son yanan ledden geri dönsün.
Hocam rica etsem müsayit olduğunuzda program olarak çalıştırıp bakabilirmisiniz.

ete

Sana bir araba açıklama mesajı yazdım ama ne yazıkki hiç birisini okumamışsın yada üstünkörü okuyup yine kafana göre hareket etmişsin. Bu nedenle artık açıklama yazmayacağım.
Ya anlamıyorsun yada yazılanları özümseyerek okumuyorsun.
Her neyse,
Açıklama yazmıyacağı dedim ama bu son açıklamayıda yazmadan kendimi rahat hissetmeyeceğim.
Birincisi A portu ile ilgili herhangi bir kod eklemesi yapmışmısın? yok elbette o halde A portundan bir şey beklemen doğru değil.
İkincisi hesaplama işlemlerini (LED=LED*2 ve LED=LED/2) hesaplanan değeri çıkışa verdikten sonra yapıyorsun bu şu demek sen PORTB.0 daki ledi yaktıktan sonra tuşu bıraktığında led değeri LED=LED*2 işleminden dolayı 2 oldu bile. Dolayısıyla bir sonraki işlemde 2 nolu çıkış aktif başlıyor. Bu durumdan kurtulmak için hesaplama işlemleri önce yapılıp sonra hesaplanan değer çıkışlara verilmelidir.

Aşağıda istediğin gibi çalışan bir kod veriyorum. İnceleyip ne yapmışım bir bakıp anlamaya çalış istersen.

Ete

TRISA = %00110000
PORTA  = 0
TRISB = %00000000
PORTB = 0
LED  VAR word  
LEDA VAR BYTE 
LEDB VAR BYTE  


SYMBOL TUSA=PORTA.4
SYMBOL TUSB=PORTA.5
OPTION_REG.7=0
LED=0

pause 300
 LED=0
'-----------------------------------------------------------------
BASLA:

      
      IF TUSA=0 THEN
         led=led*2:IF LED=4096 THEN LED=2048 
         IF LED=0 THEN LED=1
         LEDA=LED & %1111
         LEDB=(LED & %0000111111110000)>>4
         PORTA=LEDA
         PORTB=LEDB                 
         PAUSE 100 'AŞAĞI LED YANIK KALMA SÜRESİ
      ENDIF

      IF TUSB=0 THEN
         LED=LED/2 
         IF LED=0 THEN LED=1
         LEDA=LED & %1111
         LEDB=(LED & %0000111111110000)>>4
         PORTA=LEDA
         PORTB=LEDB        
        
        PAUSE 100 'GERİ LED YANIK KALMA SÜRESİ
      ENDIF

      WHILE TUSA=0 OR TUSB=0:WEND
      PORTB=0:PORTA=0
      PAUSE 100
      GOTO BASLA
END

Y_K

Ete hocam siz bir meleksiniz teşekkür ederim.öğreneceğiz önce Allah'ın sonra sizin izninizle.

Powered by EzPortal