Ir ao conteúdo

Posts recomendados

Postado

Pessoal, to fazendo a leitura de uma roda fonica com arduino e, por conta da rpm elevada do bixão (por volta de 7 mil rpms) preciso fazer os digitalWrite e ler o sensor da forma mais rápida o possível

 

Ja otimizei o código substituindo os digitalWrite por PORTB=B11000100(exemplo)

também fiz uma máscara de váriavel para aumentar a frequencia da leitura do ADC, trocando o prescaler de 128 por 16 conforme a tabelaadc_prescaler.png.e980ab63796a70b2978122b3a9e3ab52.png

mas, queria saber como fazer um digitalRead usando comandos do registrador.

 

O que eu consegui encontrar foi usando o comando DDRX onde o x é a letra das portas, no caso do arduino:

DDRD para portas de 0 a 7

DDRB para portas de 8 a 13

PINX para a porta em questão

 

 Mas, novamente, volto a perguntar. Como fazer digitalRead direto nos registradores para ganhar "tempo"?

Postado

@lucianolcoa ,

 

Tá meio confuso para mim ....

 

Você fala em ADC, mas pede uma leitura digital ..... afinal, aonde entra o conversor A/D nisso tudo ?

Outra coisa, se você multiplicou o sample por 8, a sua resolução vai cair de 10 bits para 8 bits ou até menos, veja se isso não é problema para você.

 

E o que significa fazer um digitalRead nos registradores ?????? Até onde eu saiba, posso fazer um Read direto nos pinos de I/O, mas juro que não entendo isso que você quer fazer ....

 

Sei que existem bibliotecas otimizadas para FAST I/O com o Arduíno, procure por elas....

 

Paulo 

  • Curtir 1
Postado

@aphawk  É mais de "verões passados" Que muitas vezes eu chegava aqui com uma duvida e a galera achava que eu não havia pesquisado antes.

 

Expliquei que consegui declarar i digitalWrite direto no registrador, o que andei lendo por ahe que é 42x mais rápido que so colocar digitalWrite

e também mudei o prescaler para fazer a leitura do adc mais rápido.

 

Mas queria saber como declara digitalRead direto no registrador. Essa é a duvida em questão.

 

digitalRead no registrador seria "rebaixar" a linguagem do arduino.

 

Em vez de digitar 

int b= digitalRead(8);

eu colocar um código em c que fasse isso mais rápido.

Vi num blog que o comando para isso seria:

//exemplo para o pino 8

DDRB=B11000001;
PORTB=B11000001;
bool x=(PINB &(1<<PINB0)

 

Postado

@lucianolcoa ,

 

Sim, tratamento de I/O e interrupção nativa da linguagem do Arduíno é terrivelmente deficiente.

 

Essas instruções DDRB e PORTB definem os pinos que te interessam como entrada, mas também definem outros pinos como saída !

 

Tem de saber quais pinos estão sendo usados como entrada e quais estão sendo usados como saída, aí você "monta" esses comandos da forma correta, e pode usar esse tipo de comando no final, lendo o PINB.

 

Para que quiser saber mais :

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

 

Paulo

 

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!