LED ANİMASYON

Başlatan hayalci, 29 Mayıs 2020, 01:28:36

hayalci

Mrb arkadaşlar 12 kanal led animasyon yapmaya çalışıyorum pic16f628a ile yeniyim tek butonla animasyonları tek tek geçirmeyi başardım ama son animasyonu geçtiğinde hata vermeye başlıyor sanırım kesme kısmında hata yapıyorum simülasyondaki hata kodu
Stack overflow executing CALL instruction.
Stack underflow executing RETURN instruction.
hatayı bulamadım birde tek tek animasyonlar geçtikten sonra hepsi birden çalışsın istiyorum bir kere daha basınca liste başa dönsün gibi birşey düşünüyorum sanırım o olayda tablo lookup komutu komutuyla yapılıyor yardım ederseniz sevinirim
#CONFIG
 __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG

OPTION_REG=0
INTCON=%10010000
TRISA=0
TRISB=%00000001
PORTA=0
PORTB=0
DEFINE OSC 4


CMCON=7  'KARŞILAŞTIRICILAMRI KAPATIR.
VRCON=0  'REFERANS VOLTAJ GİRİŞİNİ KAPATIR.


I VAR BYTE
SAYAC VAR BYTE
SAYAC=0
ON INTERRUPT GOTO KESME


SYMBOL DUR  = 100
SYMBOL DUR2 = 200
SYMBOL DUR3 = 300
SYMBOL DUR4 = 400
SYMBOL DUR5 = 250
SYMBOL DUR6 = 50
SYMBOL DUR7 = 25
SYMBOL DUR8 = 10
SYMBOL BTN  = PORTB.0
  
PAUSE DUR           
    
SECIM:
        SELECT CASE SAYAC
        CASE 1
            GOto ANIMASYON_1
        CASE 2
            GOto ANIMASYON_2
        CASE 3
            GOto ANIMASYON_3
        CASE 4
            GOto ANIMASYON_4
        CASE 5
            GOto ANIMASYON_5
        CASE 6
            GOto ANIMASYON_6
        CASE 7
            GOto ANIMASYON_7    
        case else
        SAYAC=0
    END SELECT
PAUSEUS 100  
   
DISABLE       
KESME:  
    SAYAC=SAYAC+1 
    IF SAYAC=8 THEN SAYAC=0
    PAUSE 1
    INTCON.1=0
    RESUME SECIM
    ENABLE
    
ANIMASYON_1:  
    PORTA=%00000001
    PORTB=0
    PAUSE DUR
    PORTA=%00000010
    PORTB=0
    PAUSE DUR
    PORTA=%00000100
    PORTB=0
    PAUSE DUR
    PORTA=%00001000
    PORTB=0
    PAUSE DUR
    PORTA=%01000000
    PORTB=%00000010
    PAUSE DUR
    PORTA=0
    PORTB=%00000100
    PAUSE DUR
    PORTA=0
    PORTB=%00001000
    PAUSE DUR
    PORTA=0
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00100000
    PAUSE DUR
    PORTA=0
    PORTB=%01000000
    PAUSE DUR
    PORTA=0
    PORTB=%01000000
    PAUSE DUR
    PORTA=0
    PORTB=%10000000
    PAUSE DUR
    PORTA=0
    PORTB=%01000000
    PAUSE DUR
    PORTA=0
    PORTB=%00100000
    PAUSE DUR
    PORTA=0
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00001000
    PAUSE DUR
    PORTA=0
    PORTB=%00000100
    PAUSE DUR
    PORTA=0
    PORTB=%00000100
    PAUSE DUR
    PORTA=%1000000
    PORTB=0
    PAUSE DUR
    PORTA=%01001000
    PORTB=0
    PAUSE DUR
    PORTA=%00000100
    PORTB=0
    PAUSE DUR
    PORTA=%00000010
    PORTB=0
    PAUSE DUR
    PORTA=%00000001
    PORTB=0
GOTO ANIMASYON_1
    
 ANIMASYON_2:
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=0
    PORTB=%00000110
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=0
    PORTB=%00000110
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR2
GOTO ANIMASYON_2
    
ANIMASYON_3:    
    FOR I=1 TO 5
        PORTA=%00101
        PORTB=%01010101
        PAUSE DUR2
        PORTA=%01010
        PORTB=%10101010
        PAUSE DUR2
    NEXT
GOTO ANIMASYON_3
    
ANIMASYON_4:
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTA=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%01111111
    PAUSE DUR2
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR
GOTO ANIMASYON_4
    
ANIMASYON_5:   
    FOR I=1 TO 4
        PORTA=%01001
        PORTB=%00100100
        PAUSE DUR3
        PORTA=%00010
        PORTB=%01001001
        PAUSE DUR3
        PORTA=%00100
        PORTB=%10010010
        PAUSE DUR3
    NEXT
