Fórum témák
» Több friss téma |
Idézet: Eleg nagy bajban lenne a vilag, ha ez igy lenne. Mondjuk az osszes titkositasi algoritmus. WiFi meg https es tarsai. De egy 8 bites mikrokontrolleren dobokockanak valoban a legegyszerubb a szamlalos megoldas. „A számítástechnikában nincs véletlenszám.”
Biztos igazad van, de akkor írd már le nekem, hogyan veszel rá egy processzort, hogy gondoljon egy számra!? Mert ha ez sikerül, akkor megalkodtat az "A.I."-t
Idézet: Úgy tudom, hogy azok csak ál-véletlen számokkal dolgoznak ( azaz kellő számítástechnikai teljesítmény mellett visszafejthetőek lennének ! ). „Eleg nagy bajban lenne a vilag, ha ez igy lenne. Mondjuk az osszes titkositasi algoritmus.”
Lehetőleg arról is gondoskodni kell, hogy a számláló lehetséges állapotainak száma 6-tal osztható legyen, különben nem lesz egyforma az egyes számok előfordulási valószínűsége!
Ez könnyen kivitelezhető. A programozható számlálót kell használni. Megadni neki egy 6-al osztható számot, mínusz 1. Tehát nem 240-et, hanem 239-et kell megadni. A kiolvasott értékhez pedig 1-et hozzáadni. Ja, és ha 240-ig számolunk, akkor 60-al kell osztani. Amúgy ha dobókocka a cél, akkor miért 6 az osztó?
A hozzászólás módosítva: Márc 6, 2015
Azért 6 mert a kockán is 1-től 6-ig vannak a számok, vagy nem jól gondolom?
C programozást már tanultam, ott könnyen megvan a program, csak pic-en az nem megy. Ki tudnád fejteni kicsit bővebben, hogy is működik ez a számláló. Még csak tanulom a PIC-et és nem minden tiszta . Hogyan kell meghivni, meg hasonlók....
Ma már nem, de holnap készítek egy példaprogramot és feltöltöm.
Szia!
Jutottál valamire már ezzel a szintillesztés dologgal?
Sziasztok ismét!
Nagyon megtetszett a PIC programozás, kezdem felismerni a benne rejlő lehetőségeket. Van egy RGB LED vezérlő HEX fájlom, szeretném átszerkeszteni. Ehhez letöltöttem egy FileViewPro nevű programot, ezt dobta ki a google, viszont megnyitás után csak számokat és betűket látok, nem úgy, mint az előttem hozzászóló Pali79 mellékletében szereplő utasításlistát. Milyen programot javasoltok nekem?
Szia!
Több lehetőség is van: a legkézenfekvőbb az MpLab, de az általa visszafejtett forrás elég tömör, kezdőknek bonyolultnak tűnhet. an egy icprog nevezetű program, az már jobb egy fokkal, hátránya, hogy nem fejlesztik már egy ideje, így csak a régebbi pic-eket ismeri. Van még egy picdisasm nevű is ami szerintem a legjobb a kezdők számára, de erre is érvényes, hogy csak a régieket tudja kezelni. Tehát kell valamelyik program, kell tudni, hogy milyen pic-re íródott a hex, így assemblybe visszafejthető a kód, viszont meg is kell tudni érteni, mert a szerzői kommentek ugyebár nem lesznek benne.
Ha már a programozható számlálót használod, sokkal egyszerűbb, ha eleve csak 0..5 között hagyod számlálni. A végeredmény ugyanaz lesz, csak nem kell semmit osztogatni és maradékot képezni.
Ez nem teljesen igaz. Több verziót is kipróbáltam. Egy szám egymásutáni ismétlődésének gyakorisága annál nagyobb, minél kisseb frekvencián, minél kisseb alapszámmal dolgozol.
Az tény, hogy alacsony frekvencián ismétlődés lehet, ha sűrűn mintavételezel, ezért a lehető legnagyobb frekvencián kell járatni. De tegyük fel, hogy a két mintavétel között 10000-et lép a számlálód. Ha 240-ig (0..239) engeded számolni, akkor 41-szer fordul körbe és még pluszban beszámol 160-at. Ha a 160-at osztod 6-al, 26-ot kapsz és marad 4.
Nézzük a másik verziót: 6-ig engedve a számolást (0..5) körbefordul 1666-szor és még pluszban 4-et lép. tehát ugyanaz lesz a végeredmény. A legfontosabb, hogy legyen véletlenszerű a mintavételezés időpontjában (pl. gombnyomás), és a mintavételezés sűrűsége nagyságrendekkel alacsonyabb legyen mint a számláló sebessége.
Oké, ez így van, csak én más módszert használtam a dobókockánál. Gyakorlatilag "gurítom".
Addig gurul, míg a kiemelt érték el nem fogy. Amúgy perceken belűl feltöltöm az erre írt progit. Nézd majd át, és bíráld el. Szeretem a bírálatokat. Azokból lehet a legtöbbet tanulni.
Nos amint ígértem, készítettem egy kis progit, kellően kikommentelve.
Az álltalam favorizált microkontroller a PIC18F14K22. Tehát a program is erre van írva, valamint a mellékelt mórickarajz is erre vonatkozik. Ha mást használsz, az adatlap segítségével igazítsd hozzá! Itt a program:
Nagyon nem elemeztem végig, de az fontos, hogy a nyomógomb megnyomásának lekérdezési sűrűsége és TIMER2 6 lépésének ideje ne legyen egymás egész számú többszöröse. Szélsőséges esetben akár mindig ugyanazt a számot kaphatod, ha ez a két idő megegyezik.
A TIMER2 folyamatosan megy. Ezért a gombnyomás véletlenszerűsége egyfelől a gomb lenyomójától, másfelől a lenyomott gomb pergésétől egyaránt függ, mivel a lekérdezés nem akkor következik be amikor lenyomod a gombot, hanem amikor elengeded, és a pergés nagy biztonsággal megszünt. Így az álltalad felvázoltaknak kicsi a valószínűsége.
Próbáld meg azt, hogy a kontrollert a lehető legnagyobb órajellel járatod. A TIMER2 PR2 regiszterét állítsd be a legnagyobb érték-1 értékre, tehát legyen 5. A TIMER2 mindenféle előosztás nélkül fusson - tehát a lehető legnagyobb sebességen. Ilyenkor a TMR2 regiszter értéke 0-5 között változik, eggyel növelve megkapod az 1-6 számokat.
A gombnyomás első jelére kiolvasva a TMR2-t elég jó közelítéssel kapsz véletlenszámot.
Amint látom, te sem nézted át a progit. Direkt van benne egy látványefekt, hogy egy darabig vibrálnak a ledek, mielőtt beáll a végeredményre. A vibrálás ideje is véletlenszerű. 1 villanástól 240-ig. Ráadásul 0x10 értéke az előzőröl indul, tovább növelve a véletlen lehetőségét.
Pont ezt írtam, hogy nem biztos, hogy ez a megoldás a jó. Ha a TIMER2 max órajelen jár, és a gomblekérdező hurok is pont 6 utasításciklusig tart, mindig ugyanazt a számot fogod kapni.
Igen.
"nedudgi" elvét követve, és a gomblenyomás pillanatában olvasva ki a timert, valóban ez történne. Ezért nem így működik a program.
Az, hogy csak később olvasod ki a timert nem jelent semmit ha ez fix idővel később történik meg (olyan mint ha egy fix értéket még hozzáadnál). Én lassítanám a TIMER2-t, egy 8-as osztással. A felső gombérzékelési ciklus során 3-al nő meg TIMER2 értéke minden ciklusban. Ez olyan mint ha a dobókockád csak 2 érték között ugrálna. Az alsónál 5-el nő, ez jobb. Ha 8-as osztást raksz bele, akkor bármelyik érték hozzáadódhat.
A hozzászólás módosítva: Márc 7, 2015
Oké, csak az a baj TIMER2-vel, hogy csak 4-es és 16-os előosztóval rendelkezik. Melyiket válasszam?
Akkor ki kell próbálni a 16-ost. Akkor is bármelyik számlálóállásnál esélyed van kiugrani a gombfigyelő ciklusból.
Megcsináltam, de csak azt értem el vele, hogy több lett a rövidlefutású "gurulás". Más változást nem észleltem.
Idézet: „Biztos igazad van, de akkor írd már le nekem, hogyan veszel rá egy processzort, hogy gondoljon egy számra!? Mert ha ez sikerül, akkor megalkodtat az "A.I."-t” En rengeteg dolgot elmondhatnek neked, de 6 napi ittlet utan (meg amugy is) ez a hangnem nem biztos, hogy jo kezdes. Termeszetesen alveletlen generatorok vannak, es lenyegesen bonyolultabb dolgok annal, hogy ebben a topikban lehessen roluk beszelni. De egyebkent en a random_r() fuggvenyt hasznalom, de persze elotte egy srandom_r() hivassal seed-elem a generatort. Es minden bekapcsolasnal mas ertekkel seed-elem. A bekapcsolaskori mas erteket applikaciotol fuggoen oldom meg. Az egyik munkamban egy timer-t hasznalok. A bekapcsolo gomb megnyomasakor elinditom a timer-t, es a gomb elengedesekori timer ertekket adom at az srandom_r()-nek. A timer 100MHz-cel porog.
Azért annak a timer-nak összhangban kell lennie a proci utasításciklusidejével. Kicsit sarkítva: ha a 100MHz-es timer értékeit egy 1MHz-es processzorral olvasol ki, csak a 100 egész számú többszörösét tudod majd kiolvasni. A/D átalakítóval lehet még talán ténylegesen véletlengenenerátort csinálni, ha nem szempont a sebesség.
Nem ált szándékomban senkit megbántani. Viszont indítottam egy remek kis vitát, ami még most is tart, és amiből mindannyian tanulhatunk. Amúgy most is azt írtad, hogy egy timer értékének kiolvasásával töltöd fel a randomgenerátort. Az abban lévő függvény ezzel az értékkel dolgozik.
Csak attól válik véletlenszerűvé, hogy mikor kapcsolod be. Én például PLC-nél úgy generálok véletlenszámot, hogy bekapcsoláskor beolvassa az RTC-t, ami telepes táplálású, tehát mindig fut. Az aktuális napot beszorzom, a pillanatnyi másodperccel, majd az így kapott számmal matekolok egy sort. Az eredmény egy véletlen szám, denem a számítógép teremtette! |
Bejelentkezés
Hirdetés |