Yazdığım kodda nersi hatalı?

Başlatan AlbatroS, 20 Haziran 2015, 23:29:59

AlbatroS

Arkadaşlar ve değerli üstadlar micro code studioda bir kod yazdım,isis te sorunsuz çalıştı hemde tam istediğim gibi ama breadboard üzerine devreyi kurduğumda devre tutarsız çalıştı hatta çalışmadı bile denebilir.

Ofis bilgisayarında çalıştığım için şuan resim koyamadım ama detaylı şekilde yazarak anlatayım...

yazdığım kod;

TRISA = 1
TRISB = 0

PORTA = 1
PORTB = 0

PAUSE 200

BEKLEME:
IF PORTA.0 = 0 THEN 
GOTO SEC
ELSE 
GOTO BEKLEME
ENDIF

SEC:
IF PORTA.0 = 0 THEN
GOTO HAZIR
ELSE 
GOTO KAPAMA
ENDIF

HAZIR:
IF PORTA.0 = 1 THEN 
GOTO KAPAMA
ENDIF
IF PORTA.1 = 0 THEN
GOTO ALARM
ELSE 
GOTO HAZIR
ENDIF

KAPAMA:
PORTB.1 = 0
PORTB.2 = 0
PORTB.3 = 0
GOTO BEKLEME

ALARM:
IF PORTA.0 = 1 THEN 
GOTO KAPAMA 
ELSE 
PORTB.1 = 1
PORTB.2 = 1
PORTB.3 = 1
GOTO ALARM
ENDIF

END


Bu kodlar isite sorunsuz çalıştı ama board üzerinde şöyle bir hata verdi devreye enerji verdiğimde porta.0 lojik bir olmasına rağmen "if porta.0 = 0 " olduğunda yapmasını istediğimi yapıyor.dolayısıyla sırasıyla önce "SEC:" etiketine oradan da "HAZIR:" etiketine geçiyor.porta.0 ve porta.1 lojik 0 olsa bile kapama etiketine geçmiyor

Biliyorum biraz uzun bir yazı oldu ama inanın sinir oldum neden direk sıfır olarak algılıyor olabilir?
pic16f628a kullanıyorrum bua rada.
Vereceğiniz cevaplar için şimdiden teşekkür ederim...
Bilmemek değil , öğrenmemek ayıp.

vitruvius


AlbatroS

#2
dediğim gibi şu an evdeyim ama istersen a4 kağıda elleçizip ekleyebilirim zaten basit bir devre


mesaj birleştirme:: 20 Haziran 2015, 23:53:28

yarın sabah sırf bu iş için ofise gideceğim,saat 9:00 da tam devre resmi ve yazdığım kod u ekleyeceğim ...
Bilmemek değil , öğrenmemek ayıp.

kayatech

Sen PORTA.1 'İ giriş olarak ayarlmamışsın. TRISA=1 demek porta.0 "1" diğerleri "0" demektir.


TRISA.1=1

Bunu da ekle dene istersen.
ayrıca PORTA=1 'i de sil. A portuna 1 bilgisini göndermeye çalışır.

Hiçbir konfigrasyon ayarın yok kodda. Hangi entegre hangi osilatör hiçbirşey yok ve belli değil. Ama sen yine de TRISA.1 =1 ekleyip dene.

ete

#4
Arkadaşlar sorunlara değinmişler ama ben bir toparlayayım istedim;
1. Hiç bir sigorta ayarın yok. Programın başına aşağıdakileri eklemen gerekiyor.
'@ DEVICE pic16F628 'islemci 16F628A
'@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali
'@ DEVICE pic16F628, PWRT_ON 'Power on timer acik
'@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
'@ DEVICE pic16F628, MCLR_ON 'MCLR pini kullaniliyor.
'@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
'@ DEVICE pic16F628, LVP_OFF
'@ DEVICE pic16F628, BOD_OFF
'64 BİT MAKİNALAR AŞAĞIDAKİ SİGORTA AYARINI KULLANIN
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

2. Hangi frekansta çalıştığında belli değil programa aşığdaki satırı eklemen gerekiyor
Define OSC 4

3. 16F628 de A portu default (önseçimli), komparatör olarak açılır. Bu nedenle komparatörleri iptal etmen gerekir yoksa A portun düzgün çalışmaz. Aşağıdaki satırı programa eklemen gerekiyor.
CMCON=7

4. TRIS registeri hangi port pininin giriş, hangisinin çıkış olacağını belirler. Bit bazında "1" verilen bitler giriş , "0" verilen bitler ise çıkış olarak çalışır. Programa bakınca sende PORTA.0 ve PORTA.1 pinleri giriş olarak çalıştığı anlaşılıyor. Bu durumda TRISA=1 vererek sen yalnızca PORTA.0 pinini giriş yapmışsın. Bunun yerine,
TRISA=%00000011 şeklinde komut vermen gerekiyor.