GOTO ANIMASYON_5
    
ANIMASYON_6:
    FOR I=1 TO 3
        PORTA=%00111
        PORTB=0
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%11100000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
    NEXT

GOTO ANIMASYON_6
    
ANIMASYON_7:
    PORTA=0
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR4
    PORTA=%01111
    PORTB=1
    PAUSE DUR4
    PORTA=0
    PORTB=0
    PAUSE DUR5
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=0
    PORTB=0
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR6
    PORTA=0
    PORTB=0
    PAUSE DUR6
    PORTA=%01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=%01111
    PORTB=1
    PAUSE DUR8
    PORTA=0
    PORTB=0
    PAUSE DUR
GOTO ANIMASYON_7
END



ete

Hata kesmeden çıkış şeklinde.
RESUME KESIM yazarak hataya zemin hazırlamış oluyorsun.
Çünki kesme oluştuğunda program hangi bölümde ise bulunduğu yerin adresi STACK'e yazılıyor ve program kesme etiketine geliyor. Oradan çıkış şayet ;
RESUME
ENABLE şeklinde olsa idi program STACK a yazılmış geliş adresini alıp geldiği yere dönebilecek ve böylece stack adres kullanımı şişmeden hep aynı seviyede kalacak idi.
Ama adresi alıp sonrasında RESUME SECIM diye çıkınca bir nevi SECIM'e git diyorsun.
Her kesmede stack den bir adreslik hafıza eksiliyor ve yerine geri gelmiyor. Sonunda 5-6 kesme sonrasında stack taşıyor ve alacak adres yeri bulamadığında program hata verip kilitleniyordur.

Sorun bu gelelim işin çözümüne. Bu gibi durumlarda bir işaret biti kullanılır. Bu bir bit değişkeni olabilir byte da olabilir en uygunu bit. Buna DEGISTI diyelim. Programın başında bunu DEGIST VAR BIT şeklinde tanımladın.
Kesme oluştuğunda, program kesme etiketine gelecek. Orada yer alan ve son derece gereksiz olan PAUSE 1 komutunu sil ve yerine DEGISTI=1 yaz.
RESUME SECIM satırınıda yanlızca RESUME olarak değiştir.
Şİmdi mantık yürütelim birlikte. Farzedelimki program (Animasyon_1) etiketi altında çalışırken butona bastın ve kesme oluştu. DEGISTI=1 olarak geri döndü. Bir şekilde sen bunu algılayıp programı SECIM kısmına yönlendirmen gerekiyor. İşte çözüm. Animasyon_1 etiketi altına herhangi bir satıra ;
IF DEGISTI=1 THEN SECIM
şeklinde bir komut satırı eklersen program bu satıra geldiğinde hemen SECIM adlı etikete gidecek ve ve yeni seçim değeri ile başka bir etikete atlayacaktır. Buda senin istediğin şey zaten.
Tabiiki aynı komut satırını diğer animasyon etiketleri altına da eklemen gerekecek zira hangi bölümde tuşa bastığın belli değil.
SECIM etiketi altında an başta DEGISTI=0 demeyide unutma aksi halde program sürekli gider gelir.

Buraya kadar anlattıklarım sorunu açıklıyor ve çözüm oneriyor. AMa programında başka sorunlarda var. Bunların başında Kesme kullandığın bir program içinde bir sürü Pause kullanmış olman. Ayrıca bunları tanımlama şeklinde yanlış gözüküyor.
SYMBOL DUR  = 100 şeklinde bir tanımlama yanlış değil ama pek kullanmadığımız bir şekil. Ne derece doğru karar veremiyorum doğrusu. AMa doğrusu şöyle DUR CON 100 şeklindedir.
Her neyse amacım Pause lerin kullanılmasının yanlış olduğu.
Program diyelimki yine Animasyon_1 altında çalışıyor ve tam sıra Pasue DUR komut satırına geldiğinde sende butona basıyorsun. Teorik olarak programın hemen Kesme etiketine gitmesi gerekirdi. Ancak Pause DUR komutunun (100 ms bekleme) işlenmesi bitmeden program Kesme etiketine gidemeyecektir. Buda bazen tuş algılamasının geç olduğu şeklinde kullanıcıda bir algı oluşturur. Çözüm şöyle;
DELAY_100:
FOR W=0 to 5000
  pauseus 5
  pauseus 5
  IF DEGISTI=1 THEN RETURN
