Título: duda máscara de bits. ATmega Publicado por: kotito en 15 Junio 2017, 00:16 am Hola.
Tengo un código hecho en c del cuál hay unas líneas que no se como interpretarlo. El código es el siguiente Código: /****************************************************** Hay unas líneas que no se como funcionan, se que son máscaras de bits pero no se como funcionan realmente. Por ejemplo, if (!(PINB&(1<<PB1))) ---> si... qué? EICRA &= ~(_BV(ISC00) | _BV(ISC01)) --> no se que valor se guarda en EICRA Agradecería toda ayuda Título: Re: duda máscara de bits. ATmega Publicado por: MAFUS en 16 Junio 2017, 01:11 am !(PINB&(1<<PB1))
Sencillo. Primero, paréntesis interiores: Desplazar el número 1 tantos bits a la izquierda como marque PB1, rellenando con 0 las posiciones vacías que queden a la derecha. Por ejemplo, 1<<3 = 1000 binario = 8 decimal. Segundo, paréntesis externos: Se opera AND a nivel de bits el valor PINB con el valor conseguido en el resultado anterior. Por ejemplo, 12 & 8 = 8. Visto en binario 1100 & 1000 = 1000. Por último la negación: Si un número es diferente de 0 devolverá 0. Si un número es 0 devolverá un número diferente de 0. O dicho lógicamente: si el argumento es FALSE devolverá TRUE, si el argumento es TRUE devolverá FALSE. Por tanto la sentencia entera dice: mira en PINB si el bit PB1 está a nivel bajo. EICRA &= ~(_BV(ISC00) | _BV(ISC01)) Es lo mismo que EICRA = EICRA & ~(_BV(ISC00) | _BV(ISC01)) Antes de nada ¿qué es _BV? _BV es una macro codificada de esta forma: Código: #define _BV(bit) \ Paréntesis. | es el operador OR a nivel de bits. Por ejemplo: 8 | 4 = 12. Visto a nivel de bits 1000 | 0100 = 1100 ~ es el operador NOT lógico a nivel de bits o, también se le puede llamar, complemento a 1. Por ejemplo: Supongamos una palabra de 4 bits sin signo. ~10 = 5. Visto a nivel de bits ~1010 = 0101. El operador & ya hemos visto que hace. Todo junto dice: Pon a 0 los bits ISC00 e ISC01 a EICRA. |