PicBasic de random komutu

Başlatan dideco, 25 Aralık 2002, 11:51:21

byka

sevgili dideco bu yazıyı takip ediyorum gercekten basına

gelen bu mesele bir tecrube olacak ilgilenen herkese artık bizleri daha fazla ezme ver lutfen su codeları da sende bizde rahatlayalım :)


iyi calısmalar
DWIN LCD Satış Türkiye email:info@kamantek.com  web:http://www.kamantek.com/shop/index.php

dideco

Arkadaşlar,

Ben PIC ba sic pro'da ki

"random" komutundan bahsediyorum. Seri iletişim ile ilgili bir problemim yok, çünkü muhtelif defalar PC ile seri iletişimi başarı

ile kullandım.

Benim burada vurgulamak istediğim ve hem bilgilenmek, hem de yardımlaşmak istediğim konu random

komutunun her zaman gerçekten ratgele sayı üretemediği...

Şöyleki: mikro reset olduktan sonra sürekli aynı değişkenleri

kullandığı için sürekli aynı sayı dizisini sözde random (ratgele) gibi çıkarıyor. Oysaki üretilen sayılar dizisi sırası random. Mikro da

hep aynı sürede bu sayıya baktığı için sayı dizisindeki aynı rakam karşıma çıktı.  Ama her zaman aynı sayı ile başladığı için aslında

rastgele bir sayı üretilemiyor.

Bir baska deyişle ihtiyaç suradan doğdu: Mikro ilk enerji verildiğinde 1-10 saniye arasında

rastgele bir süre beklesin ve sonra çalışmaya başlasın. Oysayi taa programın başında random komutu konursa, sürekli aynı sayıyı

ürettiği için aslında ortada rastgelelik kalmıyor.

Internet baglantımın oldugu yer ile çalışmalarımı gerçekleştirdiğim

mekan farklı olduğu için tüm programı ayrıntılarıyla buraya yüklemedim. Ama yazdığım üç satır basic derleyicisi programının ilk

üç satırı. Üretilen rastgele sayının ne olduğunu görmek için de seri iletişim ile PC'ye gönderiyorum. Zaten programın kalan

kısımları - sadece üretilen random sayı ile pause döngüsü dışında-  üretilen random sayı ile ilgili değil.

Denemek isteyen

arkadaşlar birkaç satırlık programı deneyebilirler. Her reset yapışınızda seri porttan ekrana aynı rakamın gönderildiğini

göreceksiniz.

Sanıyorum konuyu ve problemi yeterince açıklayabildim.

Yardımcı olamaya çalışan ve ilgilenen

arkadaşlara teşekkür ediyorum.

ise

tüm program dillerinde random aynı işler.
misal   c de

bir program
i=rnd();
printf("%s",i);
böyle bir programsda her açmada aynı sonuç alınır basic te aynıdır pascalda

delphide
işlemci değişmezse  sonuç aynı olur  
interruptla yapılırsa ancak sonuç değişir

AlundrA

iyi ama c'deki  random komutuna bir seed değeri verip her seferinde seed değerine göre değişen bir sayı üretmek mümkün. evet random komutu pseudo (sahte) random değerler üretir çünkü sayılar hernekadar random şekilde gelsede sıraları hep aynı olduğundan aynı anda aynı sayı çıkar ve bu komut bu özelliğinden dolayı aslında faydasız bir komuttur fakat c'deki (ve eminim diğer dillerdede vardır) srand(seed) fonsiyonuyla değişik seed (başlangıç) değerleri verilerek her seferinde değişik bir sıra üretmesi sağlanır aslında bu komutta olaya tam çözüm getirmez ama seed değeri olarak her seferinde farklı olduğu kesin değerler verilirse sonuçta tamamen random olur bunun için en güzel örnek "zaman"dır devre her çalıştığında farklı bir zamanda çalışacağından  seed değeri olarak zaman verildiğinde kesinlikle birbirinden farklı sayılar üretilecektir . fakat picte saat bulunmadığından ben her açılşta bulunan random değerini eeproma kaydederek bir dahaki açılışta bunun seed olarak kullanılmasını teklif etmiştim çok iyi bir çözüm olmasada istenilen amaca ulaşılabileceğini düşünüyorum. dideco arkadaşım pic basicten pek anlamadığım için kesin bişey söyleyemiyorum fakat picbasicte random komutu varsa random seed değeri verebilceğin bir yol mutlaka olmalı çünkü dediğin gibi bu komut bu şekilde hiç bi işe yaramaz  :)
yapabilirim!

dideco

AlundrA arkadaşım,

PIC basicde "seed" degeri vermek mumkun değil. Fakat random sayı ürettirmeden önce mikroyu "pause" komutuyla bekletince adeta diğer dillerdeki seed komutu gibi görev görüyor. Yani random sıralı sayı dizisinin farklı bir yerinden sayıyı üretiyor, çıkartıyor.



Arkadaşlar,

Bu durumda benim aklıma gelen çözüm: Programın ileri aşamalarında birtakım dışarıdan rastgele zamanlarda tetiklenen girişler ile rastgele rakam üretmek, üretilen bu rakamı eeproma yazmak, ve açılışta düşündüğüm rastgele bekleme süresini eepromdaki rakamdan yararlanarak belirlemek.

Sonuç olarak, random diye üretilen rakamlar aslında birbiriyle matematiksel ilişkisi olmayan rastgele sayı dizisi... Ama her seferinde aynı rakamlardan oluşan sayı dizisi üretiliyor, bu nedenle de mikrodan "reset" sonrası eğer her seferinde aynı süre sonrası random sayı üretmesi isteniyorsa (random komutuyla) ortaya her seferinde aynı rakamlar çıkıyor. Bu nedenle PIC basicteki random komutunun her seferinde rastgele sayı üretmesini beklememeliyiz. Mikronun eğer xt osilatör ile çalışıyorsa, dış uyaranlar ile tetiklenmeden ürettiği rakamların her zaman rastgele (random) olmasını beklememek gerekiryor, çünkü başka çözümü yok gibi görünüyor.

Diğer arkadaşların da önerdiği gibi bir saat çipi veya RC osilatör kullanmak veya mikronun watchdog timer'ini çalıştıran RC osilatörden faydalanmak da diğer olası çözümler olabilir...

Kodları kimseden saklamıyorum, eğer hala ilgilenen kişiler varsa kendilerine gönderebilirim. Ancak, kodlarda ilgilenecekleri kısım yukarıda verdiğim birkaç satırdan öteye gitmeyecektir.

Benim burada böyle bir tartışma açmaktaki amacım, karşılaştığım bir sorunu hem paylaşmak, hem çözüm bulmak hem de bu tartışmayı okuyan arkadaşların bilgilenmesini sağlamaktı.

Teşekkürler
:)  ;)

showtime

bu random işini bu hafta sonu ben de deneyeceğim. eğer dediğin gibi ise bi çözüm de benden olabilir:
Timer/counter a rastgele bakmak. zannetmiyorum ama belki olabilir.