Arduino: alternativas mais rápidas para digitalread () e digitalwrite ()?

13

Quais são as alternativas mais rápidas para chamar as funções do Arduino digitalread()e digitalwrite()? Soluções específicas para AVR ou chip são aceitáveis.

Mark Harrison
fonte
3
Lendo esta e sua última pergunta, parece que você deseja fazer algo rapidamente. Acho que dar detalhes sobre o que é e com que rapidez pode ser útil.
Oli Glaser
@ Oli, boa ideia, obrigado. O projeto atual é um sistema de sintonia para transmissores RC. Funciona bem, mas gostaria de tornar a decodificação do sinal RC PWM eficiente, para que eu possa usar a mesma estrutura em outros projetos. Aqui está um artigo sobre o que tenho até agora: eastbay-rc.blogspot.com/2011/11/…
Mark Harrison

Respostas:

18

Acesse as portas digitais diretamente!

Os três métodos que testei foram

  • digitalWrite (pino, BAIXO); digitalWrite (pino, ALTO);
  • CLR (PORTB, 0); SET (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[...]

insira a descrição da imagem aqui

Como você pode ver, o digitalWrite leva cerca de 56 ciclos para ser concluído, enquanto o endereçamento de porta direto leva 2 ciclos. Essa é uma grande diferença no tempo para programas que possuem muitas operações de E / S!

Marty
fonte
2

Como sugerido acima, acesse as portas digitais diretamente. Mas com estilo!

Ao escrever valores codificados diretamente nos registros de hardware, você perde a legibilidade e a portabilidade.

Publiquei no Github uma ferramenta chamada HWA que permite usar uma interface orientada a objetos para o hardware que não requer um compilador C ++ e produz código binário de alta eficiência.

HWA está lá: https://github.com/duparq/hwa

duparq
fonte
1
"código binário de alta eficiência" soaria muito mais autoritário junto com as medições reais.
Dmitry Grigoryev
2

O pessoal do Arduino.SE discutiu e testou isso. Como se vê, digitalWriteFast()não há muita melhoria em relação ao normal digitalWrite(). O acesso direto à porta, no entanto, é cerca de 35 a 40 vezes mais rápido que digitalWrite().

Dmitry Grigoryev
fonte
0

Use o ChipKit Uno32. É muito mais rápido que os Arduinos baseados em AVR. Ele também irá lidar com seus problemas de tempo.

Leon Heller
fonte
1
Não acho que comprar hardware mais rápido seja a melhor resposta aqui, pelo menos até você atingir os limites do seu hardware atual e decidir que precisa de algo mais rápido.
Jon G
1
Por que os votos negativos? Ele queria a solução mais rápida , não apenas a mais rápida, que eu forneci. Alguém pode sugerir uma solução mais rápida baseada em Arduino?
Leon Heller
12
Porque o ChipKit não é um arduino, mas uma plataforma compatível com arduino. Isso significa que, embora a troca de portas seja mais rápida, há uma grande probabilidade de reescrita de algumas bibliotecas. As bibliotecas de cartões Ethernet, XBee, SD podem não funcionar de maneira nenhuma. Além disso, Mark solicita especificamente chamadas de função alternativas do digitalRead / Write, não uma nova plataforma (doh).
Hans
2
Mudar de hardware nunca é uma boa solução. No mínimo, você perde um bom aprendizado e nunca aprenderá o que seria o uso eficiente do hardware.
Rick_2047
1
@ Rick_2047 Eu não diria "nunca" - se o requisito for novo ou expandido ou a quantidade aumentar, pode fazer sentido procurar alternativas. Mas eu concordo que jogar cegamente hardware com ineficiências grosseiras de software não é sofisticado - às vezes nem funciona, pois sistemas de alto desempenho podem adicionar sobrecarga própria e às vezes acabam mais lentos que os mais simples para algumas tarefas. Não há realmente nenhum substituto para aprender sobre a plataforma que você usa ou pensa em usar.
Chris Stratton