pcbway

PBP 16f84a buton ile animasyon değiştirme.

Başlatan EmRe2626, 05 Kasım 2012, 11:27:54

EmRe2626

Merhabalar, sitedeki pic basic ile yapılan birçok derse ve konuya baktım fakat bulamadım. Elimde kendi yazmış olduğum portByi kullanarak farklı animasyonlarda pbp kodları var. Ben bunları tek buton ile birleştirmek istiyorum. Yani diyelimki karaşimşek animasyonunda çalışırken butona bastğmda strobe çakar animasyonuna geçicek. Bu şekilde 3-4 farklı animasyonu birleştirmek istiyorum. Bunu nasıl yapabilirim. Kısa bi örnek verirseniz sevinirim. Şmdiden Teşekkür ederim :)

t.t

ilk önce butonu tanımlamalısın trısa=1 ardından if ile portba=0 then gosub yeniprogram program bitiminde return yazmalısın

EmRe2626

Nasıl olacağını tam olarak anlayamadım. Mesela şu 2 program için düzeltme yapıp gösterebilirmisniz?
BASLA:
PORTB=255
PAUSE 100
PORTB=0
PAUSE 40
PORTB=255
PAUSE 100
PORTB=0
PAUSE 40
PORTB=255
PAUSE 100
PORTB=0
PAUSE 500
GOTO BASLA

END
---------------------------------------
LED VAR BYTE
KARA:
FOR LED=0 TO 7
HIGH LED
PAUSE 50

NEXT LED
PORTB=0
FOR LED=7 TO 0 STEP -1
HIGH LED
PAUSE 50
NEXT LED
PORTB=0
GOTO KARA
END



Teşekkür ederim..

pwm.c

@ DEVICE pic16F628 
@ DEVICE pic16F628, WDT_OFF 
@ DEVICE pic16F628, PWRT_OFF 
@ DEVICE pic16F628, PROTECT_OFF 
@ DEVICE pic16F628, MCLR_OFF 
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
DEFINE OSC 4
ANMS VAR BYTE
SAYI VAR BYTE
SAY VAR WORD
           
TRISB=0
TRISA=%11111111
CMCON=7                 
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
     CASE 1
     LOOKUP SAYI,[128,64,32,16,8,4,2,1],PORTB
     CASE 2
     LOOKUP SAYI,[255,127,63,31,15,7,3,1],PORTB
     CASE 3
     LOOKUP SAYI,[1,3,7,15,31,63,127,255],PORTB
    END SELECT 
       FOR SAY=1 TO 500
        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
     

         
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

EmRe2626

05 Kasım 2012, 20:00:09 #4 Son düzenlenme: 05 Kasım 2012, 20:17:06 EmRe2626
çok teşekkür ederim sağolun, gerçekten düşündüğüm yapmak istediğim şeyi yapmışsınız. Elinize emeğinize sağlık. Fakat ben bunu pic16f84a ya göre microcode studio da derlemek istediğimde hata veriyo  Ve baya uğraştm ama sayıları değiştirmek yerine benim istedğim animasyonlara geçmesini yapmaya çalıştım işin içinden çıkamadım bu işlerde biraz yeniyim. Öğrenmeye uygulamaya çalışıyorum hevesliyim ama yapamayıncada bi kırgınlık oluyor. :D Verdiğim örnekle çok basit bi şekilde gösterebilirseniz çok iyi olur. Teşekkür ederim..

pwm.c

PIC16F84A için bazı kodları değiştirmen gerekir. 16f628 dururken neden 16f84 istedin anlayamadım.
animasyonaları değiştirmek için sayıları LOOKUP dizilerine eklemelisin. benim verdiğim örnekte en fazla 8 sayı ekleyebilirsin. bunu arttırmak için FOR döngüsündeki değeri büyütmen gerekir. eğer animasyonların uzunlukları farklı ise en uzun olan animasyonun değerini baz alıp dierlerinde SAYI değişkenini sıfırlayıp çıkacaksın.

ANMS değişkeni animasayon seçmeye yarar. verdiğim örnekte 4 animasyon bulunuyor. daha fazla eklemek istersen \"IF ANMS=4 THEN ANMS=0\" komutundaki sayıyı aynı oranda büyütmen gerekir.

PIC16F84A için düzenlenmiş kodlar burada:

