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: 903

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

ola , já estou com o Arduino DUE em mãos e realizei um teste. utilizei 10 pinos como interrupção ( pino 2 ao 11) injetei um sinal com frequência de 18hz em todos esses pinos. os resultados foram bons, porem encontrei discrepância em 4 pinos desses , vejam a contagem rodado aprox. 10 segundos:

sensor1 : 183
sensor2 : 183
sensor3 : 182
sensor4 : 182
sensor5 : 248

sensor6 : 260

sensor7 : 243

sensor8 : 245

sensor9 : 184
sensor10 : 185

abaixo vou adicionar o arquivo com o código

Anexos

Bom dia CL,

algumas observações sobre seu sketch.

1. Defina o interrupt no setup(), pra não precisar ficar repetindo durante todo o loop.

      attachInterrupt(interrupcao1, interrupcao_....., FALLING); // seta a leitura de interrupcao para o pino ....

2.  O método Serial.print. gasta tempo de processamento e usa interrupts também,

então use o Serial.print a cada, digamos 100 medidas.

Testa o sketch que postei e conta pra gente o resultado.

RV

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço