12F675'e yazdığım Kod'u çalıştıramadım

Başlatan papylon, 03 Mart 2009, 04:18:32

papylon

Arkadaşlar herkese merhaba
MicroCode Studio ve PIC BASIC'i  yeni öğreniyorum ve kodları daha iyi benimseyebilmek için deneme amaçlı olarak ara sıra küçük programlar yazmaya çalışıyorum.
Aşağıda ki programı PIC16F628 için yazmıştım ve gayet güzel olarak ISIS simülesinde ve Bread Board  üzerinde çalıştı. Fakat aynı programı PIC16F84 ve PIC12F675 için simüle ettiğimde çalışmıyor. Ve ayrıca PIC16F84'ü Bread Board  üzerinde de denedim ama çalışmadı.

Programın amacı, bir adet RGB LED'i Ana program döngüsü içinde girdiğim PWM ve zaman değerlerine göre yakmak.
Aşağıdaki kod'u PIC12F675'e göre tanımladım. Nerede hata yapıyorum bulamadım, yardımcı olursanız çok sevinirim

@ DEVICE PIC12F675
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE PROTECT_OFF 
@ DEVICE BOD_ON
'_________________________________
 CMCON = 7 
 ANSEL = 0  
 TRISIO = %001000 
 GPIO = %111111  
'_________________________________ 
 ZAMAN VAR BYTE
 ZAMANE VAR BYTE
 
 CRED VAR BYTE
 CGREEN VAR BYTE     
 CBLUE VAR BYTE
 
 RED VAR BYTE
 GREEN VAR BYTE
 BLUE VAR BYTE
 
 RGB VAR BYTE
'_________________________________
 RGB_OUT VAR GPIO

'############################################################### 

 ANAPROGRAM:
 
    ZAMAN= 50       'ZAMANE*ZAMAN süresi kadar değer girilen LED'i yak
    
    RED= 255        'Kırmızı PWM değeri (Min= 0 / Max= 255)
    GREEN= 50       'Yeşil PWM değeri (Min= 0 / Max= 255)     
    BLUE= 150       'Mavi PWM değeri (Min= 0 / Max= 255)
    
    GOSUB PWM_LED
'--------------------------- 
    ZAMAN= 100
    
    RED= 150
    GREEN= 255     
    BLUE= 100
    
    GOSUB PWM_LED
'---------------------------
    ZAMAN= 25
    
    RED= 75
    GREEN= 120     
    BLUE= 255
    
    GOSUB PWM_LED

    GOTO ANAPROGRAM
 
'---------------------------
 PWM_LED:
    WHILE ZAMAN >0
 
    CRED = RED         'Önceden yüklenen değerleri kaybetmemek için-
    CGREEN = GREEN          'üzerine işlem yapılacak farklı bir- 
    CBLUE = BLUE                'değişkene kopyala.
 
 FOR ZAMANE = 0 TO 255
'--------------------------- 
 IF CRED = 0 THEN    'Kırmızı LED'e ait Değişkenin içeriği "0" ise 
    HIGH RGB.0        'RGB değişkeninin 0.bitini high yap
    ELSE                'Değilse Kırmızı LED'e ait Değişkenin içeriğini
    CRED = CRED -1        'bir azalt ve
    LOW RGB.0              'RGB değişkeninin 0.bitini low yap
 ENDIF
'--------------------------- 
    IF CGREEN = 0 THEN
        HIGH RGB.1
        ELSE
        CGREEN = CGREEN -1
        LOW RGB.1
    ENDIF
'--------------------------- 
        IF CBLUE = 0 THEN
            HIGH RGB.2
            ELSE
            CBLUE = CBLUE -1
            LOW RGB.2
        ENDIF
'--------------------------- 
    RGB_OUT = RGB     'RGB değişkeninin içeriğini GPIO portuna kopyala
 
    PAUSEUS 25
    NEXT ZAMANE             '255 kere tekrarla
    ZAMAN = ZAMAN -1     'zaman döngüsünün içeriğini bir azalt ve
    WEND                  'ZAMAN değişkenine atanan değer kadar tekrarla
    RETURN
 END