NEXT
RETURN 
görüleceği üzere DELAY_100 şeklinde bir alt program oluşturuyoruz. Burada en büyük gecikmesi 5us olan bir döngü kurarak yaklaşık 100ms lik bir gecikme yaratıyoruz.
Programı da PAUSE DUR yerine GOSUB DELAY_100 şeklinde bu alt etikete gecikme yaratmak için gönderiyoruz.
Kesme oluştuğu anda program en fazla 5us bekler ve anında kesme etiketine gider. 5us ihmal edilebilecek bir süredir. GOSUB DELAY_100:IF DEGISTI=1 THEN SECIM şeklinde bir komut satırıda programınızı değişim olduğu anda SECIM etiketine taşıyacaktır.
Diğer bir kusur diyelim ise ard arda PORTB=0 komutunun yer alması. Birkere onu sıfırladınmı değişinceye kadar sıfır kalır. Değiştiği noktadan sonra bir kere koysan yeterli o komut.

Ete


 

hayalci

Bu şekilde değiştirdim sanırım yanlış yaptım ki ilk baştan hata vermeye başlıyor animasyon içindeki tüm pause dur ların yerine gosub delay_100 yazdım animasyon çok hızlandı :) çok güzel anlatmışsınız tabi anladığım kadarıyla yapmaya çalıştım
#CONFIG
 __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG

OPTION_REG=0
INTCON=%10010000
TRISA=0
TRISB=%00000001
PORTA=0
PORTB=0
DEFINE OSC 4


CMCON=7  'KARŞILAŞTIRICILAMRI KAPATIR.
VRCON=0  'REFERANS VOLTAJ GİRİŞİNİ KAPATIR.


I VAR BYTE
SAYAC VAR BYTE
DEGISTI VAR BIT
W VAR BYTE

SAYAC=0

ON INTERRUPT GOTO KESME

DUR CON 100
DUR2 CON 200
DUR3 CON 300
DUR4 CON 400
DUR5 CON 250
DUR6 CON 50
DUR7 CON 25
DUR8 CON 10

SYMBOL BTN  = PORTB.0
  
PAUSE DUR           

DELAY_100:
    FOR W=0 TO 5000
        pauseus 5
        PAUSEUS 5
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
   
SECIM:
        DEGISTI=0
        SELECT CASE SAYAC
        CASE 1
            GOto ANIMASYON_1
        CASE 2
            GOto ANIMASYON_2
        CASE 3
            GOto ANIMASYON_3
        CASE 4
            GOto ANIMASYON_4
        CASE 5
            GOto ANIMASYON_5
        CASE 6
            GOto ANIMASYON_6
        CASE 7
            GOto ANIMASYON_7    
        case else
        SAYAC=0
    END SELECT
PAUSEUS 100  
   
DISABLE       
KESME:  
    SAYAC=SAYAC+1 
    IF SAYAC=8 THEN SAYAC=0
    DEGISTI=1
    INTCON.1=0
    RESUME
    ENABLE
    
ANIMASYON_1:
    IF DEGISTI=1 THEN SECIM  
    PORTA=%00000001
    PORTB=0
    PAUSE DUR
    PORTA=%00000010
    PORTB=0
    PAUSE DUR
    PORTA=%00000100
    PORTB=0
    PAUSE DUR
    PORTA=%00001000
    PORTB=0
    PAUSE DUR
    PORTA=%01000000
    PORTB=%00000010
    PAUSE DUR
    PORTA=0
    PORTB=%00000100
    PAUSE DUR
    PORTA=0
    PORTB=%00001000
    PAUSE DUR
    PORTA=0
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00100000
    PAUSE DUR
    PORTA=0
    PORTB=%01000000
    PAUSE DUR
    PORTA=0
    PORTB=%01000000
    PAUSE DUR
    PORTA=0
    PORTB=%10000000
    PAUSE DUR
    PORTA=0
    PORTB=%01000000
    PAUSE DUR
    PORTA=0
    PORTB=%00100000
    PAUSE DUR
    PORTA=0
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00001000
    PAUSE DUR
    PORTA=0
    PORTB=%00000100
    PAUSE DUR
    PORTA=0
    PORTB=%00000100
    PAUSE DUR
    PORTA=%1000000
    PORTB=0
    PAUSE DUR
    PORTA=%01001000
    PORTB=0
    PAUSE DUR
    PORTA=%00000100
    PORTB=0
    PAUSE DUR
    PORTA=%00000010
    PORTB=0
    PAUSE DUR
    PORTA=%00000001
    PORTB=0
GOTO ANIMASYON_1
    
 ANIMASYON_2:
 IF DEGISTI=1 THEN SECIM
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=0
    PORTB=%00000110
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=0
    PORTB=%00000110
    PAUSE DUR
    PORTA=0
    PORTB=%00001001
    PAUSE DUR
    PORTA=%01000
    PORTB=%00010000
    PAUSE DUR
    PORTA=%00100
    PORTB=%00100000
    PAUSE DUR
    PORTA=%00010
    PORTB=%01000000
    PAUSE DUR
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR
GOTO ANIMASYON_2
    
ANIMASYON_3:
IF DEGISTI=1 THEN SECIM    
    FOR I=1 TO 5
        PORTA=%00101
        PORTB=%01010101
        PAUSE DUR2
        PORTA=%01010
        PORTB=%10101010
        PAUSE DUR2
    NEXT
