Bir buton ile led animasyonu değiştirmek yardım.

Başlatan Arif_87, 08 Ağustos 2014, 16:35:20

Arif_87

Arkadaşlar bir buton yardımı ile ledlerin yanma sırasını değiştiren program yazmaya çalışıyorum fakat başarılı olamadım. Bu konuda yardımcı olabirseniz sevinirim. Yazmaya çalıştığım program aşağıda...butona bassamda animasyon değişmiyor. Yardımlarınızı bekliyorum.
     TRISB=%00000000   'PortB çıkış
   TRISA=%00000001   'PortA Giriş
   LED1 VAR PORTB.0
   LED2 VAR PORTB.1
   BUTON VAR PORTA.0
   PortB=0
BASLA:
    IF BUTON=0 then LEDANI2
GOto basla
    Pause 1000
LEDANI1:
    IF BUTON=0 THEN LEDANI2
    high led1   '1
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    low led1
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    high led1   '2
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    low led1
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    high led1   '3
    PAUSE 50
    IF BUTON=0 THEN LEDANI2   
    LOw led1
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    high led2   '1
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    low led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    high led2   '2
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    low led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    high led2   '3
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    low led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI2
    Pause 50
goto LEDANI1   
'------------------------------Animasyon 1 sonu   
LEDANI2:
    IF BUTON=0 THEN LEDANI3
    high led1   '1
    high led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI3
    low led1
    low led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI3
    high led1   '2
    high led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI3
    low led1
    low led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI3
    high led1   '3
    high led2
    PAUSE 50
    IF BUTON=0 THEN LEDANI3
GOTO LEDANI2
'----------------------------------------Animasyon 2 sonu   
LEDANI3:
    PAUSE 50
    IF BUTON=0 THEN Basla
    high led1   'Kırmızı
    PAUSE 50
    IF BUTON=0 THEN Basla
    low led1
    PAUSE 50
    IF BUTON=0 THEN Basla
    high led2   'Mavi
    PAUSE 50
    IF BUTON=0 THEN Basla
    low led2
    PAUSE 50
    IF BUTON=0 THEN Basla
goto LEDANI3
END

vitruvius

Picbasic bilmiyorum ama su mantikla yapabilirsiniz. Bir degisken tanimlayin, mesela ani olsun ismi. Eger acilista animasyon calismasin istiyorsaniz baslangic degerini sifir olarak atayin. Eger baslangicta herhangi bir animasyonla calissin istiyorsaniz o animasyonun numarasini ilk deger olarak atayin. Butona basildiginda ani degerini bir arttirin. Ani==1 iken bir animasyon, ani==2 iken diger animasyonun kodlarini yazin. Ani degiskeni 2 iken butona tekrar basilirsa ani degiskenini 1 yapin. 

Soyle bir sey calismali:
int ani=0;
If (buton=1)
{
While (buton=1); // butondan el cekilene kadar bekle
ani=ani+1;
}

If (ani == 3)
{
ani=1;
}

If (ani == 1)
{
// ilk animasyonun kodlari buraya.
}

If (ani == 2)
{
// Ikinci animasyonun kodlari buraya.
}

pwm.c

eskiden birisi için örnek hazırlamıştım. belki faydası olur.
zaman değerlerini ve animasyonları isteğine göre değiştirebilirsin.
@ DEVICE pic16F84A 
@ DEVICE pic16F84A, WDT_OFF 
@ DEVICE pic16F84A, PWRT_OFF 
@ DEVICE pic16F84A, PROTECT_OFF   
@ DEVICE pic16F84A, XT_OSC
DEFINE OSC 4
ANMS VAR BYTE
SAYI VAR BYTE
SAY VAR WORD
ZAMAN VAR WORD
           
TRISB=0
TRISA=%11111111                 
PORTB=0
PORTA=0
ANMS=0
SAY=0
SAYI=0


BASLA:
 FOR SAYI=0 TO 7
    SELECT CASE ANMS
     CASE 0
     LOOKUP SAYI,[1,2,4,8,16,32,64,128],PORTB
     ZAMAN=500
     CASE 1
     LOOKUP SAYI,[128,64,32,16,8,4,2,1],PORTB
     ZAMAN=500
     CASE 2
     LOOKUP SAYI,[255,127,63,31,15,7,3,1],PORTB
     ZAMAN=1000
     CASE 3
     LOOKUP SAYI,[1,3,7,15,31,63,127,255],PORTB
     ZAMAN=1000
    END SELECT 
       FOR SAY=1 TO ZAMAN
        PAUSE 1
        IF PORTA.0=0 THEN
         ANMS=ANMS+1
         IF ANMS=4 THEN ANMS=0
        ENDIF
        WHILE PORTA.0=0
           PORTB=0
           SAYI=255
           PAUSE 100
          WEND
       NEXT SAY
 NEXT SAYI
 GOTO BASLA
 
 END
     

         

http://elektronikprojeler.com/index.php?topic=3351.msg14394#msg14394
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Arif_87

Arkadaşlar cevaplarınız ve yardımlarınız için teşekkür ederim. konu üzerinde biraz daha çalışmam lazım.

certy

#4
Bir tane değişken tanımlarsın. Kaç tane animasyon yapacaksan her animasyon için bir alt program yazarsın. Buton ile değişkenin sayısını artırırsın. IF komutlarıyla arttırdığın değişken rakamlarına tanımlama yaparsın. Örneğin;

PROGRAM:

