¡ Hola !
Necesito resolver una pequeña duda y he echado mano de este foro para ver si la puedo solventar.
Hay alguna instrucción que me permita cambiar el estado lógico de un pin sin tener que evaluarlo? Me explico: esté como esté el pin, ya sea a uno o a cero, que se cambie al estado contrario, sin tener que evaluarlo con el posible if / else, para que así consiga hacerlo en una sola línea de código y emplear el menor tiempo posible
Muchas gracias. :D
Si extraes el valor, este será 1 o 0, si tratamos 1 como booleano verdadero y 0 como booleano falso puedes hacer estado=!estado para cambiar.
He puesto PIN_B1=!PIN_B1; pero al compilar no me pilla esa expresión
Sí existe.
Creo recordar que debes usar o/y lógicos para cambiar el pin(bit?)
Utiliza una XOR:
cplusplus.com :
XOR (Exclusive Or)
This operation is performed between two bits (a and b). The result is 1 if either one of the two bits is 1, but not in the case that both are. There for, if neither or both of them are equal to 1 the result is 0.
XOR (^)
a b a^b
0 0 0
0 1 1
1 0 1
1 1 0
La utilidad de la XOR en este caso, es que algo XOR 1 = !algo.
Por tanto:
bool a=1, PIN_B1=0;
PIN_B1=a^PIN_B1
cambia el estado de PIN_B1 al negado.
No valdría en vez de usar XOR usar el complemento "~"?
Por ejemplo:
PIN_B1 = ~PIN_B1
Pregunto, no tengo aun claro los operador de bits xD
@El_Java:
Si, de hecho esa es la respuesta que precisamente se está buscando y en la que no había caído. Me acostumbré a la XOR cuando necesito cambiar un bit en concreto para máscaras usando enteros y no pensé en el complemento.
Me alegro de haber ayudado, no estaba seguro, los operador de bits me lian muchisimo.
Por cierto Akai, sino te importa echale un ojo a mi tema del foro, que se que tu entiendes bastante, a ver si pudieras ayudarme.
Un saludo.
gracias pero... no sé qué pasa, no me pilla la instrucción, me da error el compilador. No puedo asignarle nada al pin (=) pero sí evaluarlo (==). Me dice esto: expecting LVALUE such as a variable name or * expression
Si pones el código que da problemas, es probable que podamos ayudarte sin recurrir a bolas de cristal adivinatorias.
Sí claro como no:
PCW y es el clásico reloj con 4 displays, y los segundos vienen marcados por dos leds centrales que se encienden y apagan. La señal les viene del pin B1, donde su instrucción la estoy implementado en esta rutina o función, que a cada segundo pasa por ahí con el consiguiente retardo. estoy pensando que tal vez sea este compilador no sé ni que versión es.
este es el error que me da:
(http://img836.imageshack.us/img836/3735/77098676.jpg)
main:
(http://img3.imageshack.us/img3/7923/34305399.jpg)
la rutina:
(http://img856.imageshack.us/img856/1671/13648969.jpg)
y las directivas declaradas:
(http://img607.imageshack.us/img607/2605/51916608.jpg)
Lo interesante sería saber en qué y ver la linea del código da ese error, porque no parece verse en los fragmentos que tu has puesto.
Por otro lado, recordemos que ^ es una XOR bit a bit, por tanto si el PIN_B1 tiene más de un bit y le haces una XOR a 1, únicamente alterarás el LSB, el bit menos significativo. Para 2 bits, necesitarías hacer la XOr con 0x3, para 3 con 0x7 ...