GOTO ANIMASYON_3
    
ANIMASYON_4:
IF DEGISTI=1 THEN SECIM
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTA=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%01111111
    PAUSE DUR2
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR
GOTO ANIMASYON_4
    
ANIMASYON_5:
IF DEGISTI=1 THEN SECIM   
    FOR I=1 TO 4
        PORTA=%01001
        PORTB=%00100100
        PAUSE DUR3
        PORTA=%00010
        PORTB=%01001001
        PAUSE DUR3
        PORTA=%00100
        PORTB=%10010010
        PAUSE DUR3
    NEXT
GOTO ANIMASYON_5
    
ANIMASYON_6:
IF DEGISTI=1 THEN SECIM
    FOR I=1 TO 3
        PORTA=%00111
        PORTB=0
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%11100000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
    NEXT

GOTO ANIMASYON_6
    
ANIMASYON_7:
IF DEGISTI=1 THEN SECIM
    PORTA=0
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR4
    PORTA=%01111
    PORTB=1
    PAUSE DUR4
    PORTA=0
    PORTB=0
    PAUSE DUR5
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=0
    PORTB=0
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR6
    PORTA=0
    PORTB=0
    PAUSE DUR6
    PORTA=%01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=%01111
    PORTB=1
    PAUSE DUR8
    PORTA=0
    PORTB=0
    PAUSE DUR
GOTO ANIMASYON_7
END

ete

BU verdiğin son kod da GOSUB DELAY_100 hiç yok. Kayda almadan buraya koydun galiba.
Hızlanacağı kesin elbette. Döngüsel gecikme de dongü komutlarıda biraz gecikme yaratabilir. Gözle bakıp döngü içine başka pauseus 5 ler eklenebilir yada çıkartılabilir.

Bir de kesme içinde
DEGISTI=1 yaptıktan sonra
WHILE PORTB.0=0:WEND
Pause 50
eklemenizde yarar var. Böylece tuşu bırakıncaya kadar bir kaç defa sayac artışı yaşamazsınız.
Ayrıca SECIM etiketi sonunda SAYAC=0 demişsiniz buda yanlış. Bu komut orda olduğu müddetçe sayac değerini artırmanız mümkün olmaz. Onu silin oradan.

Ete

hayalci

DELAY_100 ü eklemiştim animasyon çok hızlandı o yüzden kaldırdım şuan 2 animasyona ekledim bu halde simülasyonda denedim
Stack overflow executing CALL instruction.
Stack underflow executing RETURN instruction.
son hızla hata yazıyor demek ki bir yerlerde yanlış yapıyorum

#CONFIG
 __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG

OPTION_REG=0
INTCON=%10010000
TRISA=0
TRISB=%00000001
PORTA=0
PORTB=0
DEFINE OSC 4


CMCON=7  'KARŞILAŞTIRICILAMRI KAPATIR.
VRCON=0  'REFERANS VOLTAJ GİRİŞİNİ KAPATIR.


I VAR BYTE
SAYAC VAR BYTE
DEGISTI VAR BIT
W VAR BYTE

SAYAC=0

ON INTERRUPT GOTO KESME

DUR CON 100
DUR2 CON 200
DUR3 CON 300
DUR4 CON 400
DUR5 CON 250
DUR6 CON 50
DUR7 CON 25
DUR8 CON 10

SYMBOL BTN  = PORTB.0
  
PAUSE DUR           

DELAY_100:
    FOR W=0 TO 5000
        pauseus 5
        PAUSEUS 5
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
   
SECIM:
        DEGISTI=0
        SELECT CASE SAYAC
        CASE 1
            GOto ANIMASYON_1
        CASE 2
            GOto ANIMASYON_2
        CASE 3
            GOto ANIMASYON_3
        CASE 4
            GOto ANIMASYON_4
        CASE 5
            GOto ANIMASYON_5
        CASE 6
            GOto ANIMASYON_6
        CASE 7
            GOto ANIMASYON_7    
        END SELECT
PAUSEUS 100  
   
DISABLE       
KESME:  
    SAYAC=SAYAC+1 
    IF SAYAC=8 THEN SAYAC=0
    DEGISTI=1
    WHILE PORTB.0=0:WEND
    PAUSE 50
    INTCON.1=0
    RESUME
    ENABLE
    
ANIMASYON_1:
    IF DEGISTI=1 THEN SECIM  
    PORTA=%00000001
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000010
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000100
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00001000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%01000000
    PORTB=%00000010
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=%1000000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%01001000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000100
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000010
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000001
    PORTB=0
GOTO ANIMASYON_1
    
 ANIMASYON_2:
 IF DEGISTI=1 THEN SECIM
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000110
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000110
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
GOTO ANIMASYON_2
    
