pbp pin dizilimi

Başlatan kotan04, 16 Mart 2011, 09:05:49

kotan04

mrb arkadaşlar pbp 16f628a kullanarak çeşitli led efektleri yapıyorum fakat bendeki pin dizilimi farklı olduğu için kodları kısaltmanın yolunu bulamadım bendeki pin dizilimi

ra1 ra0 ra7 ra6 rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 ra4 ra3 ra2

portb=%00000001 : porta=%00000001 gosub bekle

şeklinde yaptığımda inanılmaz uzun oluyor ben bunu arıtmatik işlemler veya for next ile yapmak istiyorum bu seferde pin dizilimim farklı yukarda yazdığım gibi nasıl bir yol izlemem lazım arkadaşlar bin dizilimini düzeltemem bilginize iyi çalışmalar
kkkkoootttaaannn000444

My75

#1
LEDA   VAR PORTA
LEDB   VAR PORTB


porta.4  (min.470ohm - max.1k pullup yapmalısın)

LEDA=0
LEDB=0

BASLA:

'Sendeki dizilime göre desimal değer vererek en basit olarak,

leda=2    ' porta=%00000010
leda=1    ' porta=%00000001
leda=64  ' porta=%01000000
leda=32  ' porta=%00100000
ledb=64  ' portb=%01000000
ledb=32  ' portb=%00100000

Bu mantıkda istediğin gibi oluştur.  128-64-32-16-8-4-2-1
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

kotan04

peki hocam mesela sağa sola kaydırmalı yapmak istersem nasıl bir yol izleyerek yapabilirim ? mesela

i var byte
j var byte
trisb=0
basla:
j=1
for i=0 to 7
  portb=j
  j=j*2
  pause 150
next i
goto basla


forum sayfalarında arkadaşın biri port b içinde böyle bir  yöntem ile yapmış ben bunu port a ve port b de bendeki pin dizilimine göre yapmak istersem nasıl yapmam gerekir ?
kkkkoootttaaannn000444

Nedenler

#3
Sağa sola kaydırmayı kaydırma operatörüyle yapacaksın.

<< yada >> Örneğin PortB=%00000001 olsun.

Sen PortB=PortB<<1 yaparsan o 1 olan biti sola doğru birer tane kaydırırsın. Kayma sırasında 1 bitinin bulunduğu eski konuma bir arkasaında ki bit yerleştirilir. Bu işlemin sonunda PortB 00000010 olur. Birdaha kayma uyguladığında 00000100 olur. Böylece ledleri kaydırarak sırayla yakmış olursun.

Düzenliyorum ilk mesajını okumamıştım. Word tipinde bir değişken tanımla örneğin Ledler olsun. Ledler değişkenini anlattığım şekilde for ile döngüye sokarak kaydır. Daha sonra şunu yap;

ra1 ra0 ra7 ra6 rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 ra4 ra3 ra2

PortA,2=Ledler,0
PortA,1=Ledler,14
PortA,0=Ledler,13
PortB,1=Ledler,4

Basicde bunları yapabiliyormuydun tan hatırlamıyorum ama yanlışlık varsa kusura bakma

kotan04

merhaba kaydırma oparatörüyle yapacağım ama
bendeki pin dizilimi bu şekilde ra1 ra0 ra7 ra6 rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 ra4 ra3 ra2  buna nasıl uyarlayabilirim?
kkkkoootttaaannn000444

My75

#5
Ordaki formül yine bcd karşılığını alacak şekilde yapılmış,her döngüde 2 ile çarparak değerleri artırmış.

x    var   byte
led var   byte

basla:

for  x=0 to 3   'porta.1,0,7,6  için

lookup x,[2,1,64,32],led
porta=led
pause 200
next
porta=0

for  x=0 to 7   'portb.7,6,5,4,3,2,1,0 için

lookup x,[128,64,32,16,8,4,2,1],led
portb=led
pause 200
next
portb=0

for  x=0 to 2   'porta.4,3,2 için

lookup x,[16,8,4],led
porta=led
pause 200
next
porta=0

goto basla

