While Döngüsü Hakkında Bir Soru?

Başlatan mavikaplan, 12 Temmuz 2012, 01:30:14

mavikaplan

Arkadaşlar şu kodu kullandığımda program normal bir şekilde çalışıyor :
portb.0=veri.7
pulsout sinyal,1
pause gecikme
portb.0=veri.6
pulsout sinyal,1
pause gecikme
portb.0=veri.5
pulsout sinyal,1
pause gecikme
portb.0=veri.4
pulsout sinyal,1
pause gecikme
portb.0=veri.3
pulsout sinyal,1
pause gecikme
portb.0=veri.2
pulsout sinyal,1
pause gecikme
portb.0=veri.1
pulsout sinyal,1
pause gecikme
portb.0=veri.0
pulsout sinyal,1
pause gecikme


Ama ben böyle tek tek elle yazmak yerine bir döngü oluşturmak istedim şu şekilde :
i=7
while i>=0
portb.0=veri[i]
pulsout sinyal,1
pause gecikme
i=i-1
wend


Bu oluşturduğum döngü çalışmadı. Nedeni ne olabilir?

Programın tam kodları:

trisb=0
portb=0
veri var byte
i var byte
gecikme var word
symbol sinyal=portb.1
gecikme=100
basla:
veri=%10000000
gosub seri
pause 1000
veri=%11111111
gosub seri
pause 1000
veri=%00000000
gosub seri
pause 1000
goto basla
seri:
portb.0=veri.7
pulsout sinyal,1
pause gecikme
portb.0=veri.6
pulsout sinyal,1
pause gecikme
portb.0=veri.5
pulsout sinyal,1
pause gecikme
portb.0=veri.4
pulsout sinyal,1
pause gecikme
portb.0=veri.3
pulsout sinyal,1
pause gecikme
portb.0=veri.2
pulsout sinyal,1
pause gecikme
portb.0=veri.1
pulsout sinyal,1
pause gecikme
portb.0=veri.0
pulsout sinyal,1
pause gecikme
return


OG

#1
i=7
while i>=0
portb.0=veri[i]
[i][i]pulsout sinyal,1
pause gecikme
i=i-1
wend


dediğinizde

i>0 ise
veya 
i=0 ise bile
döngü içine gir, döngüde içinde kal demektir,

i=0 iken de döngü içinde olacağına göre i = i-1 işlemi 0 değeri için de yapılır.

yani,
i = 0 - 1 durumu yaşanır,

i byte ise bu işlemin sonucu 255 dir.
word ise 65535 dir.

255 görünce i>0 şartını görür ve döngüden çıkmaz, i yi azaltarak 255 den sıfıra kadar işlemi tekrar yapar ve tekrar sıfır olur, sonra tekrar aynı işlem, yani döngüden çıkamaz, ayrıca i için 0 ila 7 arası düşündüğün sınır aşılmış olur, i byte ise 255 den 0 a bütün değerleri tarar, i word ise 65535 den 0 a kadar bütün değerleri tarar.

Şöyle yapabilirsin,

for i = 7 to 0 step - 1
portb.0=veri[i]
pulsout sinyal,1
pause gecikme
next

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mavikaplan

Teşekkürler, bu hiç aklıma gelmemişti :). Ama C gibi bir dilde bu şekilde bir algoritma oluşturduğumda bir sorun olmuyordu basic de neden sorun oluyor?

tyildizak

Alıntı yapılan: mavikaplan - 12 Temmuz 2012, 10:54:46
Ama C gibi bir dilde bu şekilde bir algoritma oluşturduğumda bir sorun olmuyordu basic de neden sorun oluyor?

Kurduğunuz for döngüsünün C'de  karşılığı:  for(i=7;i>=0;i--) {.....}  olur ki bu da sonsuz döngüdür, aynı sorunu yaşarsınız.

mavikaplan

Alıntı yapılan: tyildizak - 12 Temmuz 2012, 12:01:49
Kurduğunuz for döngüsünün C'de  karşılığı:  for(i=7;i>=0;i--) {.....}  olur ki bu da sonsuz döngüdür, aynı sorunu yaşarsınız.

teşekkürler, ben o zaman yanlış hatırlıyorum sanırım, ansi c 'de program yazdığımda böyle bir sorunla karşılaşmamıştım hiç. Ama picde programlarken sorun oluşuyor sanırım.

mavikaplan

Arkadaşlar döngü şeklinde yaptığım zaman, pic proteusda çalıştırıyorum belli bir süre bekliyor ondan sonra işlem yapıyor ama döngüsüz yaptığım zaman hemen işleme başlıyor sorun ne olabilir.

tyildizak

#6
Alıntı yapılan: mavikaplan - 12 Temmuz 2012, 12:24:31
teşekkürler, ben o zaman yanlış hatırlıyorum sanırım, ansi c 'de program yazdığımda böyle bir sorunla karşılaşmamıştım hiç. Ama picde programlarken sorun oluşuyor sanırım.

Pardon, şu ayrıntıyı unutmuşum, eğer for(i=7;i>=0;i--) {.....} gibi bir döngüde kullandığınız i değişkeni "signed"  değişken ise, birer birer eksilirken 0'dan sonra (-) değere düşeceği için (i>=0) koşulu gerçekleşmez ve döngü sonlanır. Yani signed değişken ile kullanıldığında söylediğiniz mümkündür. Önceki denemeniz bu şekilde gerçekleşmiş olmalı.

Alıntı yapılan: mavikaplan - 12 Temmuz 2012, 12:26:36
Arkadaşlar döngü şeklinde yaptığım zaman, pic proteusda çalıştırıyorum belli bir süre bekliyor ondan sonra işlem yapıyor ama döngüsüz yaptığım zaman hemen işleme başlıyor sorun ne olabilir.

isis saçmalıyordur, gerçek donanımda denerseniz farklı olabilir.