ANIMASYON_3:
IF DEGISTI=1 THEN SECIM    
    FOR I=1 TO 5
        PORTA=%00101
        PORTB=%01010101
        PAUSE DUR2
        PORTA=%01010
        PORTB=%10101010
        PAUSE DUR2
    NEXT
GOTO ANIMASYON_3
    
ANIMASYON_4:
IF DEGISTI=1 THEN SECIM
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTA=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%01111111
    PAUSE DUR2
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR
GOTO ANIMASYON_4
    
ANIMASYON_5:
IF DEGISTI=1 THEN SECIM   
    FOR I=1 TO 4
        PORTA=%01001
        PORTB=%00100100
        PAUSE DUR3
        PORTA=%00010
        PORTB=%01001001
        PAUSE DUR3
        PORTA=%00100
        PORTB=%10010010
        PAUSE DUR3
    NEXT
GOTO ANIMASYON_5
    
ANIMASYON_6:
IF DEGISTI=1 THEN SECIM
    FOR I=1 TO 3
        PORTA=%00111
        PORTB=0
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%11100000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
    NEXT

GOTO ANIMASYON_6
    
ANIMASYON_7:
IF DEGISTI=1 THEN SECIM
    PORTA=0
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR4
    PORTA=%01111
    PORTB=1
    PAUSE DUR4
    PORTA=0
    PORTB=0
    PAUSE DUR5
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=0
    PORTB=0
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR6
    PORTA=0
    PORTB=0
    PAUSE DUR6
    PORTA=%01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=%01111
    PORTB=1
    PAUSE DUR8
    PORTA=0
    PORTB=0
    PAUSE DUR
GOTO ANIMASYON_7
END

ete

Yanlış-1:
Seçim etiketinin altında GOTO SECIM yer almıyor. İlk açılışta SAYAC değerin sıfır dır. Select case satırlarında CASE 0 olmadığı için program case kısımları nı atlayıp ENDSELECT kısmına geliyor. orada GOTO SECIM olmadığı için DISABLE satırından devam edip kesme içine giriyor ve kesme olmadan kesme etiketine girdiği için stack saçmalıyor. Benzer şekilde DELAY_100 alt program olması gerekirken programın başına bunu eklemişsin. İlk çalıştırmada program otomatikman satır takip ettiği için isteristemez bu satıra gelip o komutu çalıştırıyor ve sonunda RETURN komutunu görüyor ve Stack dan bir return adres değeri almaya çalışıyor. Öyle bir şey olmadıği için yine stack problemi ortaya çıkıyor.

DELAY programını aşağılara hatta en sona yerleştir.
SECIM etiketi en altına GOTO SECIM  yaz.
Delay döngüsünü çoğaltman gerekecek. Mesela 5000 yerine 25000 yap ve uygun süre yakalayıncaya kadar döngü değeri ile oynayabilirisin.

Ete

hayalci

Bu şekilde hatalar gitti. Şuan animasyon direk başlamıyor ve animasyon çok hızlı 30000 yaptım 50000 yaptım 100000 yaptım 100000 de hata verdi derlemedi :) çok hızlı diğer animasyonlarda süreler de farklı hızı ve yavaş oynatmak gerekecek değil mi en azından stack hatasından kurtuldum :)   
#CONFIG
 __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG

OPTION_REG=0
INTCON=%10010000
TRISA=0
TRISB=%00000001
PORTA=0
PORTB=0
DEFINE OSC 4


CMCON=7  'KARŞILAŞTIRICILAMRI KAPATIR.
VRCON=0  'REFERANS VOLTAJ GİRİŞİNİ KAPATIR.


I VAR BYTE
SAYAC VAR BYTE
DEGISTI VAR BIT
W VAR BYTE

SAYAC=0

ON INTERRUPT GOTO KESME

DUR CON 100
DUR2 CON 200
DUR3 CON 300
DUR4 CON 400
DUR5 CON 250
DUR6 CON 50
DUR7 CON 25
DUR8 CON 10

SYMBOL BTN  = PORTB.0
  
PAUSE DUR           


   
SECIM:
        DEGISTI=0
        SELECT CASE SAYAC
        CASE 1
            GOto ANIMASYON_1
        CASE 2
            GOto ANIMASYON_2
        CASE 3
            GOto ANIMASYON_3
        CASE 4
            GOto ANIMASYON_4
        CASE 5
            GOto ANIMASYON_5
        CASE 6
            GOto ANIMASYON_6
        CASE 7
            GOto ANIMASYON_7    
        END SELECT
        goto SECIM
        
        
PAUSEUS 100    
DISABLE       
KESME:  
    SAYAC=SAYAC+1 
    IF SAYAC=8 THEN SAYAC=0
    DEGISTI=1
    WHILE PORTB.0=0:WEND
    PAUSE 50
    INTCON.1=0
    RESUME
    ENABLE
    
