Lectura pin digital con puertos[SOLUCIONADO]

Hola,

estoy intentando calcular el duty cycle de un pulso midiendo el tiempo entre falco de subida y de bajada con estas instrucciones:

//Lectura de pin digital con digitalRead()

while(digitalRead(2)==0);

D1_ch1 = micros();

while(digitalRead(2)==1);

D2_ch1 = micros();

Duty_ch1 = (D2_ch1 - D1_ch1);

y mas o menos obtengo valores correctos con digitalRead(), que serian de 1000 a 2000 microsegundos, pero quiero utilizar los puertos para leer el valor del pin para ganar velocidad en los tiempos de ejecucion y la medida de tiempo que me da es de 4 microsegundos. Si se supone que…

(PIND & (1<<PD2)) = digitalRead(2), porq no obtengo la misma lectura de tiempos


// Lectura de pin digital con registro PIND

while((PIND & (1<<PD2))==0);

D1_ch1 = micros();

while((PIND & (1<<PD2))==1);

D2_ch1 = micros();

Duty_ch1 = (D2_ch1 - D1_ch1);

==============================================

Estaba escribiendo mal la sentencia, no hace falta hacer la comparacion , si no, comprobar si el pin esta activado o no.

Forma correcta :

while( ! (PIND & (1<<PD2)));

D1_ch1 = micros();

while((PIND & (1<<PD2)));

D2_ch1 = micros();

Duty_ch1 = (D2_ch1 - D1_ch1);

Cierto. Hay que tener cuidado cuando mezclamos lógica de bits y de bytes, pues efectivamente PIND & (1<<PD2) no va a ser 0/1, sino 0/4. Sí se puede tomar en ambos casos como valor true/false.
También pasó el error desapercibido para mí hasta que lo has desvelado tú mismo, ¿eh? Es la típica tontería que te puede proporcionar “entretenimiento” un buen rato :wink:

En verdad, los fallos mas absurdos, son los que mas cuesta ver :confused: y si...te hacen perder mucho pero que mucho tiempo. Me alegro de haber despejado la incognita :).