Slumptal med mjukvara? (PIC12F675, assembler)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Slumptal med mjukvara? (PIC12F675, assembler)

Inlägg 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?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
007sweden
Inlägg: 3500
Blev medlem: 3 mars 2005, 20:18:12
Skype: oo7sweden

Inlägg av 007sweden »

Något radioaktivt preparat med geiger-müllerrör skall det vara!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Då får du nog spara resultatet i EEPROM och seeda med detta värde vid nästa start.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg 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é.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Har du mig på ignore eller?
Antar att det inte var så tydligt förklarat, men det var iaf det jag menade.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg av PHermansson »

Sorry, många inlägg och morrontrött programmerare :)
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg 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...

Bild

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.
Användarvisningsbild
007sweden
Inlägg: 3500
Blev medlem: 3 mars 2005, 20:18:12
Skype: oo7sweden

Inlägg 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.
Skriv svar