IF BUTON=1 THEN
WHILE BUTON:WEND
SAYI=SAYI+1
ENDIF

IF SAYI=1 THEN
GOSUB ANIMASYON_1
ENDIF

IF SAYI=2 THEN
GOSUB ANIMASYON_2
ENDIF

IF SAYI=3 THEN
GOSUB ANIMASYON_3
ENDIF

GOTO PROGRAM
TA1USS

suatengin

#5
merhaba. 20 gün geçmiş sorunu çözdünüz mü bilmiyorum fakat yardımım dokunursa ne mutlu bana.

bende PBP "IF BUTON=0 then LEDANI2" komutunu kabul etmiyor "IF BUTON=0 then goto LEDANI2" şeklinde yazmam gerekiyor belki bu noktada sorun oluyor olabilir.

birde; bir sonraki animasyona geçtiğinde tekrar butonu kontrol edecek ve eğer siz hala butona basıyorsanız bir sonraki animasyona geçecek. pause süresinin 1000 üzerinden 50 olduğunu düşünürsek butona o kadar kısa süre basmak çok zor olacak.

buton içinde  bir dirençle 5V'a bağlanmalı ve buton ile 0V'a bağlanmalı.

kendimce biraz düzenledim.
BASLA:   
   PortB=0
BASLA1:
    IF BUTON=0 then GOTO BASLA1'burası LEDANI2'ydi fakat LEDANI1'e yönlendiren hiçbirşey göremediğim için değiştirdim.
GOTO DEVAM
    Pause 1000' buradaki beklemenin bir anlamını göremedim program hiç buraya gelmiyor.
LEDANI1:
    IF BUTON=0 then GOTO LEDANI1'yine sizin butona fazla basmayın diye bırakmanızı bekleyecek.
LEDANI1DVM:
    IF BUTON=0 THEN GOTO LEDANI2
    high led1   '1
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    low led1
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    high led1   '2
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    low led1 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    high led1   '3
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2   
    LOw led1
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    high led2   '1
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    low led2
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    high led2   '2 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    low led2
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    high led2   '3
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    low led2
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI2
    Pause 50
goto LEDANI1DVM   
'------------------------------Animasyon 1 sonu   
LEDANI2:
    IF BUTON=0 THEN GOTO LEDANI2'burada yine butonun bırakılması bekleniyor.
LEDANI2DVM:
    IF BUTON=0 THEN GOTO LEDANI3
    high led1   '1
    high led2 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI3
    low led1
    low led2 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI3
    high led1   '2
    high led2 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI3
    low led1
    low led2 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI3
    high led1   '3
    high led2 
    PAUSE 50
    IF BUTON=0 THEN GOTO LEDANI3
GOTO LEDANI2DVM
'----------------------------------------Animasyon 2 sonu    
LEDANI3:
    IF BUTON=0 THEN GOTO LEDANI3'yine butonun bırakılması bekleniyor.
LEDANI3DVM: 
    PAUSE 50
    IF BUTON=0 THEN GOTO Basla
    high led1   'Kırmızı 
    PAUSE 50
    IF BUTON=0 THEN GOTO Basla
    low led1 
    PAUSE 50
    IF BUTON=0 THEN GOTO Basla
    high led2   'Mavi 
    PAUSE 50
    IF BUTON=0 THEN GOTO Basla
    low led2
    PAUSE 50
    IF BUTON=0 THEN GOTO Basla
goto LEDANI3DVM
END

ete

Bir konu açılmış cevaplar gelmiş. Muhtemelen bir sonuca ulaşılmıştır ama bende bir örnek vereyim istedim.

Ete

'@ DEVICE PIC16F628A
'@ DEVICE PIC16F628A, WDT_ON
'@ DEVICE PIC16F628A, PWRT_ON
'@ DEVICE PIC16F628A, BOD_ON
'@ DEVICE PIC16F628A, PROTECT_OFF
'@ DEVICE PIC16F628A, LVP_OFF
'@ DEVICE PIC16F628A, CPD_OFF
'@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT
'---------------------------------------------
@ __config _INTRC_OSC_NOCLKOUT  & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF

DEFINE OSC 4  
CMCON=7
TRISB=%00000000   'PortB çıkış
TRISA=%00000001   'PortA Giriş
LED1 VAR PORTB.0
LED2 VAR PORTB.1
BUTON VAR PORTA.0
ANIMAS VAR BYTE
ESKI   VAR BYTE
I      VAR BYTE
W      VAR BYTE

ANIMAS=0
PortB=0
PAUSE 200
BASLA:

      SELECT CASE ANIMAS
      
      CASE 0   
          FOR W=0 TO 5  
            high led1   '1
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
            low led1
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
          NEXT
          GOTO BASLA
          
       CASE 1
          FOR W=0 TO 2
            high led1   '1
            high led2             
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
            low led1
            low led2            
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
          NEXT
          
          CASE 2
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
            high led1   'Kırmızı
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
            low led1
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA
            high led2   'Mavi
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA    
            low led2
            GOSUB DELAY_50
            IF ESKI!=ANIMAS THEN BASLA            
            END SELECT  
            GOTO BASLA

DELAY_50:
         ESKI=ANIMAS
         FOR I=0 TO 100
           PAUSE 1
           IF BUTON=0 THEN
             ANIMAS=ANIMAS+1
             IF ANIMAS=3 THEN ANIMAS=0
             WHILE BUTON=0:WEND
             PAUSE 30
             GOTO CIK
           ENDIF  
         NEXT  
CIK:       RETURN           
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com