Senin pin dizilimine göre kayan led ama çok uğraşırsın..Orjinal sıralamayı kullansan arkadaşın gösterdiği şekilde kolay olurdu..






Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

kotan04

#6
Alıntı yapılan: My75 - 16 Mart 2011, 10:30:31
Ordaki formül yine bcd karşılığını alacak şekilde yapılmış,her döngüde 2 ile çarparak değerleri artırmış.

x    var   byte
led var   byte

basla:

for  x=0 to 3   'porta.1,0,7,6  için

lookup x,[2,1,64,32],led
porta=led
pause 200
next
porta=0

for  x=0 to 7   'portb.7,6,5,4,3,2,1,0 için

lookup x,[128,64,32,16,8,4,2,1],led
portb=led
pause 200
next
portb=0

for  x=0 to 2   'porta.4,3,2 için

lookup x,[16,8,4],led
porta=led
pause 200
next
porta=0

goto basla

Senin pin dizilimine göre kayan led ama çok uğraşırsın..Orjinal sıralamayı kullansan arkadaşın gösterdiği şekilde kolay olurdu..
programı derledim fakat ra 7 high olmadı diğerlerinde normal çalışıyor demiştim hocam gözden kaçan kısmı düzelttim

fakat şimdi hatanın ne olduğunu buldum
lookup x,[2,1,128,64],led
porta=led
pause 200
next
porta=0

kkkkoootttaaannn000444

My75

#7
:) Doğrudur,o kadar iş içinde gözden kaçmış..sanırım mantığı anladın,gerisini halledersin artık..kolay gelsin..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

kotan04

simüle ettim tamamdır düzelttim hocam

lookup x,[2,1,128,64],led bu kısımı düzelttim
porta=led
pause 500
next
porta=0


sayın hocam birde ben şu şekilde bir düzenlemede yapmak istiyorum verdiğiniz referans kodla mümkün olabilirmi?

ra1 ra0 ra7 ra6 rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 ra4 ra3 ra2

arttırarak kayma olursa
örneğin

1
11
111
1111
11111
111111
1111111
ayrıca yardımlarınızdan dolayı çok teşekür ederim..

kkkkoootttaaannn000444

My75

#9
Tabiki olur,indeks içindeki rakamları yapmak istediğin şekilde düzenle mesela verdiğin örnek için

lookup x,[1,3,7,15,31,63,127,255],led   'orjinal port için geçerli,kendi pin yapına göre aşağıdaki gibi toplayıp düzenleyeceksin.

Bak mesela sadece a7 ve a0 yakmak istiyoruzsak desimal karşılıklarını toplayacaksın,128+1=129 yazdınmı sadece porta' nın 7 ve 0 pinleri high olur.Fakat portlar arası geçişleri yine yukarıdaki gibi yapmalısın...Yani A 'dan B'ye geçerken A'yı sıfırlaman,tekrar A'ya geçerkende B'yi sıfırlaman şart.

Tüm çıkış portları için geçerli

porta.0   'high desimal değeri 1
porta.1   'high desimal değeri 2
porta.2   'high desimal değeri 4
porta.3   'high desimal değeri 8
porta.4   'high desimal değeri 16
porta.5   'high desimal değeri 32    'Çıkış olarak kullanılmaz porta için geçerli durum.
porta.6   'high desimal değeri 64
porta.7   'high desimal değeri 128

Bunlara karşılık gelen hangi portu high yapmak istersen o değerleri toplayacaksın..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

kotan04

evt hocam dediğiniz gibi deniyorum şimdi oluyor
kkkkoootttaaannn000444

ete

Geri plandan bakıyordum. Yardım gelince ses etmedim. Bir iki şey ekleyeyim.
İşin mantığını çözmüş görünüyorsun ama bilgin pekişsin diye yeniden açıklayayım.
8 bitlik bir port pinlerinin her birinin high olması durumunda aldığı desimal değer vardır.  Bu değerler sağdan sola doğru 1 sonar 2 sonra 4 sonra 8 sonra 16 sonra 32 sonra 64 ve sonunda 128 olarak devam eder.  Aynı anda birden fazla pinin high olması durumunda her bir pine karşlık gelen desimal değerler toplanır.  Örneğin %00000011 şeklindeki bir ifadede PortX.1 ve PORTX.0 pinleri high dır. Bunların değerleri 1 ve 2 olduğundan porta verilecek toplam değer 1+2 =3 şeklinde hesaplanır.

