Ir ao conteúdo
  • Cadastre-se

Dúvida sobre programação do pic 16f84a


Ir à solução Resolvido por .if,

Posts recomendados

@Isadora Ferraz,

 

Eu faço exatamente como voce descreveu ...... Deixo um counter rodar por hardware , sem interrupção, e quando preciso do numero aleatório, leio o registrador do contador.

 

Uma vez, um amigo ia participar de um evento sobre Parapsicologia, ele tinha feito um sensor, baseado num gerador de ruído aleatório, usando uma junção PN. Ele ficava o tempo todo pegando os dados desse gerador, e colocava o movimento de um ponto na tela formando um desenho através de um cursor que poderia subir/descer/ esquerda/direita, baseado na leitura do numero aleatório. Isso era num Apple II .

 

No dia do evento, ele deixou cair o sensor, e quebrou o circuito.... ele me ligou desesperado para saber o que ele poderia fazer para não dar vexame no evento, eu sugerí para ele usar o numero aleatório que tinha no Basic do Apple. Ele modificou o programa em 2 minutos e respirou aliviado. Mas .....

 

No evento, ele percebeu que o jeitão do desenho sempre era pareçido.... acabava desviando a área do desenho para cima e para a direita. Se fosse totalmente ramdômico, as manchas na tela seriam mais ou menos simétricas em relação ao meio, e era isso que ele dizia num poster que ele colocou ao lado do projeto dele, baseado nas experiências que havia feito. E deixava claro que se alguém conseguia um padrão diferente, ela poderia estar influindo de alguma maneira no sensor !

 

E não é que um monte de gente ficou lá tentando influenciar o sensor, e sempre saia o mesmo jeitão do desenho, e as pessoas se convenciam que elas estavam conseguindo influenciar o "sensor" ????

 

Desde esse dia, eu nunca mais usei uma função pronta de número randômico.... faço a minha mesmo, buscando a contagem do Timer quando necessário.....

 

Paulo

Link para o comentário
Compartilhar em outros sites

Eu faço exatamente como voce descreveu ...... Deixo um counter rodar por hardware , sem interrupção, e quando preciso do numero aleatório, leio o registrador do contador.

 

Lembrei do joguinho de cartas do FFIX HEHE!

A função rand(); produzirá sempre uma mesma sequencia, para mudar deve ser usado srand(); (acho que é isso mesmo). Mas o esquema do Timer fica mais fácil...

 

Tipo, o que determina que o número escolhido pode ser considerado aleatório? No caso do Timer como garantir que a leitura atual dele gere um número realmente aleatório? Só curiosidade mesmo!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Paulão você pode não acreditar (eu sempre falo isso) mas o meu primeiro programa digamos 'funcional' em basic lá nos anos ... não interessa ... era pra o usuário descobrir um número aleatório e (tentando me lembrar) usava uma função rnd(acho) . Vou digitar aqui sem me preocupar com a correta sintaxe. Afinal faz ...não interessa .. anos

1 B=1+INT(RND(1))*10

2 INPUT A$ "DIGITE UM NUMERO DE 1 A 10"

3 IF A<B PRINT "É MENOR"

4 IF A>B PRINT "É MAIOR"

5 IF A=B PRINT "ACERTOU!!"

 

Em seguida na v.2.0 implementei um loop com limite de jogadas, umas frases idi otas como "quase", "faltam x chances", "Cagada! Acertou de primeira!!" e etc.

O detalhe é que realmente os números se repetiam (num tk-2000 apple). Me lembro de ter feito também num cp500 posteriormente no gwbasic (ou gbasic nem lembro) de um pc. O macete pra não repetir foi usar a função randomize() primeiro. Dica um pouco tardia, mas se um dia alguém inventar uma máquina do tempo, avise seu amigo.

Link para o comentário
Compartilhar em outros sites

@test man*~,

 

Se o momento em que você precisar de um numero aleatório for determinado arbitráriamente, como por exemplo o momento que alguém aperta um botão, pode ter certeza absoluta que será aleatório mesmo !

 

Mas se voce tentar implementar isso em um loop de programa, que sempre se repete igualzinho no tempo, de maneira NÃO ARBITRÁRIA, então adeus numero aleatório ! Isto porque ambos dependem do mesmo clock ! 

 

Mas existem técnicas de geração de números pseudo-aleatórios que são quase perfeitas, tipo demorariam anos para uma sequência de numeros gerados se repetir. 

 

Pesquise na Internet, vai achar até trabalhos acadêmicos sobre isso ..... e boa sorte kkkkkkk !

 

@Isadora Ferraz,

 

Pois é , a gente aprende com issas surpresas, não é ?

 

Essa função Randomize() apenas escolhe uma nova "semente" para o gerador de numeros aleatórios, que passam a ser pseudo-aleatórios. Normalmente o Randomize() tem poucas sementes diferentes ( 16 bits ) . Se não me engano no GWBASIC a Microsoft usava uma semente de 32 bits, então era "quase" totalmente perfeito. A chance de uma sequencia se repetir fica incrivelmente menor, mas ainda "existe" .

 

A maneira mais perfeita que eu ví , de maneira simples, ainda é usar a junção PN inversamente polarizada como um gerador de ruído, e colocar um contador de pulsos nela. Quando precisar, basta ler esse contador. 

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...