ete

Pic Basic Pro da HIGH Pin  şeklinde kullanılan bir komut aynı zamanda kullanılan pin'i de çıkış olarak ayarlar. Şayet programın başında pin ayarlamalarını yapmış iseniz komutu bu şekilde değil Pin=1 şeklinde kullanmanız tavsiye edilir. Bu şekilde daha az komut ile ilgili işlem yerine getirilir.

Programında önce bir değişkene ait bitler set edilmekte sonra bu değişken çıkış değişkenine verilmektedir. İşte karışıklık bu aşamada meydana gelmektedir.

Kullandığın komutlar yanlış değil ama 12F675 için uyumsuz. Bu nedenle,
HIGH RGB.0 şeklinde bir komut kullanmaktansa;
RGB.0=1 şeklinde kullanmak daha doğru olacak ve bu şekilde programında çalışacaktır.
Diğer bitlere ait komutlarıda değiştirirsen programın çalıştığını göreceksin.

Programcılıkta amaçlanan işlevi en kısa kod ile yapmak her zaman amaç olmalıdır.  Bu nedenle yazmış olduğun kodla ilgili bazı önerilerde bulunmak isterim.

Programda temel amaç RGB değişkenlerine verilen süreler kadar ilgili led lerin HIGH konumunda kalması arta kalan zamanlarda da LOW seviyesinde kalmalarıdır.

Kullandığın mantıkta her bir led için ikinci bir değişken kullanılması gerekiyor ve üstelik port un ledlere göre ayarlanması da ikinci bir değişken gerektiriyor. Ben olsaydım programı şöyle yazardım; Yalnızca Alt programı değiştireceğim o nedenle kodun o kısmını veriyorum.

PWM_LED:
    WHILE ZAMAN >0
 FOR ZAMANE = 0 TO 255
'---------------------------

     IF RED<=ZAMANE then 
        RGB_OUT.0=1
     else
        RGB_OUT.0=0
     endif

     IF GREEN<=ZAMANE THEN
        RGB_OUT.1=1
     ELSE
        RGB_OUT.1=0
     ENDIF
     
     IF BLUE<=ZAMANE THEN
        RGB_OUT.2=1
     ELSE
        RGB_OUT.2=0
     ENDIF
     PAUSEus 25
     NEXT
     ZAMAN=ZAMAN-1
     WEND
     RETURN

Bu şekilde program 12 word kadar kısalmaktadır. Bu programda belki önemli değil ama daha uzun programlarda bu mantık işine yarayabilir.
Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

papylon

@ETE hocam verdiğiniz bilgi doğrultusunda programı yeniden düzenledim ve dediğiniz gibi program her iki PIC'de de gayet güzel çalıştı, Çok Teşekkür ederim.

Tabiri caizse iki akşamdır bu küçük ama önemli ayrıntı yüzünden ot yoluyordum, gerçekten çok yardımcı oldunuz.
Vaktinizi ayırdığınız için ve verdiğiniz diğer değerli bilgiler içinde ayrıca çok teşekkür ederim.

Bu arada geç cevap yazdığım için özür dilerim. Bina içindeki Telefon hattında problem olduğundan  dolayı  4-5 gündür internete giremiyorum.



.

mustafa_cmbz

hocam basicte pwm gibi rgb  ledleri yavaşca kısıp açacak bir mantıkla yazılmış örnek kodunuz varmı acaba?

papylon

Sanırım bu soru sevgili ETE hocaya fakat yukarıdaki kod bu konuyla alakalı olduğu için yazayım dedim.
Gerçi Basic konusunda henüz çok acemiyim fakat, fikir vermesi açısından işinize yarayabilir.
Programın mantığı da  RED, GREEN ve BLUE Değişkeninin değerleri ile oynayarak renk geçişlerini sağlamak. Gerçi buradaki renk geçişleri oldukça keskin ve program epeyce uzun ama bir o kadar da  basit, bütün iş en altta bulunan kısa alt programda bitiyor.

