Página 1 de 1

RANDOM BYTE

MensagemEnviado: 24 Ago 2008 21:45
por fabim
psoall.
Num sei se alguém esta procurando, ou ja precisou e passou raiva.
Taí um gerador de numeros randonicos, em byte com valor máximo definivel, por ser pascal quem olhar vai saber como que funciona.

Ficou uma tetéia de xick.

function DRANDOM(max_r : byte) : byte;
var val1,val2,val3, max_val : byte;
begin
val1 := val1;
val2 := val2;
val3 := val3;
max_val := max_val;
repeat
begin
asm
movf _DRANDOM_local_val1,w ;
addwf _DRANDOM_local_val2,w ;
movwf _DRANDOM_local_val2 ;
addwf _DRANDOM_local_val3,w ;
movwf _DRANDOM_local_val3 ;
addwf _DRANDOM_local_val1 ;
swapf _DRANDOM_local_val1 ;
movf _DRANDOM_local_val1,w ;
movwf _DRANDOM_local_max_val
end;
end;
until ((max_val < max_r) AND (max_val > 0));
result := max_val;
end;

fabim

Re: RANDOM BYTE

MensagemEnviado: 25 Ago 2008 08:40
por andre_luis
Qual é a semente da função ?

MensagemEnviado: 25 Ago 2008 08:53
por fabim
êim ?

MensagemEnviado: 25 Ago 2008 10:29
por andre_luis
Trata-se de um gerador de números aleatórios ?
Para core PIC ?

+++

MensagemEnviado: 25 Ago 2008 10:34
por fabim
Á. Que coisa viu.
Esses CDF falando dificil.

Sim, Andre.
É um gerador randônico de valores de 0 a 255, com máximo valor passado como referencia.
Exemplo 32.
Ele só vai repitir o mesmo valor depois de Ref/2.

No mais fica lindão o funcionamento, quase explidi os miolu, mais té que enfim funfou e como funfou.

Tão. Fiz um gerador de 0 a 199 em um painel, para um posto de combustiveis, para sorteio de brindes.

Sobre o painel, tem uma amofada ligada a um potenciometro.
Conforme a porrada do cara eu converto a tensão máxima que o potenciometro forneceu entre 0.5S e 5.5Segundos.
Nesse meio tempo o parei fica gerando aquela porrada de numeros aleatórios, se no final do tempo o numero for igual a um dos 3 numeros do bieti o cara ganha o brinde.

Ficou legal.rs

Fabim

MensagemEnviado: 25 Ago 2008 11:01
por andre_luis
Ahh...agora entendi a lógica.

Também já fiz algo semelhante. Num sistema onde eu lia as fases da rede, eu usava a própria leitura da fase ( que ocorria assincronamente à temporização do sistema ) da rede como entrada para a função.

Voce gosta mesmo de mesclar linguagens de programação, né ?

+++

MensagemEnviado: 25 Ago 2008 11:29
por fabim
é sinhô.
Pega a parte de asm, observe a logica, faça em C ou pascal puro.

Essa rotina vai ficar 5X maior.

E ainda vai incluir uma rotina de mult_32X32 = 693 bytes.rsrs

Por isso eu programo em PASCAL, BASIC, ASM.rs

Fabim

MensagemEnviado: 29 Ago 2008 01:32
por Djalma Toledo Rodrigues
Uma sugestão:
Loop:
movlw NNH
movwf rdm
Random:
decfsz rdm,F
goto Ramdom
goto Loop

Quando ocorrer o evento interrompe e lê rdm, como o evento não é sincronizado ( O instante que ocorre é aleatório), o conteúdo de rdm será perfeitamente randomico.

MensagemEnviado: 29 Ago 2008 08:25
por fabim
Meu, Desculpa a pergunta.
Mais a quanto tempo você trabalha com programação e eletronica ?
Óiz da uma zoiada no que você sujestionou...

Fabim

MensagemEnviado: 29 Ago 2008 09:31
por Djalma Toledo Rodrigues
Fabim, eu não 'Çabo' o vc quiz dizer ou a quem se digeriu. :shock: rsrsrs

Re: RANDOM BYTE

MensagemEnviado: 12 Mar 2010 10:46
por falcaum
me dá uma luz por favor fabim
fabim escreveu: val1 := val1;
val2 := val2;
val3 := val3;
max_val := max_val;

levei uma surra nessa parte do pascal, que raio de incialização é essa??? nunca vi nada parecido em nenhuma linguagem de programção
onde entra a semente max_r?
Vou usar sua rotina(pretendo) depois te mando os direitos :roll:

Re: RANDOM BYTE

MensagemEnviado: 12 Mar 2010 10:55
por fabim
falcaum escreveu:me dá uma luz por favor fabim
fabim escreveu: val1 := val1;
val2 := val2;
val3 := val3;
max_val := max_val;

levei uma surra nessa parte do pascal, que raio de incialização é essa??? nunca vi nada parecido em nenhuma linguagem de programção
onde entra a semente max_r?
Vou usar sua rotina(pretendo) depois te mando os direitos :roll:


Nossa isso que é desenterrar, esta epoca aí eu ainda não conhecia C.
intão eu inicializo a variavel com ela mesmo por quê.........
O mikropascal tinha uma putaria de excluir as variaveis que não eram utilizadas, fazendo uso apenas de umas variaveis de sistema que ele criava. Isto porque ele simplesmente achava que podia ser daquela forma e pronto.
Quando faz-se variavel=variavel, éra uma forma de falar pro compilador que eu ia utilizar aquela variavel, intão não era pra apagala e usar as vars de sistema que ele criava..

sóissosinhô;.

MensagemEnviado: 12 Mar 2010 11:20
por MOR_AL
Achei na página da mikroElektronika, compilador mikroBasic Pro.
Autor : XOR
Parece que foi testado e funcionou legal.

Código: Selecionar todos
I have assembly for a PIC number generator which was published in EDN magazine. It's internally a 31-bit shift register and can be used effectively as a white noise generator. It doesn't repeat for 17.8 hours of continuous operation @ 4 MHz.


Maiores detalhes no endereço: http://www.mikroe.com/forum/viewtopic.php?p=15294#15294

Código: Selecionar todos
      RLF     MAIN_GLOBAL_RANDOM,W
      RLF     MAIN_GLOBAL_RANDOM,W
      BTFSC   MAIN_GLOBAL_RANDOM,4
      XORLW   1
      BTFSC   MAIN_GLOBAL_RANDOM,5
      XORLW   1
      BTFSC   MAIN_GLOBAL_RANDOM,3
      XORLW   1
      MOVWF   MAIN_GLOBAL_RANDOM

MOR_AL

MensagemEnviado: 12 Mar 2010 16:53
por MOR_AL
Agora.
Pelo que eu entendi, esses códigos geram valores (de 0 a 255) pseudo-aleatórios. A sequência seria a mesma para um mesmo valor de entrada. É isso?
Já o sistema do André gera valores aleatórios, se não sincronizarmos o instante da leitura da fase.
No entanto, a distribuição das ocorrências dos valores não seria igual para todos os possíveis números, uma vez que na senóide ocorre maior permanência da função (no tempo) nos limites inferior e superior. O ideal seria se ao invés de senóide, fosse uma onda triangular assíncrona com o uC.
MOR_AL

MensagemEnviado: 13 Mar 2010 01:09
por jorgeluiz
A AN544 da Microchip tem um codigo simples pra gerar esses numeros pseudo-aleatorios, como disse o Mo_ral. Tem a distribuiçao randomica e gaussiana.