@ 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
           
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
     CASE 1
     LOOKUP SAYI,[128,64,32,16,8,4,2,1],PORTB
     CASE 2
     LOOKUP SAYI,[255,127,63,31,15,7,3,1],PORTB
     CASE 3
     LOOKUP SAYI,[1,3,7,15,31,63,127,255],PORTB
    END SELECT 
       FOR SAY=1 TO 500
        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
     

         
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

EmRe2626

Tekrar teşekkür ederim, 1-2 sorum daha var. 16f628a nın 16f84a ya göre ne avantajları var? Birde siz isiste verdiğiniz logic problar yerine led koysam ve bunu gerçekte uygulasam çalışırmı? çünkü benim 16f84a yı istememin nedeni elimde 16f84a olması. Bu gün alıcam zaten 16f628a internetteki çoğu animasyon devresi bu pic ile yapılmış.

EmRe2626

Size tekrar tekrar teşekkür ederim. Gerçekte denedim oldu. Buton pulldown olarak buton bağladım. Çalıştı. Görünce ne kdar mutlu oldum anlatamam :). Bi kaç sorum daha olacak. Ben bu animasyonları nasıl hızlandırırım ? Mesela strobe led için sayıya 255, 255 ,255, 0 yapıcam fakat bunların bekleme sürelerini nasıl ayarlıycam ?

pwm.c

16F84 ile 16F628 arasındaki farklar şu sayfada anlatılmış:
https://320volt.com/pic16f628-hakkinda/
işin özü, 16f628 hafızası daha büyük, kristalsiz çalışabiliyor, pwm, referans,comparator çıkışları mevcut ve fiyatı 16F84den daha ucuz.

zaman gecikmesini ayarlamak için önce \"FOR SAY=1 TO 500\" komutunu bul. 500 yazan değeri nekadar düşürürsen okadar hız artar. buraya 1 ile 65535 arası değer girebilirsin.

_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

EmRe2626


pwm.c

bu arada, zaman değeri her animasyon için aynı olacaktır eğer farklı zaman değerleri ayarlamak istiyorsan şu şekilde yazabilirsin:

@ 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
     

         

Buradaki \"ZAMAN=500\" ve \" ZAMAN=1000\" değerleri istediğin gibi değiştirebilirsin.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

EmRe2626

Sizi ayakta alkışlamak istiyorum. Bu gerçekten çok çok daha iyi oldu çok teşekkür ederim elinize emeğinize sağlık :)

EmRe2626

Programım yavaş yavaş oluşuyor kafamda, kodları biraz kurcalayarak asıl amacıma ulaşmış, ve uğraşırkende birsürü komutu öğrenmiş oluyorum. Teşekkür ederim..
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
     PORTB=255
     PAUSE 100
     PORTB=0
     PAUSE 40
     PORTB=255
     PAUSE 100
     PORTB=0
     PAUSE 40
     PORTB=255
     PAUSE 100
     PORTB=0
     PAUSE 40
     ZAMAN=100
     CASE 1
     LOOKUP SAYI,[1,2,4,8,16,32,64,128],PORTB
     ZAMAN=100
     CASE 2
     LOOKUP SAYI,[1,3,7,15,31,63,127,255],PORTB
     ZAMAN=100
     CASE 3
     LOOKUP SAYI,[170,85,170,85,170,85,170,85],PORTB
     ZAMAN=150
     CASE 4
     LOOKUP SAYI,[255,0,255,0,255,0,255,0],PORTB
     ZAMAN=500
     CASE 5
     LOOKUP SAYI,[255,0,255,0,255,0,255,0],PORTB
     ZAMAN=80
     CASE 6
     LOOKUP SAYI,[240,15,240,15,240,15,240,15],PORTB
     ZAMAN=100
     CASE 7
     LOOKUP SAYI,[240,0,240,0,15,0,15,0],PORTB
     ZAMAN=100
    END SELECT 
       FOR SAY=1 TO ZAMAN
        PAUSE 1
        IF PORTA.0=0 THEN
         ANMS=ANMS+1
         IF ANMS=8 THEN ANMS=0
        ENDIF
        WHILE PORTA.0=0
           PORTB=0
           SAYI=255
           PAUSE 100
          WEND
       NEXT SAY
 NEXT SAYI
 GOTO BASLA
 
 END