collapse

* Posts Recentes

Como transformar um mosquito killer de tomada em um portátil? por KammutierSpule
[Hoje às 11:56]


Carregador para 18650 por brunus
[Ontem às 23:16]


cabo utp cravar por brunus
[Ontem às 23:15]


Keysight UXR 110GHz BW, 256GS/s, 10-bit Real-Time Oscilloscope por SerraCabo
[Ontem às 20:26]


leitura de voltagens com o analogRead(A0) por jm_araujo
[16 de Setembro de 2018, 18:36]


BostonDynamics - Vai uma mãozinha? por josecarlos
[16 de Setembro de 2018, 11:26]


Comunidades Online de Drones por MAntunes
[09 de Setembro de 2018, 18:00]


Sorte do catano por Njay
[09 de Setembro de 2018, 16:51]


BUILD: Toolmaker's Clamp Thingy por TigPT
[08 de Setembro de 2018, 20:19]


Telescopio por Njay
[08 de Setembro de 2018, 15:27]

Autor Tópico: Função digitalWrite() mais rápida  (Lida 1296 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.343
    • 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 »