Pic le Random sayı üretmek

Başlatan gokk, 21 Mayıs 2005, 18:06:40

gokk

Merhaba, ben Pic 16F84A kullanarak RANDOM 4 basamaklı rasgele bir sayı elde etmek istiyorum. Random komutuyla bunu yapıyorum. Ama sorun şu ki her seferinde aynı sayıları buluyor. yani pici açılıp kapansa bile sırayla aynı sayıları üretior. 2513,2498,4850,....gibi. hep aynı sırayla.
Bu nasıl bir Random dır ben anlayamadım, yardımcı olacaklara şimdiden çok teşekkür ederim.

SpeedyX

microEngineering Labs'ca Random böyle oluyor. idare et, yaratıcılığını kullan.
log(x)^(2/x) gibi birşey yapıyor. Aslında sabit bir formul var, Vb de Randomize yazarak ilk değeri atamanın amacı budur.
PC porgramlamada asm ile kod yazarken o anki dakika ve saniyeyi sabit bir formüle veriyorduk, çıkan bizim rasgele üretilmiş sayımızdı.
Demekki bu arkadaşlar iyi birşey düşünememiş.

gokk

Pc lerde sistem saatine göre çok güzel oluyordu dediğiniz gibi. Acaba Piclerde  kullanabileceğimiz böyle bir kaynak yokmu?

CaFFeiNe

adc olan bir picin girişine 50hz şebeke frekansını uygun bir şekilde düşürüp girersek (şebekede harmonikler vs. var) veya direk boşta bırakırsak rastgele değişen sinyal elde edebiliriz sanıyorum adcnin değerinide okuyup işlersek istediğimiz gibi random bir sayı üretebiliriz herhalde (denemedim ama gerçek random sayıya ihtiyacım olduğunda ilk bunları deniycem)

Veli B.

4 basamaklı random? ne amaçla kullanmak istediğini yazarmısın, eğer mahsuru yoksa, ilginç geldi.

ftsahin

Bu konu daha önce tartışılmıştı. Sanırım en iyi cevabı da Dumrulbey vermişti. Pic'in kullanmadığınız bir ucu kaldıysa bu ucu giriş olarak ayarlayın. Küçük bir bobin sararak bir ucunu Pic'in giriş olarak ayarladığınız ucuna bağlayın. Bu uca başka bir şey bağlamayın(direnç vb) Sonra random sayı üretmek istediğiniz zaman bu uca gelen darbeleri sayarak elde ettiğiniz sayıyı istediğiniz gibi kullanın. Sayıyı büyütmek için ölçüm süresini uzatabilirsini veya çarpım katsyısını büyük tutarsınız.

Erkan Gench

pic çalışmaya başladıktan sonra ilk ürettiğiniz random sayıyı eeproma kaydedin ve normal olarak random sayıları kullanmaya devam edin.

picin bir sonraki açılışında daha önce kaydettiğiniz sayıyı seed değeri olarak kullanın (pc deki saat değeri gibi) bu sefer ürettiğiniz sayılar tamamen farklı olacaktır. elde ettiğiniz bu değeri eeproma tekrar kaydedin. pic bunu her açılışında yaparsa sürekli yeni sayılar elde edersiniz.

ben yaptım oldu :D

aslında aklımda başka fikirlerde var ama sanırım bu işinizi görecektir.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

piedos

Erkan Gench +1

bu soru bize assembly laboratuvarında sorulmustu, ben de en son elde ettigim sayıyı eeproma yazdırdım ve eepromdaki sayiyi sayi üreten fonksiyon icin base olarak kullanmistim.
Bu arada registerlarin overflow özelliginden de faydalanabilirsiniz, kodunuzda farkedemediginiz kısır dongulerden kurtarir sizi.

benim de bir sorum var; assembly ile nasıl sinus üretilir (matematiksel bir yontem lazım)
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

gokk

öncelikle cevaplar için teşekkür ederim. Benim aklıma gelen de Erkan Gench in dediği gibi bişey oldu. Ancak eeprom a kaydettiğim değeri her pic açılışında  bir arttırıyorum. Böylece seed değeri herseferinde bir artıyor ve yeterince random bir sayı üretiyor. Artırılan değişken de bayağı yüksek bir değerden sonra sıfırlanıyor.

düşündüğüm şey pille çalışan basit bir alet olacak. Aslında bir değişik yöntem de bir pine LDR yada benzeri bir eleman takıp dış ortama göre değişen bir değer elde edip onu kullanmak.
Teşekkürler

psikokabus

eger programın da kullanmıyorsan timer kullan rast gele sayılar uretecegın zaman timer dan okuma yap timer hic bir zaman taşma yapmasın ve ya yapsa bile interruptında hiç birsey yapmasın
nop gibi olur mu :?:

gokk

Aslında timer dan okuma yapmak daha güzel olabilir. Daha hiç kullanmadım, nasıl yapabiliriz. Programın başında, Pic açıldığında sadece seed değeri farklı olması için yapıyorum. Eğer timer la da olursa güzel olur.

SENAY

Senin dedediğin gibi rastgele sayı üretmenin en güzel yolu bu.Timer kullanarak yap.Ben bu şekilde kullanıyorum.Timeri kurduktan sonra belli zamanlarda okuyarak rastgele sayilar elde edebilirsin.Basicteki gibi olmaz.Tek yapman gereken timer kesmesini disable yapman aksi takdirde programın kilitlenebilir. Kolay gelsin

122055221

Arkadaşlar yazılan çözümler ile ilgili örnek kod vermeniz mümkün mü?? Hepsi sözde kalmış... Örnekle açıklamak biçok arkadaş için daha faydalı olacaktır....

z

Timerı kurma ve ardından timeri okuma işlemi arasında gecen zaman hep aynı ise bu şekilde elde edeceğiniz sayılar randomdan uzak olacaktır.

Pseudo random üreteçlerde seed değeri random sayı girilmezse üretilen sayılar randommuş (???) gibi görünse de işlemciyi her çalıştırışta hep aynı sayıları üreteceğinden çoğu uygulamacıyı bu rahatsız eder.

Diyod ve transistörlerle yapılan gürültü üreteçleri (noise generator)  ile random sayı elde etmeye çalışsanız daha mantıklı olur.

Bunun için zener diyodlardan yararlanabilirsiniz. Zener uygun bir akımla ters biaslanırsa  uçlarında belirgin bir gürültü oluşur. Bu sinyali HP filitre ile süzüp yükselttikten sonra TTL seviyede RND sinyal elde edilir. Bu sinyali basit bir I/O pin üzerinden okuyarak random sayının bitlerini oluşturabilirsiniz. Bunun için timerı kurup RND sinyali peryodik okumak suretiyle rnd sayıları üretmiş olursun.

Gene de elde ettiğin random sayı ne kadar randomdur tartışılır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

SpeedyX

Buna random değer diyebilmemiz için donanım ile üretip aldığımız değerlerin birden fazla olması gerekiyor. Birkaç tane farklı seed değeri elde edilirse sayı random kavramına yaklaşır.