Ir ao conteúdo
  • Cadastre-se
Lucas Rosate

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

Recommended Posts

Boa noite pessoal, eu preciso fazer uma programação com pic e a ideia é o seguinte: Eu tenho que arrumar algum jeito de sortiar o número inteiro 0 ou 1, quando for acionado um botão. Eu já tentei, mas não consegui, existe alguma função que faça isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@,

Bem vindo ao Fórum.

Normalmente os compiladores tem uma funcão de número randômico. Em alguns chama-se Rand(). Eu não entendo patavina nenhuma de C , então poste qual é o compilador que voce estå usando para alguém poder te ajudar, ok ?

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Se você estiver usando o CCS dê uma olhada na função 



rand();


no help.



//#define RAND_MAX 2
#INCLUDE <STDLIB.H>
:
void main() {
   int I;
   I=rand();  // <--- I igual a um número aleatório (pseudo-random).
:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma grande observação é que este modelo de Pic esta obsoleto a um bom tempo(fora de linha,praticamente não se acha mais).

Tente pelo menos o 16F628A.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

rand() não 'nasce' com o pic. Se quiser um número aleatório de verdade só com hw, mande rodar um timer contador e pegue seu resultado em momentos aleatórios

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como a Isadora disse, não é possível fazer a função rand() no PIC, eu tentei. Estou usando CCS mesmo. Não tinha pensado nisso Isadora, genial!

 

Obrigado a todos! Vou tentar essa ideia do contador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como a Isadora disse, não é possível fazer a função rand() no PIC, eu tentei.

 

É possível sim cara... Você adicionou a STDLIB

#INCLUDE <STDLIB.H>

Os PICs não fazem coisa alguma =D nem "if(X>0)" HEHE

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×