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
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
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 ?
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
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?
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..
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
:) Doğrudur,o kadar iş içinde gözden kaçmış..sanırım mantığı anladın,gerisini halledersin artık..kolay gelsin..
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..
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..
evt hocam dediğiniz gibi deniyorum şimdi oluyor
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
ç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
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
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 :)
Bu karışık pin olayı bir port içinde olsaydı bir kaç formül ile yönlendirme yapabilirdin,2 port ilede olur ama uğraşmak lazım,enazından fazla animasyon yapmayacaksan uğraşılabilir.
mesela bir byte veya word oluştur. bu 'msn' olsun. '
dim msn as byte
Dim MSN0 As MSN.0 '
Dim MSN1 As MSN.1 '
Dim MSN2 As MSN.2 '
Dim MSN3 As MSN.3 '
Dim MSN4 As MSN.4 '
Dim MSN5 As MSN.5 '
Dim MSN6 As MSN.6 '
Dim MSN7 As MSN.7 '
'*****************************************
buraya byte veya word üzerinden istediğin işlemi yap...
mesela;
msn=0
gosub gonder
msn=1
gosub gonder
veya;
msn=0
for i=0 to 255
msn=msn+1
gosub gonder
next
'*****************************************
gonder:
PORTB.7=MSN0 '
PORTD.4=MSN1
PORTC.7=MSN2
PORTD.5=MSN3
porta.5=MSN4
portc.2=MSN5
PORTB.5=MSN6
PORTB.6=MSN7
return
bilmiyorum belki işini görür....
merhaba arkadaşlar şimdilik çalışmam güzel ilerliyor ir sorum daha olacak
ra1 ra0 ra7 ra6 rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 ra4 ra3 ra2
bu dizilime göre ra1 bitinde gelen 1 sayısı sağa doğru kayacak ve son bitte sola doğru toplanacak bunu yapmanın bir yolu varmı acaba? port isimlerini yazdığım zaman çok uzun oluyor? şimdi alttakini düzenledim fakat en sonda toplanmaya başlayadcak soladoğru soldan bir gececek en sağda 1 duracak geln diğer 1 bunun yanında bu şekilde sola doğru gidecek :s nasıl olabilir bu örnek koda son bite geleni 1 arttır dememiz mümkünmü kafam allak bullak oldu help
for kutu=0 to 3 'porta.1,0,7,6 için 'sola tek kayar
lookup kutu,[2,1,128,64],led
porta=led
pause 500
next
porta=0
for kutu=0 to 7 'portb.7,6,5,4,3,2,1,0 için
lookup kutu,[128,64,32,16,8,4,2,1],led
portb=led
pause 500
next
portb=0
for kutu=0 to 2 'porta.4,3,2 için
lookup kutu,[16,8,4],led
porta=led
pause 500
next
arkadaşlar yardımcı olabilirmisiniz?
Program sonuna ekle..
For KUTU=0 To 2
LookUp KUTU,[4,12,28],LED
PORTA=LED
PAUSE 500
Next
For KUTU=0 To 7
LookUp KUTU,[1,3,7,15,31,63,127,255],LED
PORTB=LED
PAUSE 500
Next
For KUTU=0 To 3
LookUp KUTU,[92,220,221,223],LED
PORTA=LED
PAUSE 500
Next
Alıntı yapılan: My75 - 17 Mart 2011, 16:13:52
Program sonuna ekle..
For KUTU=0 To 2
LookUp KUTU,[4,12,28],LED
PORTA=LED
PAUSE 500
Next
For KUTU=0 To 7
LookUp KUTU,[1,3,7,15,31,63,127,255],LED
PORTB=LED
PAUSE 500
Next
For KUTU=0 To 3
LookUp KUTU,[92,220,221,223],LED
PORTA=LED
PAUSE 500
Next
Sayın hocam benim bahsettiğim ra1 den led sırayla yanmaya başlayacak en sonda durarak toplanacak örneğin
100000000000000
010000000000000
001000000000000
000010000000000
000000000000001 en sonu
100000000000000
010000000000000
001000000000000
000010000000000
000000000000011 en sonu
010000000000000
001000000000000
000010000000000
000000000000111 en sonu bu şekilde ra1e kadar toplanacak
soldan gelecek sağdaki bitte toplayacak :(
(http://i1103.hizliresim.com/2011/3/18/1193.gif) ben hepsini çizmedim ama hepsi bu şekilde sonda toplanmaya başlayacak :(
Merhaba arkadaşlar bir fikri olan varmı burada tıkandım yardımlarınızı bekliyorum :s
Sayın hocam benim bahsettiğim ra1 den led sırayla yanmaya başlayacak en sonda durarak toplanacak örneğin
100000000000000
010000000000000
001000000000000
000010000000000
000000000000001 en sonu
100000000000000
010000000000000
001000000000000
000010000000000
000000000000011 en sonu
010000000000000
001000000000000
000010000000000
000000000000111 en sonu bu şekilde ra1e kadar toplanacak
soldan gelecek sağdaki bitte toplayacak :(
(http://i1103.hizliresim.com/2011/3/18/1193.gif) ben hepsini çizmedim ama hepsi bu şekilde sonda toplanmaya başlayacak :(
Benim pc'de pbp derlemiyor o yüzden protonda yazdım..
Device 16F628A
TRISA = %00100000
TRISB = %00000000
ALL_DIGITAL TRUE
PORTB_PULLUPS On
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, MCLRE_OFF,CP_ON
Dim KUTU As Byte
Dim LED As Byte
Dim SAYAC As Byte
Dim A0 As Byte
Dim A1 As Byte
Dim A2 As Byte
Dim A3 As Byte
Dim A4 As Byte
Dim A6 As Byte
Dim A7 As Byte
Dim B0 As Byte
Dim B1 As Byte
Dim B2 As Byte
Dim B3 As Byte
Dim B4 As Byte
Dim B5 As Byte
Dim B6 As Byte
Dim B7 As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
RESETLED:
A=4:B=8:C=3
A1=2:A0=1:A7=128:A6=64:B7=128:B6=64:B5=32:B4=16:B3=8:B2=4:B1=2:B0=1:A4=16:A3=8:A2=4
PORTA=0
PORTB=0
BASLA:
For SAYAC=1 To 15
If SAYAC=2 Then C=2: A1=6 :A0=5 :A7=132:A6=68:A4=20:A3=12 :EndIf
If SAYAC=3 Then C=1: A1=14:A0=13:A7=140:A6=76:A4=28 :EndIf
If SAYAC=4 Then C=0: A1=30:A0=29:A7=156:A6=92: :EndIf
If SAYAC=5 Then B=7: B7=129:B6=65:B5=33:B4=17:B3=9 :B2=5:B1=3 :EndIf
If SAYAC=6 Then B=6: B7=131:B6=67:B5=35:B4=19:B3=11:B2=7 :EndIf
If SAYAC=7 Then B=5: B7=135:B6=71:B5=39:B4=23:B3=15 :EndIf
If SAYAC=8 Then B=4: B7=143:B6=79:B5=47:B4=31 :EndIf
If SAYAC=9 Then B=3: B7=159:B6=95:B5=63 :EndIf
If SAYAC=10 Then B=2: B7=191:B6=127 :EndIf
If SAYAC=11 Then B=1: B7=255 :EndIf
If SAYAC=12 Then B=0: A1=30:A0=29:A7=156:A6=92 :EndIf
If SAYAC=13 Then A=3: A1=94:A0=93:A7=220 :EndIf
If SAYAC=14 Then A=2: A1=222:A0=221 :EndIf
If SAYAC=15 Then A=1: A1=255 :EndIf
For KUTU=1 To A
LookUpL KUTU,[0,A1,A0,A7,A6],LED
PORTA=LED
DelayMS 500
Next
If B<>0 Then
For KUTU=1 To B
PORTA.6=0
LookUpL KUTU,[0,B7,B6,B5,B4,B3,B2,B1,B0],LED
PORTB=LED
DelayMS 500
Next
EndIf
If C<>0 Then
PORTB=0
For KUTU=1 To C
LookUpL KUTU,[0,A4,A3,A2],LED
PORTA=LED
DelayMS 500
Next
EndIf
If SAYAC=15 Then PORTA=0:PORTB=0:DelayMS 500:GoTo RESETLED:EndIf
Next SAYAC
GoTo BASLA
End
hemen inceliyorum hocam çok teşekürler..
merhaba arkadaşlar protonda hazırlanmış kodları elimden geldiğince basic pro kodlarına çevirdim ama basic proda derleyemedim
acaba hata nerede bir bakabilirmisiniz?
@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
trisb=%00000000
TrisA=%00100000
portb=0
porta=0
CMCON=7
KUTU var Byte
LED var Byte
SAYAC var Byte
A0 var Byte
A1 var Byte
A2 var Byte
A3 var Byte
A4 var Byte
A6 var Byte
A7 var Byte
B0 var Byte
B1 var Byte
B2 var Byte
B3 var Byte
B4 var Byte
B5 var Byte
B6 var Byte
B7 var Byte
A var Byte
B var Byte
C var Byte
RESETLED:
A=4:B=8:C=3
A1=2:A0=1:A7=128:A6=64:B7=128:B6=64:B5=32:B4=16:B3=8:B2=4:B1=2:B0=1:A4=16:A3=8:A2=4
PORTA=0
PORTB=0
BASLA:
For SAYAC=1 To 15
If SAYAC=2 Then C=2
A1=6 :A0=5 :A7=132:A6=68:A4=20:A3=12 :EndIf
If SAYAC=3 Then C=1
A1=14:A0=13:A7=140:A6=76:A4=28 :EndIf
If SAYAC=4 Then C=0
A1=30:A0=29:A7=156:A6=92: :EndIf
If SAYAC=5 Then B=7
B7=129:B6=65:B5=33:B4=17:B3=9 :B2=5:B1=3 :EndIf
If SAYAC=6 Then B=6
B7=131:B6=67:B5=35:B4=19:B3=11:B2=7 :EndIf
If SAYAC=7 Then B=5
B7=135:B6=71:B5=39:B4=23:B3=15 :EndIf
If SAYAC=8 Then B=4
B7=143:B6=79:B5=47:B4=31 :EndIf
If SAYAC=9 Then B=3
B7=159:B6=95:B5=63 :EndIf
If SAYAC=10 Then B=2
B7=191:B6=127 :EndIf
If SAYAC=11 Then B=1
B7=255 :EndIf
If SAYAC=12 Then B=0
A1=30:A0=29:A7=156:A6=92 :EndIf
If SAYAC=13 Then A=3
A1=94:A0=93:A7=220 :EndIf
If SAYAC=14 Then A=2
A1=222:A0=221 :EndIf
If SAYAC=15 Then A=1
A1=255 :EndIf
next
For KUTU=1 To A
LookUp2 KUTU,[0,A1,A0,A7,A6],LED
PORTA=LED
pause 500
Next
If B<>0 Then
For KUTU=1 To B
PORTA.6=0
LookUp2 KUTU,[0,B7,B6,B5,B4,B3,B2,B1,B0],LED
PORTB=LED
pause 500
Next
EndIf
If C<>0 Then
PORTB=0
For KUTU=1 To C
LookUp2 KUTU,[0,A4,A3,A2],LED
PORTA=LED
pause 500
Next
EndIf
If SAYAC=15 Then PORTA=0:PORTB=0
pause 500
GoTo RESETLED
EndIf
Next SAYAC
GoTo BASLA
End
Çok hata vardı,pbp için yeniden düzenledim..
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
TRISA=%00100000
TRISB=%00000000
CMCON=7
KUTU var Byte
LED var Byte
SAYAC var Byte
A0 var Byte
A1 var Byte
A2 var Byte
A3 var Byte
A4 var Byte
A6 var Byte
A7 var Byte
B0 var Byte
B1 var Byte
B2 var Byte
B3 var Byte
B4 var Byte
B5 var Byte
B6 var Byte
B7 var Byte
A var Byte
B var Byte
C var Byte
'******************************************************************************
RESETLED:
A=4:B=8:C=3:A1=2:A0=1:A7=128:A6=64:B7=128:B6=64
B5=32:B4=16:B3=8:B2=4:B1=2:B0=1:A4=16:A3=8:A2=4
PORTA=0
PORTB=0
'*******************************************************************************
BASLA:
For SAYAC=1 To 15
SELECT CASE SAYAC
CASE 2
C=2:A1=6:A0=5 :A7=132:A6=68:A4=20:A3=12
CASE 3
C=1:A1=14:A0=13:A7=140:A6=76:A4=28
CASE 4
C=0:A1=30:A0=29:A7=156:A6=92
CASE 5
B=7:B7=129:B6=65:B5=33:B4=17:B3=9:B2=5:B1=3
CASE 6
B=6:B7=131:B6=67:B5=35:B4=19:B3=11:B2=7
CASE 7
B=5:B7=135:B6=71:B5=39:B4=23:B3=15
CASE 8
B=4:B7=143:B6=79:B5=47:B4=31
CASE 9
B=3:B7=159:B6=95:B5=63
CASE 10
B=2:B7=191:B6=127
CASE 11
B=1:B7=255
CASE 12
B=0:A1=30:A0=29:A7=156:A6=92
CASE 13
A=3:A1=94:A0=93:A7=220
CASE 14
A=2:A1=222:A0=221
CASE 15
A=1:A1=255
END SELECT
'*******************************************************************************
FOR KUTU=1 TO A
LookUp2 KUTU,[0,A1,A0,A7,A6],LED
PORTA=LED
PAUSE 50
NEXT
'******************************************************************************
IF B<>0 THEN
FOR KUTU=1 TO B
PORTA.6=0
LookUp2 KUTU,[0,B7,B6,B5,B4,B3,B2,B1,B0],LED
PORTB=LED
PAUSE 50
NEXT
ENDIF
'******************************************************************************
If C<>0 Then
PORTB=0
For KUTU=1 To C
LookUp2 KUTU,[0,A4,A3,A2],LED
PORTA=LED
pause 50
Next
EndIf
'******************************************************************************
If SAYAC=15 Then
PORTA=0:PORTB=0
pause 50
GoTo RESETLED
EndIf
'******************************************************************************
Next SAYAC
End
çok saolun hocam hemen incelemeye koyuldum allah razı olsun..
eğer bunun için bunca kod yazarsanız geriye bir şey kalmıyor ki... sadece bu yaptığınız işlem entegreyi doldurur geriye bir şey kalmaz.
:S evet farkına vardım şimdi çözüm yolu arıyorum ama bulamadım kafayı sıyıracam:(
Sıyırmana gerek yok,16F648A kullan 2 katı kod alanın olur.
PIC16F627A 1024 'word
PIC16F628A 2048
PIC16F648A 4096
Yazdığım program 556 word..Basit bir animasyon gibi görünüyor ama öyle değil,karışık pin ile hiç değil.
evet hocam bende ilk gördüğümde hemen yaparım dedim ama patlıcan gibi oldum şimdi:) benim bunu 628a da çözmem lazım :S
Alıntı yapılan: kotan04 - 19 Mart 2011, 21:54:46
evet hocam bende ilk gördüğümde hemen yaparım dedim ama patlıcan gibi oldum şimdi:) benim bunu 628a da çözmem lazım :S
hocam bitlerle bir uğraş bak formülleştirebilirsin...
ben de önce kolay gibi gördüm baktım olmuyor bunun böyle olmaması gerekir daha kolay bir yolu olmalı dedim. sağa toplayanı da sola toplayanı da toplam 362 word tuttu<senin anlattığın şekilde ve anlattığının tam tersi şekil dahil olmak üzere>. ama önce eline kağıt kalem al <mümkünse kareli olsun> yoksa bu iş olmaz... en azından benim için olmadı.
Anladığım kadarı ile pcb ve malzemeleri hazırlamışsın ki hata yapmışsın,bir projeye başlamadan önce ilk yapacağın iş doğru işlemciyi seçmektir.Kullanacağın pic'in flash belleği ve eeprom özelliklerine çok dikkat etmek gerekir.Ben bir ara 60 adet 16F73 aldım elimde çakılı kaldı sadece eeprom' u olmadığı için,nasılda gözümden kaçmış. :D
Üstelik karışık pin ile çizim yapmışsın ki işi zorlaştırmıssın.Bu tip işlerde port sıralamasını kullanmak işi kolaylaştırır.Birde bu işler için port çoklamada düşünebilirdin mesela senin bu proje bir adet 12F629 ve 2 adet 74HC595 ilede çok rahat yapılabilirdi.
Alandan kazanmak için pause için gosub return yapabilirsin sanırım her defasında pause kullanmıyorsun..Eğer çok adet almadıysan 16F648 kullan ama sanırım sana oda yetmeyecek..
butondan gönderilen bilgiye göre animasyonları düşürecektim fakat bellek yetmedi ne güzel buton kontrolu ve animasyonların hepsi tamamdı şimdide bellek çıktı karşıma vallaha çok kötü moralim sıfırlandı..
Kodları bir gönder bakalım yapabileceğimiz bir şey varmı.
Alıntı yapılan: omereliusuk - 19 Mart 2011, 22:26:18
Alıntı yapılan: kotan04 - 19 Mart 2011, 21:54:46
evet hocam bende ilk gördüğümde hemen yaparım dedim ama patlıcan gibi oldum şimdi:) benim bunu 628a da çözmem lazım :S
hocam bitlerle bir uğraş bak formülleştirebilirsin...
ben de önce kolay gibi gördüm baktım olmuyor bunun böyle olmaması gerekir daha kolay bir yolu olmalı dedim. sağa toplayanı da sola toplayanı da toplam 362 word tuttu<senin anlattığın şekilde ve anlattığının tam tersi şekil dahil olmak üzere>. ama önce eline kağıt kalem al <mümkünse kareli olsun> yoksa bu iş olmaz... en azından benim için olmadı.
aslında şimdi formülleşmiş gibi ama işte sadece bu kodlar yok 6-7 farklı animasyon var butondan gelen bilgiye görede aynı animasyonların kanal sayısı düşecek dolayısı ile kod cümbüşü yaşanıyor
tarif et onları da formülleştirelim tabi becerebilirsek. ;)
Bu 6-7 animasyon sürekli tekrarlıyormu? Kanal dediğin ledlermi? O zaman kanalları düşürüyorsan ledlerin geçişinede müdahale ediyorsun demektir.1 den 15 kadar değil de 6 ya kadar gibi.
Alıntı yapılan: My75 - 19 Mart 2011, 23:03:14
Bu 6-7 animasyon sürekli tekrarlıyormu? Kanal dediğin ledlermi? O zaman kanalları düşürüyorsan ledlerin geçişinede müdahale ediyorsun demektir.1 den 15 kadar değil de 6 ya kadar gibi.
kanal derken led demek istedim pardon
şimdi devreyi anlatım devreye 15 led bağlı içinde 6 farklı led efektleri var enerji verdiğimde 10 sn bekliyor ve efekler başlıyor sürekli dönüyor diyelimki ben bu animasyonların 14 kanalda aynı şekilde çalışmasını istiyorum ozaman şöyle yapıyorum enerjiyi kesiyorum enerjiyi tekrar veriyorum ve butona 14 defa basıyorım ve tüm animasyonlar 14 led içinde oynamaya başlıyor ve bunu 11 kanala kadar bu şekilde müdahale ederek yapıyorum gerçi böyle yapmasını istiyorum ama ben 13.led için animasyonu yazim dedim ama kodlar okadar çok olduki bellek yetmedi buda bendeki pin diziliminin azizliği
Hala anlamış değilim,sen şimdi her animasyonu her defasında kanal sayısına göre tekrarmı yazıyorsun? Yoksa program içinden eksilen kanallara göre geçişlerimi düzenliyorsun?
Alıntı yapılan: My75 - 19 Mart 2011, 23:21:07
Hala anlamış değilim,sen şimdi her animasyonu her defasında kanal sayısına göre tekrarmı yazıyorsun? Yoksa program içinden eksilen kanallara göre geçişlerimi düzenliyorsun?
ben şimdi malesef her kanal sayısına göre tekrar yazıyorum ondan bellek yetmiyor aslında sellect case içine yerleştiriyorum animasyonları düşürerek ama bunun doğru olmadığının farkındayım ama farklı bir yol bulamadım :(
gonder:
PORTB.7=MSN.0 '
PORTD.4=MSN.1
PORTC.7=MSN.2
PORTD.5=MSN.3
porta.5=MSN.4
portc.2=MSN.5
PORTB.5=MSN.6
PORTB.6=MSN.7
return
hocam bir word oluştur. bunun adı msn olsun veya led olsun. sen 16 bitlik sayını led adını verdiğimiz word tipi değişkene aktar.
yani şöyle led=$3f33 mesela sonra gosub gonder
bitti. illa ki sırasıyla olacak diye bir şey yok. zaten gönderdiğin bilginin 'gonder' bölümündeki aktarımlarını kimsenin gözleri algılayamaz.
yukarıda msn.0 demek msn adlı word tipi bilginin 0. bitini portb.7 bacağına aktarır.
Alıntı yapılan: omereliusuk - 19 Mart 2011, 23:33:07
gonder:
PORTB.7=MSN.0 '
PORTD.4=MSN.1
PORTC.7=MSN.2
PORTD.5=MSN.3
porta.5=MSN.4
portc.2=MSN.5
PORTB.5=MSN.6
PORTB.6=MSN.7
return
hocam bir word oluştur. bunun adı msn olsun veya led olsun. sen 16 bitlik sayını led adını verdiğimiz word tipi değişkene aktar.
yani şöyle led=$3f33 mesela sonra gosub gonder
bitti. illa ki sırasıyla olacak diye bir şey yok. zaten gönderdiğin bilginin 'gonder' bölümündeki aktarımlarını kimsenin gözleri algılayamaz.
yukarıda msn.0 demek msn adlı word tipi bilginin 0. bitini portb.7 bacağına aktarır.
hımm bir inceleyim hocam
for kutu=0 to 3 'porta.1,0,7,6 için 'sola artarak +
lookup kutu,[2,3,131,195],led
porta=led:pause 300
next
for kutu=0 to 7 'portb.7,6,5,4,3,2,1,0 için
lookup kutu,[128,192,224,240,248,252,254,255],led
portb=led:pause 300
next
for kutu=0 to 1 'porta.4,3,2 için
lookup kutu,[211,219],led
porta=led:pause 300
next
bu animasyonlardan biri pendeki pin dizilimine göre desimal sayı yolladım bunu verdiğiniz word tipi değişkenle nasıl ilşkilendirebilirim?
Alıntı yapılan: omereliusuk - 19 Mart 2011, 23:33:07
gonder:
PORTB.7=MSN.0 '
PORTD.4=MSN.1
PORTC.7=MSN.2
PORTD.5=MSN.3
porta.5=MSN.4
portc.2=MSN.5
PORTB.5=MSN.6
PORTB.6=MSN.7
return
hocam bir word oluştur. bunun adı msn olsun veya led olsun. sen 16 bitlik sayını led adını verdiğimiz word tipi değişkene aktar.
yani şöyle led=$3f33 mesela sonra gosub gonder
bitti. illa ki sırasıyla olacak diye bir şey yok. zaten gönderdiğin bilginin 'gonder' bölümündeki aktarımlarını kimsenin gözleri algılayamaz.
yukarıda msn.0 demek msn adlı word tipi bilginin 0. bitini portb.7 bacağına aktarır.
Bu şekildede olur..Bu durumu ile sadece yürüyen ışık,ama iş toplanarak çoğalmaya gelince yine arap saçı oluyor.
BASLA:
LED=LED<<1 'yada led=led*2
DelayMS 100
If LED=32768 Then LED=1 'YADA PORTA.2=1 THEN LED=1
GoSub GONDER
GoTo BASLA
GONDER:
PORTA.1=LED.0
PORTA.0=LED.1
PORTA.7=LED.2
PORTA.6=LED.3
PORTB.7=LED.4
PORTB.6=LED.5
PORTB.5=LED.6
PORTB.4=LED.7
PORTB.3=LED.8
PORTB.2=LED.9
PORTB.1=LED.10
PORTB.0=LED.11
PORTA.4=LED.12
PORTA.3=LED.13
PORTA.2=LED.14
Return
bir başka değişken yap. o değişkenle or kullan. o zaman oluyor. hem de formülleşiyor.
bu da sana kıyağım olsun..saga_topla:
led=$0001 :GoSub gonder : a=0 :y=0:x=0
For i=0 To 15
b=14-a
If b=0 Then
led=led<<1
led=led|y
GoSub gonder
DelayMS 10
led=$ffff
GoSub gonder
DelayMS 10
Return
EndIf
For w=0 To b
led=led<<1
led=led|y
GoSub gonder: DelayMS 10
Next
x=((x<<1)+1)<<(15-a)
y=y|x
a=a+1 :led=$0001|y
GoSub gonder
DelayMS 10
Next
Return
wow :) hemen bakacağım hocam çok saolun ilgilendiğiniz için
dediğin gibi 16 bite göre ayarlandı. ama sen 14 bit kullanacağım diyorsun. o halde 14 bite göre ayarlarsın. bir de delayms 10 ları delayms 100 yap. hareketleri daha rahat görürsün. :)saga_topla:
led=$0001 :GoSub gonder : a=0 :y=0:x=0
For i=0 To 12'15
b=12-a'14-a
If b=0 Then
led=led<<1
led=led|y
GoSub gonder
DelayMS 100
led=$ffff
GoSub gonder
DelayMS 100
Return
EndIf
For w=0 To b
led=led<<1
led=led|y
GoSub gonder: DelayMS 100
Next
x=((x<<1)+1)<<(14-a)
y=y|x
a=a+1 :led=$0001|y
GoSub gonder
DelayMS 100
Next
Return
hocam düzelttim kodlar aşşağıda sağa toplanma görünmüyor yani toplanırken ledler yanmıyor sönük vaziyette toplanıyor :)
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
trisb=%00000000:TrisA=%00100000
buton var PortA.5:portb=0:porta=0:CMCON=7
led var word
a var byte
b var byte
y var byte
x var byte
i var byte
w var byte
porta=0:portb=0
led=1
BASLA:
led=led*2
PAUSE 100
IF led<1 THEN led=1
GoSub GONDER
saga_topla:
led=$0001 :GoSub gonder : a=0 :y=0:x=0
For i=0 To 14
b=13-a
If b=0 Then
led=led<<1
led=led|y
GoSub gonder
pause 100
led=$ffff
GoSub gonder
pause 100
Return
EndIf
For w=0 To b
led=led<<1
led=led|y
GoSub gonder: pause 100
Next
x=((x<<1)+1)<<(14-a)
y=y|x
a=a+1 :led=$0001|y
GoSub gonder
pause 100
Next
Return
GONDER:
PORTA.1=LED.0
PORTA.0=LED.1
PORTA.7=LED.2
PORTA.6=LED.3
PORTB.7=LED.4
PORTB.6=LED.5
PORTB.5=LED.6
PORTB.4=LED.7
PORTB.3=LED.8
PORTB.2=LED.9
PORTB.1=LED.10
PORTB.0=LED.11
PORTA.4=LED.12
PORTA.3=LED.13
PORTA.2=LED.14
Return
TRISA=0
TRISB=0
PORTA=0
PORTB=0
sen giriş yaptığın pini daha sonra çıkış olarak kullanmışsın. bundan dolayı bazı yerlerde sorun var diyebilirim. denedim çok da güzel çalışıyor. ayrıca ra4 pinini bir dirençle +5 volta çek. yoksa ra4 pini çıkışını hep 0 da veya boşta görürsün.
ayrıca;
basla:
gosub saga_topla
goto basla
end
@kotan04
adresimi profile ekledim