5. PORTA=1 şeklindeki komut, giriş olarak ayarladığın bir port pinine sanki çıkışmış gibi değer vermeye  çalışır. Giriş olarak ayarlanmış pinlere çıkış değeri verilemez artık o çıkıştır versende bir işe yaramaz dolayısıyla PORTA=1 komut satırını silmen gerekir.

6. Buraya kadar olan hataları açıklandığı şekli ile düzeltirsen sorun muhtemelen giderilecektir. Ancak programa bakınca zincirleme reaksiyon gibi programı sürekli ordan oraya atlattığını görüyorum. Bu programcılıkta pek kullanılmayan mantıktır. Bir kere aktarıp artık orada ne yapmak istersen yapman gerekir. Bu şekilde de çalışır ama bir hatan olduğu zaman takip etmekte çok zorlanırsın.
Ayrıca bir tuş'a basılması durumunda programı bir etikete yönlendirdikten sonra orada ayrıca aynı tuşa basılmış mı diye bakmanında bir anlamı yok. Çünki oraya zaten basılı gelecektir. O kısımda diğer alternatifleri veya tuşun bırakılma durumunu test edebilirsin.

Mesela aşağıdaki iki etikete bakalım;
BEKLEME:
IF PORTA.0 = 0 THEN 
GOTO SEC
ELSE 
GOTO BEKLEME
ENDIF

SEC:
IF PORTA.0 = 0 THEN
GOTO HAZIR
ELSE 
GOTO KAPAMA
ENDIF

Burada şayet PORTA.0 daki tuşa basılırsa SEC etiketine git demişsin basılmaz ise tekrar bekleme isimli etikete yönlendirmişsin.
Tuşa basılır basılmaz program hemen SEC etiketine gidecek ve orada basılmaması gibi bir durum söz konusu olamayacağı için hemen HAZIR isimli etikete yönlenecektir programın. Ohalde bu iki etiket birleştirilebilir . Kapama isimli etikette bütün çıkışlar kapatıldığına göre, bu iki etiket birleştirilip tek etiket altında şöyle yazılabilirdi.
BEKLEME:
IF PORTA.0=0 THEN HAZIR
PORTB.1 = 0
PORTB.2 = 0
PORTB.3 = 0
GOTO BEKLEME

Böylece HAZIR isimli etikete kadar olanları silebilirsin artık. Geldik HAZIR isimli etikete orada da bir başka sorun var.
Bu etikette şayet PORTA.0 tuşunu bırakırsam program tekrar KAPAMA isimli etikete gidiyor. Ama bırakmadan PORTA.1 tuşuna basarsam program ALARM isimli etikete gidecek. Burada aynı anda iki tuşa basılmasını şart koymuşsun anlaşılan. Mantık bu ise ,bu satırlarıda BEKLEME isimli satıra ekleyerek programı dahada kısaltabiliriz.  Şöyle,
BEKLEME:
IF PORTA.0=0 THEN 
  while PORTA.0=0 
    IF PORTA.1=0 THEN ALARM
  WEND
ENDIF    
PORTB.1 = 0
PORTB.2 = 0
PORTB.3 = 0
GOTO BEKLEME

Böylece HAZIR isimli etiket ve altındakilerde kalkmış olacaktır.
Teorik olarak KAPAMA isimli etiketide ortadan kaldırabiliriz. Fazla bir fonksiyonu kalmadı çünki.
Geriye ALARM isimli etiket kaldı. Onuda aşağıdaki şekilde düzenlemek daha doğru olurdu. Zira önce asıl amacı yerine getirmeklazım. Asıl amaç , program bu satıra gelirse PORTB.1-2-3 pinlerini HIGH yapmak olduğuna göre önce bunları HIGH yaparım sonra PORTA.0 tuşu bırakıldımı onu test ederim. Daha doğrusu tuş bırakılıncaya kadar orada beklerim. Bırakılıncada tekrar en başa döner HIGH olan pinleri orada sıfırlayarak yeniden tuş basılmasını beklerim. Aşağıdaki gibi.
ALARM:
PORTB.1 = 1
PORTB.2 = 1
PORTB.3 = 1
WHILE PORTA.0=0:WEND
PAUSE 50
GOTO BEKLEME


Böylece bütün o yazdıkların iki etikette toplanmış olacak ve mantık yürütmek açısından program daha tutarlı hale gelecektir.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

AlbatroS

Hocam çok teşekkürler dediğiniz gibi yaptım şu anda sorunsuz çalışıyor.Sigorta ayarı yapmamıştım sanırım dediğiniz gibi ondan oldu.Vakit ayırıp cevap veren herkese çok teşekkürler...
Bilmemek değil , öğrenmemek ayıp.