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_?