ANIMASYON_1:
    IF DEGISTI=1 THEN SECIM  
    PORTA=%00000001
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000010
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000100
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00001000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%01000000
    PORTB=%00000010
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=%1000000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%01001000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000100
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000010
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000001
    PORTB=0
GOTO ANIMASYON_1
    
 ANIMASYON_2:
 IF DEGISTI=1 THEN SECIM
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000110
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000110
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
GOTO ANIMASYON_2
    
ANIMASYON_3:
IF DEGISTI=1 THEN SECIM    
    FOR I=1 TO 5
        PORTA=%00101
        PORTB=%01010101
        PAUSE DUR2
        PORTA=%01010
        PORTB=%10101010
        PAUSE DUR2
    NEXT
GOTO ANIMASYON_3
    
ANIMASYON_4:
IF DEGISTI=1 THEN SECIM
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTA=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%01111111
    PAUSE DUR2
    PORTA=%01111
    PORTB=%10111111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11011111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11101111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11110111
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111101
    PAUSE DUR
    PORTA=%01111
    PORTB=%11111110
    PAUSE DUR
    PORTA=%00111
    PORTB=1
    PAUSE DUR
    PORTA=%01011
    PORTB=1
    PAUSE DUR
    PORTA=%01101
    PORTB=1
    PAUSE DUR
    PORTA=%01110
    PORTB=1
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR
GOTO ANIMASYON_4
    
ANIMASYON_5:
IF DEGISTI=1 THEN SECIM   
    FOR I=1 TO 4
        PORTA=%01001
        PORTB=%00100100
        PAUSE DUR3
        PORTA=%00010
        PORTB=%01001001
        PAUSE DUR3
        PORTA=%00100
        PORTB=%10010010
        PAUSE DUR3
    NEXT
GOTO ANIMASYON_5
    
ANIMASYON_6:
IF DEGISTI=1 THEN SECIM
    FOR I=1 TO 3
        PORTA=%00111
        PORTB=0
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%11100000
        PAUSE DUR
        PORTA=0
        PORTB=%01110000
        PAUSE DUR
        PORTA=0
        PORTB=%00111000
        PAUSE DUR
        PORTA=0
        PORTB=%00011100
        PAUSE DUR
        PORTA=0
        PORTB=%00001110
        PAUSE DUR
        PORTA=0
        PORTB=%00000111
        PAUSE DUR
        PORTA=%01000
        PORTB=%00000011
        PAUSE DUR
        PORTA=%01100
        PORTB=%00000001
        PAUSE DUR
        PORTA=%01110
        PORTB=0
        PAUSE DUR
    NEXT

GOTO ANIMASYON_6
    
ANIMASYON_7:
IF DEGISTI=1 THEN SECIM
    PORTA=0
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=0
    PAUSE DUR4
    PORTA=%00001
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%10000000
    PAUSE DUR4
    PORTA=%00011
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11000000
    PAUSE DUR4
    PORTA=%00111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11100000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110000
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11110001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111001
    PAUSE DUR4
    PORTA=%01111
    PORTB=%11111011
    PAUSE DUR4
    PORTA=%01111
    PORTB=1
    PAUSE DUR4
    PORTA=0
    PORTB=0
    PAUSE DUR5
    PORTA=%01111
    PORTB=1
    PAUSE DUR
    PORTA=0
    PORTB=0
    PAUSE DUR
    PORTA=%01111
    PORTB=1
    PAUSE DUR6
    PORTA=0
    PORTB=0
    PAUSE DUR6
    PORTA=%01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=01111
    PORTB=1
    PAUSE DUR7
    PORTA=0
    PORTB=0
    PAUSE DUR7
    PORTA=%01111
    PORTB=1
    PAUSE DUR8
    PORTA=0
    PORTB=0
    PAUSE DUR
GOTO ANIMASYON_7
DELAY_100:
    FOR W=0 TO 30000
        pauseus 5
        PAUSEUS 5
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
END

hayalci

sayac=0 dan sayac=1 yaptım animasyon butona basmadan başladı sıra geldi 8 e eşitsedeki sayacı da 1 yaptım 8 olunca başa geliyor şuan sadece animasyon hızlı cpu hatası veriyor :) onun dışında kesme işlemi gecikmelide olsa çalışıyor

ete

Neden önerdiklerimi değilde kestirme yolları tercih ediyorsun. Merak ettim.
Doğrusunu göstermiştim.
Neyse bildiğin gibi yap mal senin.
Ete

hayalci

#9
Kusura bakmayın hocam kaç gündür kafam çok karıştı bir tur atıp geldim tekrardan yazdıklarınızı gözden geçirdim hatamı buldum her şey düzgün çalışıyor çok tşk ederim sizi de yordum Allah sizden razı olsun ilk pic basic kullanışım sayenizde çok şeyi öğreniyorum tek tek her yazınızı okuyorum derslerinize de başlayacağım çok faydalı bilgiler veriyorsunuz çok tşk ederim gerçekten   
#CONFIG
 __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG

