arka arkaya yanan led sorunu

Başlatan xdanyalx, 19 Şubat 2011, 18:33:15

xdanyalx

arkadaşlar ben basit bir led uygulaması yapmak istiyorum ama bir yerde tıkandım. sorunumu anlatayım. ben pic çıkışından ledleri arka arkaya yakmak istiyorum ama yürüyen ışıktan farkı 2. led yanınca 1. led sönmeyecek.
yani şu olayı gerçekleştirmek istiyorum
portb=%00000001
pause 250
portb=%00000011
pause 250
portb=%00000111
pause 250
portb=%00001111
pause 250
portb=%00011111 bu şekilde devam ediyor. programı böyle satır satır değilde komut yardımıyla yazmak istiyorum.

bunu yaptırabilecek bir komut varmı. mesela yürüyen ışık devresinde satırları tek tek yazmak yerine portb=portb>>1 şeklinde çıkışları kaydırabiliyoruz. bunun gibi bir komut varmı.
not: birde pic basic pro da çarpma toplama bölme falan varda üst alma var mı? mesal 2 üzeri 3 ü nasıl yaparım.
hepinize şimdiden teşekkürler.

gokhangokcen

selam  xdanyalx,
belki işine yarayabilir ben bu olayı bir for next döngüsü içerisinde çözmüştüm,

dim i as byte
dim x as byte

i = 1 
portb = i

for x = 1 to 6
i = (i*2)+1
portb = i
delayms 500
next


gibi bir kod parçacığı ile çözmüştüm olayı kodlar proton derleyicisi içindir kendi kullandığın derleyiciye göre düzenlersin mantık aynı
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

xdanyalx

slm gökhangökçen ben de böyle yapmaya çalıştımda i değeri 1,2,3,4,5,6 olduğunda çıkış tam sıralı olmuyor arada bazı ledleri atlıyor (i*2)+1 değilde i nin karesini alabilsek çözülecekte karesini alamıyorum. +1 diye ekleyerek yaptığımdada ikilik sisteme çevirdiğinden çok saçma bir dizi oluşuyor. ah bir karesini alabilsem :). ilgin için çok sağol

eseneren

karesi degıl senın ıstedıgın gokhan dedıgı gıbı i=(i*2)+1
senın sırayla yansın dıye ıstedıgın rakamlar  1-3-7-15 ıstedıgıne tam uyuyor
kare almak ıstersende x^y icin ( C bılıyorum basıce cevırırsın dıye yazıyorum.

x=2;
temp=2;
for(i=1;i<3;i++)
  x=temp*x;

yada bu sekılde yapabılırsın ( C basic karısık mantık basıt)
for(i=0;i<8;i++)
{
portb=(portb>>1)+1
pause 250
}

Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

xdanyalx

arkadaşlar uymuyor i 0 için 1 oluyor i 1 için 3 oluyor tamam ama i 2 için 5 oluyor buda seriyi bozuyor umarım anlata bilmişimdir.

xdanyalx

yada bu sekılde yapabılırsın ( C basic karısık mantık basıt)
for(i=0;i<8;i++)
{
portb=(portb>>1)+1
pause 250
}

bu şekilde çalışıyor eseneren teşekkürler.

ete

Direk verdiğin komutları bir incelermisin; Beraber bakalım istersen,
portb=%00000001 bu hangi sayıdır ? 1 sayısıdır tabiiki. Peki bir sonraki nedir
portb=%00000011 =3 sayısı , yani nasıl hesaplandı (1 * 2) +1=3 ,  bir sonraki
portb=%00000111=7 sayısı , nasıl hesaplandı  (bir önceki * 2)+1 = (3*2)+1=7 , bir sonraki
portb=%00001111=15 sayısı , nasıl hesaplandı (bir önceki * 2)+1=(7 * 2)+1=15,  bir sonraki
portb=%00011111 =31 sayısı , nasıl hesaplandı (15*2)+1=31 , bir sonraki
%00111111 = 63 sayısı , (31*2)+1 =63 , bir sonraki
%01111111 = 127 sayısı , (63*2)+1 127, bir sonraki
%11111111 = 255 sayısı , (127*2)+1=255

gördüğün gibi bu hesaplamada hiç bir şekilde dediğin sayılar ortaya çıkmıyor.
Yapman gereken şey sayı 255 değerine ulaştıktan sonra sayı değerini sıfırlaman gerekiyor.
En güzeli bir SAYI değişkeni tanımla (SAYI VAR BYTE)
SAYI=0 olsun başlangıçta 
Sonra;
BASLA:
SAYI=(SAYI*2)+1
PORTB=SAYI
PAUSE 250
IF SAYI=255 THEN SAYI=0
GOTO BASLA

Bu kodu bir dene bakalım ne olacak.

Ete


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

XX_CİHAN_XX

Ek olarak sayıyı 2 ile çarpmak ile 1 sefer sola kaydırmak aynı şeydir. Hatta daha iyi birşeydir.
SAYI = 0
BASLA:
SAYI=(SAYI<<1)+1
PORTB=SAYI
PAUSE 250
IF SAYI=255 THEN SAYI=0
GOTO BASLA

Ayrıca basicte nasıl olur bilmiyorum ama asm de bu iş Carry bitini set edip registeri sola kaydırarakta mümkündür.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

eseneren

Alıntı yapılan: xdanyalx - 20 Şubat 2011, 13:52:18
yada bu sekılde yapabılırsın ( C basic karısık mantık basıt)
for(i=0;i<8;i++)
{
portb=(portb>>1)+1
pause 250
}

bu şekilde çalışıyor eseneren teşekkürler.
Rica ederim

@XX_Cihan_XX dedıgı cok dogru bence en guzel mantık odur ona benzer bırsey dusundum lakın aklıma gelmemıs ıdı
Hız gerekıyorsa ( kı yerınde olsam gerekmese bıle ) carry set eder kaydırırdım.
Tebrik.....

ıkı komut...
bsf status,0 ;carry biti set et
rlf portb  ;portb yi sola kaydır
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

xdanyalx

carry komutunu deniyecem arkadaşlar. hepinize çok sağolun. sadece pic basic pro biliyorum onuda tam bilmiyorum zaten. ben elektrikçi olduğum için çok fazla detaylı uğraşamıyorum. sadece işime yarayan kısmını öğrenmeye çalıyorum öğrenemediğimide burda sizin gibi değerli arkadaşlara soruyorum. tekrar teşekkürler.