M

PicBasic 'de İçinden Çıkamadığım Sorun

Başlatan mavikaplan, 05 Ağustos 2012, 11:25:28

mavikaplan

Arkadaşlar 4x3 [4 satır 3 sütun] keypad oluşturdum ancak çok ilginç bir sorun var. Tuş okuma kodlarını şu şekilde yazdığımda program hatasız çalışıyor:
portd=%00001000
tara=portd
if portd.0==1 then sayim=1
if portd.1==1 then sayim=2
if portd.2==1 then sayim=3
portd=%00010000
if portd.0==1 then sayim=4
if portd.1==1 then sayim=5
if portd.2==1 then sayim=6
portd=%00100000
if portd.0==1 then sayim=7
if portd.1==1 then sayim=8
if portd.2==1 then sayim=9
portd=%01000000
if portd.0==1 then sayim=10
if portd.1==1 then sayim=11
if portd.2==1 then sayim=12

Ancak şu şekilde yazıp derlediğimde, devredeki tuşlara basınca 7-Segment Display 'da Anlamsız Rakamlar Görmekteyim :
portd=%00001000
if portd.0==1 then sayim=1
if portd.1==1 then sayim=2
if portd.2==1 then sayim=3
portd=portd<<1
if portd.0==1 then sayim=4
if portd.1==1 then sayim=5
if portd.2==1 then sayim=6
portd=portd<<1
if portd.0==1 then sayim=7
if portd.1==1 then sayim=8
if portd.2==1 then sayim=9
portd=portd<<1
if portd.0==1 then sayim=10
if portd.1==1 then sayim=11
if portd.2==1 then sayim=12


ete

Display tarama süresini ne aldınız belli değil.
Zaman kritik ise;
portd=%00010000
Yerine
portd=Portd<<1
komutları arasında sadece komut işleme süresi farkı vardır. Sonuç her ikisinde aynı olmakla birlikte birisini diyelimki 2 komut çevriminde yapıyor diğerini 10 komut çevriminde yapıyordur ve böylece bu gecikme de display taramasını sekteye uğratıyordur. Başkada bir açıklaması yok.

Ete

mavikaplan

#2
7 Segment Display 'da Görünme Süresi 1ms idi, bunu 3 milisaniye yaptım ama yine değişen bişey olmadı.

Kodların Tamamı Şu Şekilde :
segment var portb
aktif var portc
trisb=0
trisc=0
trisd=%00000111
tara var byte
i var byte
sayi var byte
sayim var byte
sayim=0
sayi=0

basla:
portd=%00001000
if portd.0==1 then sayim=1
if portd.1==1 then sayim=2
if portd.2==1 then sayim=3
portd=portd<<1
if portd.0==1 then sayim=4
if portd.1==1 then sayim=5
if portd.2==1 then sayim=6
portd=portd<<1
if portd.0==1 then sayim=7
if portd.1==1 then sayim=8
if portd.2==1 then sayim=9
portd=portd<<1
if portd.0==1 then sayim=10
if portd.1==1 then sayim=11
if portd.2==1 then sayim=12

yaz:
if sayim==11 then sayim=0
portc=3 ' 7-Segment 'i Pasif Tut
segment=sayim dig 0
gosub sevenseg
portc=1
pause 5
portc=3 ' 7-Segment 'i Pasif Tut
segment=sayim dig 1
gosub sevenseg
portc=2
pause 5
goto basla

sevenseg:
portc=3 ' 7-Segment 'i Pasif Tut
if segment==0 then segment=$3F
if segment==1 then segment=$06
if segment==2 then segment=$5B
if segment==3 then segment=$4F
if segment==4 then segment=$66   
if segment==5 then segment=$6D
if segment==6 then segment=$7C
if segment==7 then segment=$07
if segment==8 then segment=$7F
if segment==9 then segment=$6F
return


Proteus Dosyası : https://docs.google.com/open?id=0Bw2zrnpVqvJ0S1ROd1o0VHFCSTA
Hex Dosyası : https://docs.google.com/open?id=0Bw2zrnpVqvJ0SFl3NXRDUEh3dWM

ete

Program mantığı yanlış değil ancak benim kullanmadığım bir yöntem.
Sanki derleyicide buna isyan eder gibi bir hali var. Anlamsız şeyler yapıyor.
PBP derleyicisi en oturmuş derleyicilerden birisidir. Ama burada gördüklerimden sonra bu düşüncem değişti.
Ama yinede sanki bize bir şey söylemek ister gibi bir hali var. Senin programda derleyicinin sorun olarak gördüğü iki husus var.
Birincisi Segment değişkenini önce digit değeri oalrak alıp sonra segment değerine çevirmen. Burada derleyici iki işlem için ayrı değişkenler kullanılmasını daha doğru bulur.
İkincisi ise PORTD=PORTD<<1 şeklindeki komut.  Nedenini anlayamadım ama bu komutu sevmiyor .

Bunları düzeltirsen program sorunsuz çalışıyor enteresan !!!!

Ete


mavikaplan

#4
Kaç 2 gün bu konu üzerine kafa yordum hiç Picbasic 'in bir sorunu olduğuna hiç ihtimal vermedim, sorunun benim yaptığım muhtemel bir hatanın neden olduğunu düşünüyordum. Demek sorun PicBasic 'deymiş :).