OPTION_REG=0
INTCON=%10010000
TRISA=0
TRISB=%00000001
PORTA=0
PORTB=0
DEFINE OSC 4


CMCON=7  'KARŞILAŞTIRICILAMRI KAPATIR.
VRCON=0  'REFERANS VOLTAJ GİRİŞİNİ KAPATIR.


I VAR BYTE
SAYAC VAR BYTE
DEGISTI VAR BIT
W VAR BYTE
SAYAC=0

ON INTERRUPT GOTO KESME

DUR CON 100
DUR2 CON 200
DUR3 CON 300
DUR4 CON 400
DUR5 CON 250
DUR6 CON 50
DUR7 CON 25
DUR8 CON 10

sure10 var byte
sure25 var byte
sure50 var byte
sure100 var byte
sure200 var byte
sure250 var byte
sure300 var byte 
sure400 var byte
suredegis var byte
suredegis=0

SYMBOL BTN  = PORTB.0
  
PAUSE DUR           


   
SECIM:
        DEGISTI=0
        SELECT CASE SAYAC
        case 0
            GOto ANIMASYON_1
        CASE 1
            GOto ANIMASYON_2
        CASE 2
            GOto ANIMASYON_3
        CASE 3
            GOto ANIMASYON_4
        CASE 4
            GOto ANIMASYON_5
        CASE 5
            GOto ANIMASYON_6
        CASE 6
            GOto ANIMASYON_7
                   
        END SELECT
        goto SECIM
        
        
PAUSEUS 100    
DISABLE       
KESME:  
    SAYAC=SAYAC+1 
    IF SAYAC=7 THEN SAYAC=0
    DEGISTI=1
    WHILE PORTB.0=0:WEND
    PAUSE 50
    INTCON.1=0
    RESUME
    ENABLE
    
ANIMASYON_1:
    IF DEGISTI=1 THEN SECIM  
    PORTA=%00000001
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00000010
    GOSUB DELAY_100
    PORTA=%00000100
    GOSUB DELAY_100
    PORTA=%00001000
    GOSUB DELAY_100
    PORTA=%01000000
    PORTB=%00000010
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00000100
    GOSUB DELAY_100
    PORTB=%00001000
    GOSUB DELAY_100
    PORTB=%00010000
    GOSUB DELAY_100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTB=%01000000
    GOSUB DELAY_100
    PORTB=%01000000
    GOSUB DELAY_100
    PORTB=%10000000
    GOSUB DELAY_100
    PORTB=%01000000
    GOSUB DELAY_100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTB=%00010000
    GOSUB DELAY_100
    PORTB=%00001000
    GOSUB DELAY_100
    PORTB=%00000100
    GOSUB DELAY_100
    PORTB=%00000100
    GOSUB DELAY_100
    PORTA=%10000000
    PORTB=0
    GOSUB DELAY_100
    PORTA=%00001000
    GOSUB DELAY_100
    PORTA=%00000100
    GOSUB DELAY_100
    PORTA=%00000010
    GOSUB DELAY_100
    PORTA=%00000001
GOTO ANIMASYON_1
    
 ANIMASYON_2:
 IF DEGISTI=1 THEN SECIM
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTB=%00000110
    GOSUB DELAY_100
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=0
    PORTB=%00001001
    GOSUB DELAY_100
    PORTB=%00000110
    GOSUB DELAY_100
    PORTB=%00001001
    GOSUB DELAY_100
    PORTA=%01000
    PORTB=%00010000
    GOSUB DELAY_100
    PORTA=%00100
    PORTB=%00100000
    GOSUB DELAY_100
    PORTA=%00010
    PORTB=%01000000
    GOSUB DELAY_100
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_100
GOTO ANIMASYON_2
    
ANIMASYON_3:
IF DEGISTI=1 THEN SECIM    
    FOR I=1 TO 5
        PORTA=%00101
        PORTB=%01010101
        gosub DELAY_200
        PORTA=%01010
        PORTB=%10101010
        gosub DELAY_200
    NEXT
GOTO ANIMASYON_3
    
ANIMASYON_4:
IF DEGISTI=1 THEN SECIM
    PORTA=%01111
    PORTB=1
    gosub DELAY_100
    PORTA=%01110
    gosub DELAY_100
    PORTA=%01101
    PORTB=1
    gosub DELAY_100
    PORTA=%01011
    gosub DELAY_100
    PORTA=%00111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11111110
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11111101
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11111011
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11110111
    gosub DELAY_100
    PORTA=%01111
    PORTA=%11101111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11011111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%10111111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%01111111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%10111111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11011111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11101111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11110111
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11111011
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11111101
    gosub DELAY_100
    PORTA=%01111
    PORTB=%11111110
    gosub DELAY_100
    PORTA=%00111
    PORTB=1
    gosub DELAY_100
    PORTA=%01011
    gosub DELAY_100
    PORTA=%01101
    gosub DELAY_100
    PORTA=%01110
    gosub DELAY_100
    PORTA=%01111
    gosub DELAY_100
