Arkadaslar,
İşlemci
(16F84) ile ilk açılışta (reset sonrası) rastgele bir sayı üretmek ve bu sayıyı kullanarak devam etmek istiyorum. Ancak Random(x)
komutu sürekli aynı rakamı üretiyor.
Değişken rastgele rakamlar üretebilmek için ne yapılabilir. Bu konuda tecrübesi
olan var mı?
eğer mikronun içinde tarih yada saat rutini oluşturursan,
rast gele oluşturulacak sayıyıda bu rutini baz alarak oluşturursan sanırım istediğini elde edebilirsin.
16F84'de veya 12x508 serisinde tarih veya saat rutini
olusturmak pek mumkun olmasa gerek?
bu becerine bağlı...
RTC entegreleride işini görebilir.
Random komutu ana loop içinde değildir umarım.
Yaptığım devrenin çalışmaya ilk başladığında 1 ile 10
saniye arasında rastgele bir süre bekledikten sonra açılmasını ve çalışmasını istiyorum. Bu nedenle random komutu döngü içinde
değil, en başta bir yerlerde...
Bildiğim kadarıyla RC osilatörler pek kararlı çalışmazlar.
Eğer girişlerden birine böyle bir osilatör yapıp bağlarsan ve bunun 1sn'deki pals sayısını ölçersen her seferinde değişik bir rakam
elde etmiş olursun. Bunuda bilimum çarpma bölme işlemlerine sokarak oldukça farklı değerler elde edebilirsin.
anladığım kadarıyla random komutun pic resetten sonra
yani çalışmaya başlar başlamaz saı üretecek. eğer öyleyse zaten pic çalışır çalışmaz bir defa sayı üretir. sen de devamlı o değişkene
baktığın için aynı sayıyı görürsün.
yanlış anlamamışımdır umarım
aklıma şöyle bir fikir geldi pic ilk çalışmaya başladığında
ürettiği sayı kullanılır ve bu sayı eeproma kaydedilir bir dahaki açılışta pic eepromu kontrol eder ve daha önce kaydedilen sayıyı yeni
random sayıyı üretmek için baz alır böylelikle her seferinde yeni bir sayı üretilmiş olur.
sizce işe yararmı böyle bi şey :)
"random" komutu her döngüde tekrar
icra edilirse değişik sayılar üretebilirsin. Ama denetleyicinin initialize esnasınsa sadece bir defalık çağırıyorsan değişkeni üretip
birdaha çalışmayacaktır. Eğer belirli zaman aralıklarında değişken üretmesini istiyorsan interrupt kulanabilirsin.
İlk açıldığı andan itibaren (reset sonrası) arka arkaya hep
aynı sayıları üretiyor. Bu nedenle ilk üretilen sayını eeprom'a yazmak da bir çözüm değil. Orneğin arka arkaya arada random
ürettiğiniz sayı kadar "pause" verseniz bile hep aynı rakamlar üretiliyor...
Dostum şu kodları buraya paste etsene bi bakalım. valla
hayret
fikir yürütmek ve öneride bulunmak için kodları
görmeliyiz.
Programın ilk satırları aşagıdaki gibi:
abc VAR
WORD 'abc degiskenini 16 bit tanımla
random abc 'abc degiskenine random sayı ata
serout ..abc....... ' abc
degerini seri cıkış olarak bilgisayara gönder
Bu şekilde her reset sonrası random oluşturulan sayı aynı rakam. Her
ne yaparsanız yapın bir sekilde aynı sırayla rakamlar üretiliyor. Örneğin random üretilen sayı kadar süre bekletin ve tekrar sayı
üretin, yine aynı rakam çıkıyor!
peki o rakam nedir,bunu biliyor muyuz?
belki serout
komutunu yanlış kullanıyor ya da seri protocol hatası yapıyorsan ne olacak.çünkü random komutu bildiğim kadarıyla çalışıyor ve
emin olmak için eve gidince deneyeceğim.
kaynak yazmakta sıkıntın var anlaşılan biraz daha açık olsan belki boşuna
debelenmeyiz gibi geliyor.ne dersin.burada herkesin amacı yardım etmek, ederken de öğrenmek değil mi arkadaşlar.korkmaya gerek
yok.
örneğin include dosyalarında verdiğin "abc" sembolik değişkeni "reserved words"lerden olabilir.değişken adını
değiştirip deneyebilirsin.
tabi kaynak kodu açık yazmadığın için amiral battı oynuyoruz.
özellikle ilgileniyorlar diye
şüpheyle bakmamanı rica ederim.bu bizim başımıza da gelebilirdi diye düşündüğümüz için yardım etmeye çalışıyoruz.
kolay
gelsin.
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
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.
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
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 :)
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
:) ;)
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.