Peki bildiğiniz çok kararlı çalışan, hiç bir sorun yaşamayacağım bir derleyici tavsiyesiniz var mı? İlla basic dili olması gerekmez, C 'de biliyorum ama hiç ccs c, micro c yada hi-tech c derleyicilerini kullanmadım direk picbasic kullanmaya başladım :). Çünkü çok uzun bir program yazsam, ve sorun derleyiciden dolayı kaynaklanıyor olsa kodları 100 defada kontrol etsem hatayı bulamam çünkü hata benim hata değil , derleyicinin hatası bundan dolayı hatayı bulmak çok zor.

ete

Öncelikle bu yaptığın devreyi hatalı olduğunu düşündüğümüz programla gerçek sistemde çalıştırmanı isterdim.
Acaba bizmi hata yapıyoruz yoksa derleyicimi?.
Bunu neden söylüyorum diye sorarsan bundan 5 sene evvel simulasyon programı sistemin nasıl bağlı olduğuna bakmaksızın sistemi çalıştırabiliyor idi. Ama son sürümler gösteriyorki usulüne uygun bağlanmayan devrelerde bu şekil sorunlar çıkartarak belkide kullanıcıyu uyarıyorlardır. Olayı yalnızca derleyici hatası gibi düşünmemek gerekir.

Sisteminiz gerçeğe uygun kurulup o şekilde derlendğiniz bir programı çalıştırmalıdır. Mesela hiç bir devrede 7 segment displayler işlemciye direk bağlanmaz. Her bir segment  1 led den oluştuğuna göre ve led ise 2V civarında bir voltajla çalıştığına göre arada akım sınırlama direnci olması gerekir. Siz direk bağlamışsınız. BU sorun derleyicinin olduğu kadar simulasyon programının hatasıda olabilir. O halde devrenizi gerçek değerler üzerindenbağlamak gerekir. Ortak uçlar üzerinden geçen akım 120 ma dir. Siz direk pic pinine bağlamışsınız. Bu mantıklımı sizce. Gerçekte bunu yapsanız işlemciniz direk yanacaktır. Zira işlemci ancak 20 ma akıma müsaade eder fazlasında hemen yanar yada bozulur.
BU nedenle deneme yaparken devrelerinizide gerçeğe uygun kurmanızı tavsiye ederim.

Diğer taraftan bütün derleyicilerin az çok bug (hataları) vardır. BUnların pek çoğu zararsız olduğu için göz ardı edilir veya zaman zaman düzeltilirler. Elbette bütün hataların bir seferde görülüp düzletilmesi beklenmez. Bu nedenle düzeltme işi zaman alan bir unsurdur. Ayrıca ücretli satılan derleyicilerin kırma işlemi sonucu bir veya birden fazla bölümlerinin hasar gördüğünüde unutmayın. Mükemmeli aramak yerine elinizdeki ile yetinin diyorum kısaca.
Paranız varsa gidin orjinal derleyiciyi alın deneyin sorun var ise üreticisi ile cebelleşin başka çaresi yok.

Ete

mavikaplan

Hocam dediğiniz gibi direnç koydum 7-segment 'in bacaklarının önüne, katot uçlarınıda pnp transistör ile sürdüm ama değişen birşey yok sonuç yine aynı. Devrede sorun yokta, derleyici hatalı olduğundan kaynaklanıyor. Uzun bir program yazmaya kalkınca derleyiciye o kadar güvenilmemesi gerektiğini gördüm, tabii sizin dediğiniz gibi zamanla düzeltilir bu hatalar.

ete

PORTD=PORTD<<1  komutunu sevmiyor her nedense. Bunun yerine şöyle denedim.
SIRA=8 ve taramalrda SIRA=SIRA<<1:PORTD=SIRA  şeklinde komut kullanırsam hata yapmadan çalışıyor.
Bu durumda PORTD sanki geri planda bir başka amaçla anlık olarak kullanılıyor gibi sanki.
Elbette bu mantıkla taramalı display sürülmez. Bu şekilde kullanım programını bağlar ve uzun işler yapamazsın. Display sürmenin yolu kesme ile tarama yapmaktan geçiyor. O şekilde kullansan belkide hiç sorun çıkmaz.
Her neyse bizde öğrenmiş olduk bu bir bug olsa gerek. Ama hala derleyicidenmi yoksa simulasyondan mı kaynaklanıyor emin olamadım.

Bu derleyici ile çok uzun programlar yazdım yazıyorumda. Öyle işler yaptırıyorumki zannedersiniz deveye hendek atlatıyorum. Hiç falso vermiyor. Bazı taknıtılar çıkmıyor değil ama onlarıda yukarıda verdiğim örnek benzeri çözümlerle aşıyorum.
Sonuçta bana göre en az hata ile çalışan derleyici . C derleyicilerini bilemiyorum. Ama uzaktan takip ettiğim kadarı ile onlarda da benzer sorunlar fazlası ile çıkıyor.

Ete

mavikaplan

Hocam birde merak ettiğim bir konu var. Portd=%00001000 iken mesela 1. Tuşa bassak display 'de görünen sayıyı "01" yapacaktır. Ama tuşa biraz uzun bassak, Portd=%00010000 olduğu zaman yani tuş takımının bir alt satırını taradığı zaman sayıyı "04" yapması gerekmezmi?

ete

Gerekmez cunku 1 tusu yalnızca portD.0'ı high yapar digerlerini yapamayacağı içinde hep 1 sayısını görürsün. Tersi olsa idi tuş takımı çalışmazdı zaten.
Ete

mavikaplan


Powered by EzPortal