Bu açıklamadan sonra artırarak kaydırma soruna cevap bulalım;

Önce pin sıralamanı yeniden yazalım;
ra1 ra0 ra7 ra6 rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 ra4 ra3 ra2
Şimdi ilk değer =1 olacak . Bunu Ra2=1 şeklinde de yapabilirsin yada RA.1=1 şeklinde de yapabilirsin.
Sıralama rakamlarını sola yaslı hazırladığına göre ikinci geçerli sanırım.
1   değeri için RA.1=1 olması gerek.  ..............................Yani Porta=2
11 değeri için  RA.1=1 ve RA.0=1 olması gerek ..............Yani PORTA=3
111 değeri için  portA=%10000011  ..............................yani PortA=131  (128+2+1)
1111 değeri için  PortA=%11000011 .............................yani PortA=195   (128+64+2+1)
11111 değeri için  PortA=%11000011 ve PortB=%10000000,  .........yani PortA=195 ve PortB=128 (128)
111111 değeri için PortA=%11000011 ve PortB=%11000000...........yani PorTA=195 ve PortB=192  (128+64)
1111111 değeri için PortA=%11000011 ve PortB=%11100000.........yani PortA=195 ve PortB=224 (128+64+32)
11111111 değeri için PortA=%11000011 ve PortB=%11110000.......yani PortA=195 ve PortB=240 (128+64+32+16)
şeklinde devam edip gider. Dikkat edersen   her iki port için high olan bitlerin rakam karşılıkları toplanarak porta verilecek toplam değer elde edilmiş olmaktadır.
Bu kaydırmayı yapabilmek için yine bir lookup tablosu kullanabilirsin. Yada A portu için bir tablo ve B portu için ayrı bir tablo kullanman gerekir.
Dikkat edersen B portu  dördüncü bitden itibaren devreye girmektedir. O halde
For X=0 to 6
  GOSUB LOOKUP_A
  PORTA=LEDA
  IF X>3 then 
     GOSUB LOOKUP_B
     BORTB=LEDB
  ENDIF
  PAUSE 200
NEXT
goto basla

BAK_A:
LOOKUP X,[2,3,131,195,195,195,195,195],LEDA:RETURN

BAK_B:
LOOKUP X,[128,192,224,240],LEDB : RETURN

şeklinde çözüm bulunur.

Ete


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

kotan04

çok güzel oluyor :) saolun hocam 
.... gibi kaydırmayı arıtmatik oparatörle bendeki pin dizilimine göre yapabilmem mümkünmü arkadaşlar?

011111111111111
101111111111111
110111111111111
111011111111111
111101111111111
111110111111111
111111011111111
111111101111111
111111110111111
111111111011111
111111111101111
111111111110111
111111111111011
111111111111101
111111111111110
111111111111101
111111111111011
111111111110111
111111111101111
111111111011111
111111110111111
111111101111111
111111011111111
111110111111111
111101111111111
111011111111111





kkkkoootttaaannn000444

My75

Sana mantığını güzelce anlattık,Ete hocamda onaylamış artık istediğin animasyonu kendin oluştur yukarda her şey açık ve net.Takıldığın yer olursa yine yardımcı oluruz..Senin bu sevincini görünce 20 sene önce ilk yaptığım flip-flop devresinde ne büyük bir haz almıştım o aklıma geldi..O zamanlar Pic yok,toner baskı yok,internet yok..Valla ne günlerdi,neler çektik..Neyse
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

kotan04

evet hocam çok saolun mantığını anlattığınız gibi yapıyorum çok iyi ilerliyor merak ettiğim kodu kısaltmanın yolu olarak arıtmetik oparatörlerle yapabilirmiyim mesela kaydırmada bu işaret > kullanılan bir komut vardı onu sormak istedimde en azından port b de bu şekilde yaparım die düşündüm  :)
kkkkoootttaaannn000444