picbasic random komutunu sınırlamak

Başlatan mustikangal, 22 Aralık 2015, 18:43:54

mustikangal

merhaba ben zar projesi yapmak istiyorum.320volt ta yapılmışını buldum ancak kendim denemek istedim.devreyi kurdum ancak zar numarasını otomatik seçmeyi yapamıyorum.
sayi var byte komutuyla değişkeni oluşturdum.ve bu sayiya random komutu ile değer vermek istiyorum.(1,2,3,4,5,6) bu değere göre ledleri süreceğim.
Random komutuna nasıl sınırlama getirbilirim?çünkü random komutuyla 0-65535 arasında değer veriyor.bana 1-6 arası değer lazım.

ete

YENIDEN:
RANDOM SAYI
IF SAYI>6 then YENIDEN

bu şekilde olması gerek
ete

mustikangal

çok teşekkür ederim. aslında basitmiş ancak iki gündür çok uğraştırdı beni. internetten bulamamıştım. kendim de çorbaya döndürdüm kodu.

mustikangal

#3
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _CP_OFF
OSCCAL=%10000000
DEFINE OSC 4
DEFINE OSCCAL_1K 1
CMCON=7

'kod
symbol zar1234=gpio.0
symbol zar5=gpio.1
symbol zar67=gpio.4
symbol buton=gpio.2
sayi1 var byte
trisio=%11000000


basla:
low zar1234       'tüm ledleri kapatıyorum
low zar5
low zar67

sayi1=0
pause 100

'zar için sayı seçiyor
random sayi1
if sayi1 > 5 then    '5 ten büyükse baştan seçiyor
goto basla
endif

     
kontrol :             'buton durumunu kontrol ediyor
if buton=0 then
goto sayisec
while buton=0
wend
else
goto kontrol
endif

sayisec :                      'seçtiği değere göre ledleri yakıyor
select case sayi1

case 0
high zar5
pause 1000
disable

case 1
high zar67
pause 1000
disable

case 2
high zar5
high zar67
pause 1000
disable

case 3
high zar1234
pause 1000
disable

case 4
high zar1234
high zar5
pause 1000
disable

case 5
high zar1234
high zar67
pause 1000
disable

end select





pause 3000        '3 saniye bekliyor

     'tüm ledleri söndürüyor
low zar1234
low zar5
low zar67

pause 1000
goto basla
end

Burak

Bu komutla ilgili bir handikap var ...

Random komutu içerisine atanan değişkenler sürekli bir lookup tablosundan seçiliyormuşçasına içeri alınıyor ... O yüzden belirli bir süre sonra maalesef sürekli aynı döngüde rakamları elde etmeye başlıyoruz ... Yani bu komut tam olarak işlevini yerine getiremiyor ...

Burak
Ω Gens Una Sumus Ω

Burak

Çözüm olarak bu komutun yerine , işlevi yerine getirmenin belki birçok yöntemi vardır ... Ama ben kendimce TIMER1 sayacını buldum .. Bu sayaç yöntemi ile , butona basılıp bırakma anına kadar geçen süreyi yani 0-65535 birimlik süre ifadesini bir çok matematiksel polinomlar ve denklemler türetmek için kullandım yıllarca .. Sende bunun gibi bir yordam güdebilirsin ...

Butona basıldığında sayaç başlasın , bıraktığında sayaç dursun ve sayaç içindeki değerin modüler aritmetiğinden son hanesini al ... Bu rakam 6'dan büyükse 3 çıkar değilse dokunma ve işleme al ... Gibi ... ;)

Burak
Ω Gens Una Sumus Ω

mustikangal

teşekkürler. dediğiniz mantıklı geldi. bir örnek kod yazabilir misiniz?
picbasic te yeniyim. timer hiç kulllanmadım. :)

Burak

Hangi işlemciyi kullanıyosun ?

Burak
Ω Gens Una Sumus Ω


Mucit23

0-6 arasında bir sayı elde etmek istiyorsanız random ifonksiyonu ile elde ettiğiniz sayının 7'ye modunu alın. Yani 7'ye bölümünden kalanını bulun.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Burak

#10
Aslında düşündümde bu proje için Timer1 çok gereksiz .. Butona basıldığı sürece incremental olarak 1-6 döngüsünde değişecek bir kod ile çok basit bir şekilde halledebiliriz ... Kodu kendi arzuna göre kaynağına ekleyebilirsin ..

GP0 pinine bir buton bağlayıp giriş olarak ayarlandığını varsayarak ve bu pinin zayıf pull-up direncini devreye dahil ettiğimi düşünerek .. Butona basılmasının pini lojik 0'a çekeceğini kabul ediyorum (Devre bağlantılarını buna göre yap diye bütün bunları yazdım)


' GEREKLİ DEFINE VE SİGORTA AYARLARININ BU KISMA DAHİL EDİLMESİ GEREKİYOR
WPU.0=1
OPTION_REG.7=0
TRISIO.0=1
BUT VAR GPIO.0
X VAR byte  :   x=1

MAIN:

WHILE BUT=0
x=x+1
if x>6 then x=1
pause 10
WEND

'x senin zar değerin ...

goto main




Anlamadığın birşey olursa sorabilirsin ...

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal