collapse

* Links de Robótica

* Posts Recentes

Ideias para construir um quadrúpede simples por dropes
[Ontem às 21:03]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]


Power_OK Enermax por edeweld
[12 de Novembro de 2017, 17:15]


Driver motor por beirao
[11 de Novembro de 2017, 17:40]


Preciso de uma fonte de corrente constante ? por samc
[09 de Novembro de 2017, 14:18]


Pressoestato 0-10V por artur36
[07 de Novembro de 2017, 23:22]

Autor Tópico: Função digitalWrite() mais rápida  (Lida 1139 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline delphi

  • Mini Robot
  • *
  • Mensagens: 217
Função digitalWrite() mais rápida
« em: 19 de Novembro de 2009, 19:45 »
Olá,

A função "digitalWrite" pode demorar cerca de 5 micro-segundos a mudar de estado, enquanto que com "acesso directo" demora 125 nano-segundos para a mesma tarefa.


Código: [Seleccione]
#define fastWrite(_pin_, _state_) ( _pin_ < 8 ? (_state_ ?  PORTD |= 1 << _pin_ : PORTD &= ~(1 << _pin_ )) : (_state_ ?  PORTB |= 1 << (_pin_ -8) : PORTB &= ~(1 << (_pin_ -8)  )))
// the macro sets or clears the appropriate bit in port D if the pin is less than 8 or port B if between 8 and 13

 void Pulse(double on, double off) {
  fastWrite(7, HIGH); // set Pin high
  delayMicroseconds(on); // waits "on" microseconds
  fastWrite(7, LOW);   // set pin low
  delayMicroseconds(off); //wait "off" microseconds
}

In http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226290298
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.135
    • Tróniquices
Re: Função digitalWrite() mais rápida
« Responder #1 em: 19 de Novembro de 2009, 20:36 »
Se só queres inverter o estado actual do pino, tenta isto:

Código: [Seleccione]
#define toggle(pin)  (pin < 8? PIND = 1 << pin : PINB = 1 << (pin - 8))
Este deve demorar 62.5ns, 1 clock (se o compilador for esperto o suficiente para usar a instrução "out", mais logo em casa vejo isso). Não é possível fazer mais rápido com o AVR a 16MHz, a não ser usando uma saída PWM, SPI, I2C...

Também há um detalhe que vale a pena ser mencionado. Ambas estas macros só são rápidas se o nº do pino e o estado forem constantes. Se forem por exemplo variáveis, aí já são mais lentas, embora muito mais rápidas que os tais 5us.
« Última modificação: 19 de Novembro de 2009, 20:41 por Njay »