LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: delphi 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.
#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 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226290298)
-
Se só queres inverter o estado actual do pino, tenta isto:
#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.