Bir aceminin soruları

Başlatan sunbae, 31 Mart 2016, 12:04:03

sunbae

Herkese merhaba;

Elektronik sektöründe çalışan birisi olarak hobi amaçlı pic basic öğrenmeye karar verdim. Gerçi 1985 gibi Sinclair spectrum bilgisayarımda basic öğrenmiştim ama 30 senede hiç bir şey kalmamış kafamda. (Basic yok ama Z80 ve 6502 makine dili bilirim. Yaş 47)

Hobi amaçlı bir projemde pic kullanmaya karar verince (18F6520) programlama öğrenmek şart oldu. Genel anlamda C ve türevlerinden hiç birşey anlamıyorum. Picbasic'i daha kolay görüyorum.
Kod denemeleri yazmaya başlayalı henüz 2-3 gün oldu.
Denemelerimde bazı şeyler dikkatimi çekti.
1 - start:     
        if onoff="0" then
            goto start
        endif
gibi bir satırda if komutunun şartı tırnak içinde verilirse programın uzunluğu 4 bayt azalıyor. Kısaca tırnak olmalı mı, olmamalı mı?

2 - Komutları endif komutu kullanmadan
start:
if onoff="0" then start
şeklinde veya

if onoff="0" then goto start
şeklinde yazsamda hatasız derleme yapılıyor.

if-then komutlarını endif ile kullanmak şart mı?

3 - pcb tasarımında kolaylık olması açısından yaptığım bağlantı gereği portlara giden bilginin işlenmesi gerekiyor.
Bitlerin sırasının ters çevrilmesi lazım. Okunan datanın bitleri programda 0<>7, 1<>6, 2<>5, 3<>4, 4<>3, 5<>2, 6<>1 ve 7<>0 olarak değerlendirilmesi lazım.
Bunun için bit swap tarzı bir basic komutu yok zannedersem. asm tecrübelerime dayanarak bu işi ancak shift left/right tarzı pic asm komutları ile yapabilirim gibime geliyor.

Aklımdakiler şimdilik bunlar.
Herkese kolay gelsin.

ete

Aramıza hoş geldiniz.
Direk soruların yanıtlarına geçeyim.
1. if onoff="0" then  şeklinde bir kullanım derleyici açısından yanlış değil ama amaç açısından yanlıştır.
Dolayısıyla derleyici bunu hatasız derler. Aslında derlememesi gerekir. Zira tırnak içinde verilen ifade onun ASCII karşılığını gösterir : OnOff ise bir pine karşılık gelen bit bazında bir birimdir. Bit=byte oluyor buda mantığa ters gelmesine rağmen değerlendirmede Byte'ın ilk biti bu konuda değerlendirilir. Yada hiç değerlendirilmiyordur.

Amaç açısından neden yanlış onu açıklayayım. Burada temel ama OnOff biti LOW ise (Yada 0 ise) giti şu işi yap diyorsunuz. Ama bu bu şekilde yazarsanız program o biti ("0") olarak görmez 49 olarak görür. Bu nedenle hiç bir zaman o if karşılaştırması doğru çalışmaz. İşin doğrusu if onoff=0 then şeklinde kullanım olacaktır.

2. If komutlarında Endif kullanmanın belirli kuralı vardır. Şayet kullandığınız if karşılaştırması tek şart içeriyor ise o zaman THEN kelimesinden sonra şartınızı koyar ve endif kullanmadan bunu yapabilirsiniz. Örnek vereyim;
IF PORTA.0=1 THEN LED=1  şeklindeki ifadede tek şart vardır. PORTA.0=1 ise LED=1 olacaktır. Burada Endif kullanmadım.
Ama aynı ifadeyi ;
IF PORTA.0=1 THEN
  LED=1
ENDIF
şeklinde de yazabilirim buda doğrudur. Dikkat ettiniz ise LED=1 ifadesini alt satıra yazdım. Bu aslında birden fazla şart unsuru olma şeklidir ve bu gibi durumlarda şartın nerede bittiğini göstermek açısından ENDIF kullanılması zorunludur.
Benzer şekilde ;
IF PORTA=1 THEN
  LED=1
  GOTO ETIKET1
ENDIF
şeklindeki bir kullanımda 2 şart yerine getirildiği için mecburen şartları alt satıra yazıyoruz ve şartların bittiği yerede bir ENDIF ilave ediyoruz ki bu zorunluluktur.

IF PORTA,0=1 THEN ETIKET demek ile GOTO ETIKET demek aynı anlama geliyor ve ben genelde kısa olanını daima tercih ediyorum. Ama alt satıra yazınca ETIKET deyip bırakamıyorsunuz orada GOTO ETIKET yazmak zorundasınız.

3.Bitlerin yer değiştirilmesi için REV diye bir komut var. Kullanım şekli daima 0 nolu bitten başlamak üzere REV x şeklindedir. X burada kaç adet bitin ters çevrileceğini gösterir. Örnek vereyim , elimizde A=%10101100 şeklinde bir sayı olsun burada ilk 4 biti ters çevirmek istersek
B=A REV 4  veya B=%10101100 REV 4 şeklinde komut kulandığımız taktirde B de şunları görürüz %10100011
Bu komut 16 bit üzerinden de çalışabilir.

Çok gerekirse bir döngü ile istediğiniz bitleride yer değiştirmeniz mümkün olabilir.
A=%10101100 bitlerinden 5 den başlayarak 2 ye kadar olan bitleri yer değiştirmek istersek,
A=%10101100
      INDEX=5
      FOR I=2 to 5
        ARA.0[I]=A.0[INDEX]
        INDEX=INDEX-1
      NEXT

şeklinde yapılabilir.

Yalnızca iki biti bir biri ile yer değiştirmek için bitleri bir birine eşitlemeniz yeterli olur.
A.bit0=A.bit7 gibi yada A.0=A.7 de diyebilirsiniz. Bit kaybı yaşamamak için önce ilgili biti bir ara değişkene atabilir sonra oradan alıp diğerine eşitleyebilirzinizde. Temp=A.0 : A.7=TEMP gibi. (Temp burada bit değişkeni olacak)

Umarım anlaşılmıştır.
Ete

sunbae

Özetlersem;

1 - Bit bazında kontrol yapılacaksa tırnak kullanılmayacak.
2 - IF şartları yerine getirildikten sonra tek işlem yapılacaksa ENDIF kullanılmayacak.
3 - IF şartları yerine getiridikten sonra birden fazla işlem yapılacaksa THEN'den sonra birşey yazılmayacak. Yapılması gerekenler alt alta yazılıp ENDIF ile bitirilecek.

Teşekkür ederim.

Powered by EzPortal