@ DEVICE PIC12F675
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE PROTECT_OFF 
@ DEVICE BOD_ON
'_________________________________
 CMCON = 7 
 TRISIO = %001000 
 GPIO = %111111  
'_________________________________ 
 ZAMAN VAR BYTE
 ZAMANE VAR BYTE
 
 CRED VAR BYTE
 CGREEN VAR BYTE     
 CBLUE VAR BYTE
 
 RED VAR BYTE
 GREEN VAR BYTE
 BLUE VAR BYTE
 
 RGB VAR BYTE
'_________________________________
 RGB_OUT VAR GPIO

'############################################################### 
 
 ANAPROGRAM:
 
 ZAMAN= 50
 RED= 255
 GREEN= 0     
 BLUE= 0
 GOSUB PWM_LED
'---------------------------
ZAMAN= 50
 RED= 200
 GREEN= 0     
 BLUE= 0
 GOSUB PWM_LED
'---------------------------
ZAMAN= 50
 RED= 150
 GREEN= 0     
 BLUE= 0
 GOSUB PWM_LED
'---------------------------
ZAMAN= 50
 RED= 100
 GREEN= 0     
 BLUE= 0
 GOSUB PWM_LED
'---------------------------
ZAMAN= 50
 RED= 50
 GREEN= 0     
 BLUE= 0
 GOSUB PWM_LED
'---------------------------
ZAMAN= 50
 RED= 50
 GREEN= 100     
 BLUE= 150
 GOSUB PWM_LED
'--------------------------- 
 ZAMAN= 50
 RED= 40
 GREEN= 255     
 BLUE= 20
 GOSUB PWM_LED
'---------------------------
ZAMAN= 50
 RED= 40
 GREEN= 200     
 BLUE= 70
 GOSUB PWM_LED
'---------------------------

 GOTO ANAPROGRAM
 
'---------------------------
'#####################################################################
 PWM_LED:
'#####################################################################
 WHILE ZAMAN >0

 CRED= RED
 CGREEN= GREEN     
 CBLUE= BLUE
 
 FOR ZAMANE= 0 TO 255
 
 IF CRED= 0 THEN
    RGB.0 = 1
 ELSE
    CRED= CRED -1
    RGB.0 = 0
 ENDIF
 
 IF CGREEN= 0 THEN
    RGB.1 = 1
 ELSE
    CGREEN= CGREEN -1
    RGB.1 = 0
 ENDIF
 
 IF CBLUE= 0 THEN
    RGB.2 = 1
 ELSE
    CBLUE= CBLUE -1
    RGB.2 = 0
 ENDIF
 
 RGB_OUT = RGB
 
 PAUSEUS 25
 NEXT ZAMANE
 ZAMAN =ZAMAN -1
 WEND
 RETURN
 END

ete

RGB led sürülebilmesi için 3 adet donanımsal PWM çıkışına ihtiyaç vardır. Pek çok bilinen pic de bu 2 adet olarak verilmiştir. Şimdiye kadar bir kere lazım oldu onda da Pic16F777 kullandım. Bunda 3 adet HPWM mevcut.
Benim ders notlarında 11 nolu ders te her birinin 10 bir olarak nasıl kullanılacağı açıklanmış vaziyette. Üçüncüsü onlara bakıp ilave edilebilir.
Hazırda kullanılabilir bir kod yok maalesef. Hep farklı amaçlar için yazılmış şeyler var.

>Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mustafa_cmbz

16f7x7 serisi piclerde 3 adet pwm varmış hocam onlardan alıp sorunu öyle çözeceğim...iyi çalışmalar...

mustafa_cmbz

Alıntı yapılan: "ete"

Pic16F777 kullandım. Bunda 3 adet HPWM mevcut.


ete hocam Pic16F777 için isis model dosyası nereden bulabilirim_?