GOTO ANIMASYON_4
    
ANIMASYON_5:
IF DEGISTI=1 THEN SECIM   
    FOR I=1 TO 4
        PORTA=%01001
        PORTB=%00100100
        GOSUB DELAY_300
        PORTA=%00010
        PORTB=%01001001
        GOSUB DELAY_300
        PORTA=%00100
        PORTB=%10010010
        GOSUB DELAY_300
    NEXT
GOTO ANIMASYON_5
    
ANIMASYON_6:
IF DEGISTI=1 THEN SECIM
    FOR I=1 TO 3
        PORTA=%00111
        PORTB=0
        gosub DELAY_100
        PORTA=%01110
        gosub DELAY_100
        PORTA=%01100
        PORTB=%00000001
        gosub DELAY_100
        PORTA=%01000
        PORTB=%00000011
        gosub DELAY_100
        PORTA=0
        PORTB=%00000111
        gosub DELAY_100
        PORTB=%00001110
        gosub DELAY_100
        PORTB=%00011100
        gosub DELAY_100
        PORTB=%00111000
        gosub DELAY_100
        PORTB=%01110000
        gosub DELAY_100
        PORTB=%11100000
        gosub DELAY_100
        PORTB=%01110000
        gosub DELAY_100
        PORTB=%00111000
        gosub DELAY_100
        PORTB=%00011100
        gosub DELAY_100
        PORTB=%00001110
        gosub DELAY_100
        PORTB=%00000111
        gosub DELAY_100
        PORTA=%01000
        PORTB=%00000011
        gosub DELAY_100
        PORTA=%01100
        PORTB=%00000001
        gosub DELAY_100
        PORTA=%01110
        PORTB=0
        gosub DELAY_100
    NEXT

GOTO ANIMASYON_6
    
ANIMASYON_7:
IF DEGISTI=1 THEN SECIM
    PORTA=0
    PORTB=0
    GOSUB DELAY_400
    PORTA=%00001
    GOSUB DELAY_400
    PORTA=%00001
    PORTB=%10000000
    GOSUB DELAY_400
    PORTA=%00011
    PORTB=%10000000
    GOSUB DELAY_400
    PORTA=%00011
    PORTB=%11000000
    GOSUB DELAY_400
    PORTA=%00111
    PORTB=%11000000
    GOSUB DELAY_400
    PORTA=%00111
    PORTB=%11100000
    GOSUB DELAY_400
    PORTA=%01111
    PORTB=%11100000
    GOSUB DELAY_400
    PORTA=%01111
    PORTB=%11110000
    GOSUB DELAY_400
    PORTA=%01111
    PORTB=%11110001
    GOSUB DELAY_400
    PORTA=%01111
    PORTB=%11111001
    GOSUB DELAY_400
    PORTA=%01111
    PORTB=%11111011
    GOSUB DELAY_400
    PORTA=%01111
    PORTB=1
    GOSUB DELAY_400
    PORTA=0
    PORTB=0
    gosub DELAY_250
    PORTA=%01111
    PORTB=1
    GOSUB DELAY_100
    PORTA=0
    PORTB=0
    GOSUB DELAY_100
    PORTA=%01111
    PORTB=1
    gosub DELAY_50
    PORTA=0
    PORTB=0
    gosub DELAY_50
    PORTA=%01111
    PORTB=1
    gosub DELAY_25
    PORTA=0
    PORTB=0
    gosub DELAY_25
    PORTA=01111
    PORTB=1
    gosub DELAY_25
    PORTA=0
    PORTB=0
    gosub DELAY_25
    PORTA=%01111
    PORTB=1
    gosub DELAY_10
    PORTA=0
    PORTB=0
    GOSUB DELAY_100
GOTO ANIMASYON_7

DELAY_100:
    FOR W=0 TO 5000
        pauseus 250
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_200:
    FOR W=0 TO 5000
        pauseus 500
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_300:
    FOR W=0 TO 5000
        pauseus 750
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_400:
    FOR W=0 TO 5000
        pauseus 1000
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_250:
    FOR W=0 TO 5000
        pauseus 625
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_50:
    FOR W=0 TO 5000
        pauseus 125
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_25:
    FOR W=0 TO 5000
        pauseus 60
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN
DELAY_10:
    FOR W=0 TO 5000
        pauseus 25
        IF DEGISTI=1 THEN RETURN
    NEXT
    RETURN      
END

Powered by EzPortal