collapse

* Posts Recentes

Fabricação de ferramenta de corte por zordlyon
[Hoje às 00:23]


SCT-013 + i2c eeprom, Gravar e Ler dados. por dennis_boy
[Ontem às 21:43]


Controlar Motor AC por senso
[Ontem às 12:34]


Apresentação do Legendary Urban Hacker por Sarat
[Ontem às 00:24]


Redes LoRa por ralex
[22 de Abril de 2018, 22:53]


Canal de video aulas no youtube! por zkreamer
[22 de Abril de 2018, 21:58]


Nueva en el Foro!!!!!!!! me presento!! por zkreamer
[22 de Abril de 2018, 21:48]


Alguem usa as libs md_max72xx e md_parola ? por vasco
[21 de Abril de 2018, 23:44]


Paineis Fotovoltaicos para Autoconsumo (Kits EDP)? por KammutierSpule
[20 de Abril de 2018, 13:42]


Como repôr posições dos Icones/Pastas no Desktop W8? por senso
[19 de Abril de 2018, 23:55]

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