collapse

* Posts Recentes

LusoRobótica - Website - Estado actual por almamater
[Hoje às 16:39]


Power spike on power off por SerraCabo
[Hoje às 15:34]


Circuito para distinguir fase do neutro por TigPT
[Ontem às 14:04]


Vídeo sobre o projecto e a montagem de um conversor 12VDC - 230VAC por senso
[19 de Novembro de 2018, 15:39]


Compra Colectiva Mouser N3-2018 (limite 25 Nov) por Hugu
[19 de Novembro de 2018, 01:01]


Vídeo - selecção da uma fonte de alimentação em substituição de um transformador por vasco
[18 de Novembro de 2018, 16:21]


Placa BMS Desliga por jm_araujo
[17 de Novembro de 2018, 22:36]


Vende-se MUITO e BOM material por m90mine
[13 de Novembro de 2018, 23:32]


leitura de voltagens com o analogRead(A0) por vasco
[08 de Novembro de 2018, 13:59]


Controlar Velocidade Motor AC por senso
[06 de Novembro de 2018, 23:05]

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