collapse

* Posts Recentes

ATtiny, com enfase no sufixo... por Njay
[Hoje às 01:20]


O meu plano para produzir fotograficamente circuito impresso por SerraCabo
[Hoje às 00:41]


Medidor de indutâncias por SerraCabo
[Ontem às 15:53]


O Java vai 'ter' que ser comprado por SerraCabo
[Ontem às 15:46]


Dicas para arranjo de Fio\Ficha por jm_araujo
[19 de Julho de 2018, 08:31]


Primeira fonte de bancada por Njay
[19 de Julho de 2018, 00:38]


Guardar componentes em gavetas ou em caixa de armazenamento por edeweld
[18 de Julho de 2018, 11:57]


Empresas para fabricar e assemblar PCB por edeweld
[17 de Julho de 2018, 23:03]


Comprar solda decente por Njay
[17 de Julho de 2018, 11:47]


Software POS Restauraçao por edeweld
[17 de Julho de 2018, 10:41]

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