Olá. Gostaria de executar um projeto com base no arduino, porém não tenho nenhuma intimidade com as expressões usadas no compilador. Por mais que já tenha programado PIC, pelo ccs tudo de maneira bem básica. fiz uns testes no arduíno e nenhum resultado bom.. o que busco é incrementar 10 variáveis, cada uma com base nas 10 entradas digitais que receberao pulsos  no Max de 20hz em cada porta. Gostaria de exemplos para implementar isso.

Obs. Já tentei através da leitura do estado dos botões... digitalRead(), TB tentei comparar o estado antigo para o novo e percebendo a mudança de estado,  mas nenhuma com bom resultado.. não postei o código pois nenhum funcionou a contento, partimos da experiência de vcs em qual estratégia usar .. obrigado

Exibições: 95

Responder esta

Respostas a este tópico

Mas qual resultado vc obteve ?

Contagens com "ruido" que geram mais pulsos que o que deveria, conhecido como boucing ?

Ou nem contou, ou o q ?

apesar de ter já o sensor, e  intermediando ele com um comparador para enquadrar a onda certinho e deixar pronto p o microcontrolador ainda não o testei com arduino na pratica. por enquanto em relação ao código para o arduino estou simulando virtualmente ,  colocando um oscilador nas entradas e comparando a saída do terminal virtual ( via soft) com o counter do proteus.. em cada método obtive um resultado bem fora da realidade, por ex neste ultimo, onde faço a leitura do estado do botão e comparo com a vdd ele me deu na simulação a seguinte resposta em tempo x. contador do proteus 55 contador pelo código 16 e agravando q neste teste executei somente 3 portas.. lembro q muito tempo atrás fiz um teste com ccs, e p evitar esse boucing a linha de código era algo perto disso:

 if(input (sensor1))
{
x1 ++;
do{}
while (input (sensor1));
}

mas no arduino não sei lidar por falta de experiencia

A leitura de i/o é feita por:

https://www.arduino.cc/reference/en/language/functions/digital-io/d...

Mas para 10 I/Os eu faria logo lendo um byte... Metodo clássido usado em qualquer microcontrolador antes do advento das tais bibliotecas do arduino.. Como vc não está viciado nelas acho que terá mais facilidade de acompanhar o raciocínio que quem já se rendeu.

https://www.arduino.cc/en/Reference/PortManipulation

Vamos pensar em 8 pinos.

PORTD tem o estado dos pinos 0 a 7.

Se vc fizer algo como:

byte PORTDa; // a de anterior.

byte PORTDi; // i de instantaneo

byte Trans; // transiçoes

int contagem[10]={0,0,0,0,0,0,0,0,0,0};

loop()

{ PORTDi=PORTD; // tira um instantaneo do port, uma foto...

 Trans=PORTi^PORTa; // Faz um exclusive or entre os pinos anteriores e atuais. Isso revela os casos onde está um diferente do outro.

  Trans&=PORTi; // Faz um and entre o estado atual e as transições, revelando quem agora é um mas era 0. Trans agora representa as transições (bordas) de subida.

  for (int i=0;i!=7;i++) { if (Trans&(1i)) contagem[i]++;}

  PORTDa=PORTDi; //Guarda o estado do instantaeo como sendo o estado anterior.

}

Para os I/Os que ficaram de fora vc precisa fazer mais um for() para o PORTB

P.S.:

Esse algoritmo fiz pela primeira vez em assembler, nos anos 90, para um frequencímetro de 40 canais. Na verdade não era um frequencimetro.. era um medidor de tensão em baterias de nobreak de grande porte. Como as bateriais estavam em série cada tomada de tensão gerava uma frequencia via LM331. Por ex 12.345Hz seria 12,34V. 

Bom dia , 

Eu usaria Port Manipulation como o Eduardo sugeriu.

https://www.arduino.cc/en/Reference/PortManipulation

http://playground.arduino.cc/Code/BitMath

Bom dia CL,

Você diz que os pulsos são de no máximo 20 Hz,  mas qual o T high e o T Low destes pulso?

Eles acontecem em uma sequencia inciada por algum deles, ou são aleatórios?

Apesar do arduino (atmega328)  só ter interrupt  especializado nos ports 2 e 3, ele 

tem o interrupt "pinchange", (igual ao PIC), para todos ports.

http://playground.arduino.cc/Main/PinChangeInterrupt  ".

Você pode ter uma rotina que ao detectar um "pinChange", verifique qual port mudou de estado.

RV

Sobre o que os colegas opinaram agradeço, vou dar uma estudada antes de voltar com perguntas.. mineirin, sim pulsos Max de 20hz e vão ser aleatórios, o tempoon/off de cada pulso pode variar um pouco, mas no geral o tempo high vai ser bem baixo, talvez  abaixo dos 5%..

Vou ler TB sobre esse pinchangeinterrupy.

Com certezá volto com mais perguntas.. espero que estejam dispostos a ajudar como agora ... Vlw

Muito bem lembrado Rui.

Esse pin change interrupt  deve dar conta do serviço.

Boa tarde CL,

só pra você entender melhor como funciona o pinChange interrupt,

adaptei este sketch para imprimir a condição do port.

Testa aí e depois conta pra gente.

RV 

Anexos

ola.. venho com um código, inclusive auxiliado pelo amigo RV, durante conversa no chat. testando na pratica tive seguinte resultado. capturando pulsos de 16hz criado através  do mcu da microchip PIC16f877a lançado a 10 portas digitais do arduino uno. os valores lidos pelo monitor serial foram bons até o momento onde o duty permanecia em 50%. abaixo disso e principalmente onde vou precisar capturar pulsos, onde essa frequência terá TOn de menos de 10%, os resultados foram bem ruins.. apesar de ser o msm sinal lançado em todos, cada porta tinha registrado valores bem diferentes não servindo para o projeto,, então se puderem rever comigo agradeço.

Anexos

Boa tarde CL,

pela que você me informou no chat, 

acredito que a solução de usar o interrupt de pinChange não servirá para seu projeto.

Poderá ocorrer sobreposição de contagem.

Sugiro que para este projeto, você utilize o Arduíno DUE, que tem interrupt individual em todos

ports digitais.(54 ports).

RV

Vou comprar então um Due. Ele trabalha em 3v3 terei que usar acopladores em cada entrada (4n25 nao coletor vai o 3v3 , ao emissor a porta do due com resistor de 10k ao gnd, coreto?) .. aguardo mais opiniões sobre o codigo enquanto adquiro a nova máquina kk

ainda não comprei o DUE , mas vou ensaiando o código, preciso de ajuda, tanto se o modelo que escrevi esta correto e se tem alguma maneira mais eficiente para ler tds as interrupções, pois ainda falta preencher + 9 pinos de interrupt.

funcionamento:

seta 10 pinos de entrada, fica monitorando a interrupção por pino do arduino due  e incrementa a variável de cada pino conforme ele acontecer

 due.ino

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço