Sida 1 av 2
Slumptal med mjukvara? (PIC12F675, assembler)
Postat: 18 november 2007, 20:09:58
av PHermansson
Kan man verkligen få fram slumptal med assembler? Naturligtvis kan det inte bli ett riktigt slumptal, men i alla fall något hyfsat slumpartat.
ar kollat på nätet och hittat en del kod för detta, bland annat följande:
Kod: Markera allt
random16
rlf RandHi, W
xorwf RandHi, W ; xor (D15, D14) now in W reg, D7
movwf temp
swapf RandHi, W
rlf RandLo, f
rlf RandHi, f
swapf RandLo, f ; D3 now in RandLo, D0
xorwf RandLo, W ; xor (D12, D3) now in W reg, D0
swapf RandLo, f
rlf temp, f
rlf temp, f
xorwf temp, W
movwf temp
rrf RandLo, f
rrf temp, f
rlf RandLo, f
return
Koden ger vid tre efterföljande anrop ('call random16') alltid värdena 0-0-64. I de första körningarna är W och de andra registrena 0 under hela körningen.
Har även lite svårt att förstå hur något som inte innefattar något slumpmässigt kan ge ett slumptal?
Finns det bättre asm-rutiner som fungerar på en 12F675?
Postat: 18 november 2007, 20:45:59
av bearing
Sådana dära funktioner brukar ge slumpvärden som följer en serie. Om du vill att det ska bli nya värden från serien varje gång du startar kretsen måste du antagligen spara senaste värdet i EEPROM och sedan ta fram det i början av programmet.
Postat: 18 november 2007, 20:56:12
av Icecap
Det går inte att räkna fram riktiga slumpmässiga tal helt enkelt. Nu är det ju frågan för HUR slumpmässiga du kan behöva talen men ett sätt KAN vara att ha en brusgenerator på en port, evt, en synkron serieport, och läsa den lite då och då. Kan du använda en synkron (klockad) serieport kommer den att läsa in 8 bit med slumpmässiga data, kan du inte använda en sådan får du samla ihop bit efter bit med en viss tid mellan.
Men ska den bara slumpa fram inte helt så slumpmässiga tal kanske du inte behöver extra hårdvara.
Postat: 18 november 2007, 20:59:02
av 007sweden
Något radioaktivt preparat med geiger-müllerrör skall det vara!
Postat: 18 november 2007, 21:48:16
av sodjan
> Kan man verkligen få fram slumptal med assembler?
Med *enbart* programkod kan du "bara" få "pseudo slumptal".
D.v.s en talserie som följer en i förväg känd serie, men som
till det yttre upplevs som slumpartad. Dock kan det vara väldigt
lång serie så att man i praktiken inte upplever att den upprepar sig.
För en äkta slumpserie krävs någon extern påverkan på koden,
t.ex att man mäter tiden mallan knapptrycklningar eller brus från
en brusgenerator...
Jag vet inte var du har hittat koden, men normalt bör man inte "seeda"
slumpgeneratorn med 0, prova att ladda RandHi och RabdLo med något
"slumptal" innan du kör din testserie. Olika startvärden ska/bör ger olika
"slumpserier". Det ser ut som ett vanligt återkopplat shiftregister, vilket
är det vanligaste sättet att lösa det...
Postat: 19 november 2007, 08:39:41
av PHermansson
Låter ju logiskt ja, ska prova att ladda RandHi och RandLo och se vad som händer.
Fast jag borde nog ha någon hårdvarulösning, inte för att jag har stora krav på slumpmässigheten, men koden ska köras vid uppstart och ger väl då samma resultat vid varje start?
Koden används i en RGB-styrning, tanken är att när lampan tänds/kretsen startas så ska den lysa med en slumpmässig färg varje gång.
Postat: 19 november 2007, 08:41:59
av Icecap
Då får du nog spara resultatet i EEPROM och seeda med detta värde vid nästa start.
Postat: 19 november 2007, 08:44:37
av sodjan
Hur tänds kretsen ?
Är det någon som trycker på en "on" knapp ?
Då kan du använda tiden som knappen är intryckt som en seed.
Postat: 19 november 2007, 09:34:20
av PHermansson
Den släs på genom att en datorstyrd RF-sändare (Tellstick) slår på en Nexamottagare dit nätdelen är kopplad, så det blir tyvärr svårt... Ska prova Icecap's idé.
Postat: 19 november 2007, 11:28:49
av bearing
Har du mig på ignore eller?
Antar att det inte var så tydligt förklarat, men det var iaf det jag menade.
Postat: 19 november 2007, 11:40:09
av PHermansson
Sorry, många inlägg och morrontrött programmerare

Postat: 19 november 2007, 14:05:14
av XorXaX
Använd Timer1 som är en 16-bitars timer.
Starta den när PICen startar, sen läser du bara av den när du behöver ett värde. Använder det själv och det ger ganska slumpartade värden.
Du kan ju även använda Timern som ett seed värde till din slump-rutin.
Postat: 19 november 2007, 14:24:42
av sodjan
Att läsa av timern fungerar bra om tiden mellan avläsningarna inte är
exakt lika lång hela tiden, d.v.s om det finns något externt som
gör att tiden mellan avläsningarna varierar. Annars hamnar man lätt i
ett läge där värdena får olika slags "mönster" i variationen.
Fördelen med en programrutin som implementerar ett återkopplat skiftregister
kan även vara man (med rätt design och rätt startvärde) alltid får *alla*
tänkbara värden innan det startar om från början, om det nu spelar
någon roll vill söga...
Postat: 20 november 2007, 13:06:32
av PHermansson
Det är just det som är problemet, som jag ser det nu finns det ingen mjukvarulösning på mitt problem.
Anledningen är att jag vill ha slumpvärden när processorn startar och att nätdelen styrs externt. Alla timervärden och registervärden kommer att vara lika vid varje uppstart, så även om jag tex användet timer1 som seed kommer värdena att bli lika. Timern hinner räkna lika långt varje gång, och eftersom 'slumptalen' räknas fram matematiskt blir resultatet lika varje gång.
Jag måste alltså ha någon mer hårdvara...
Switchen var tänkt för att kunna ändra färg manuellt, men det behövs ju egentligen bara ett läge. Då har jag en input att använda för slumptal, men hur?
En sladdstump som antenn och räknar pulser på ingången?
Mäta laddtiden hos en kondensator?
Ett LDR? Kommer iofs att vara lika ljusnivå varje gång den slås på då systemet är ljusstyrt.
Postat: 20 november 2007, 13:09:39
av 007sweden
Skulle man kunna tänka sig något liknande det vissa pratar om som vitt-brusgenerator, backspänd pn-övergång?
Ingen aning hur det fungerar men kom bara på att tänka att det skulle vara nog slumpmässigt som frötal.