elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda máscara de bits. ATmega
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda máscara de bits. ATmega  (Leído 2,082 veces)
kotito

Desconectado Desconectado

Mensajes: 3


Ver Perfil
duda máscara de bits. ATmega
« 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:
/****************************************************** 
Programa para gestion de pulsadores por interrupcion ******************************************************/
#include <avr/interrupt.h> /* Tipo bits para acceso a nivel de bit en GCC */
typedef struct{
uint8_t b0:1;
uint8_t b1:1;
uint8_t b2:1;
uint8_t b3:1;
uint8_t b4:1;
uint8_t b5:1;
uint8_t b6:1;
uint8_t b7:1; } bits;
//Definicion de entradas
#define Tecla_SW5 (* (volatile bits *) &PIND).b5
//variables globales unsigned volatile char tecla;

// Rutina de tratamiento de interrupción externa
ISR(INT0_vect) {
if (!(PINB&(1<<PB1))) tecla=0x01;
else if (!(PINB&(1<<PB2))) tecla=0x02;
else if (!(PINB&(1<<PB3))) tecla=0x03;
else if (!(PINB&(1<<PB4))) tecla=0x04;
else tecla=0x05; // Apaga si se pulsan varias teclas
EIFR|=_BV(INT0); //Opcional, Bajamos la bandera de interrupción
}
unsigned char Siete_seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x00};
/**********************************************************
Rutina de inicio. (habilita interrupciones y INT EXT) **********************************************************/
void setup() {
DDRC=0xFF; //Puerto C como salida
DDRB=0x00; //Puerto B como entradas
PORTB=0xFF; // Activa pull-up
DDRD=0x00; //Puerto D como entradas
PORTD=0xFF; // Activa pull-up
tecla=0; //Habilita int flanco ascendente
EICRA &= ~(_BV(ISC00) | _BV(ISC01)); // Habilita interrupcion externa en patilla PD2 EIMSK|=_BV(INT0); }

void loop() {
PORTC=~Siete_seg[tecla]; //Codifica para mostrar el digito
if (!Tecla_SW5) tecla=0x00; // Saca un cero
}


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


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: duda máscara de bits. ATmega
« Respuesta #1 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) \
(1 << (bit))
Lo hemos visto más arriba que hace esto, fácil.
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.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda en conversion de 24 bits a 32 bits
Programación C/C++
armizh 6 4,033 Último mensaje 23 Enero 2012, 07:03 am
por BlackZeroX
Duda con mascara 255.255.0.0
Redes
virtualedu 1 3,073 Último mensaje 23 Septiembre 2012, 10:02 am
por moikano→@
Duda sobre ip o mascara,
Dudas Generales
Ivan2k 1 1,833 Último mensaje 7 Febrero 2014, 18:04 pm
por CloudswX
Comprar atmega 328 (solo el chip)
Electrónica
priorigi_10 3 3,843 Último mensaje 29 Junio 2014, 17:02 pm
por simorg
máscara de bits
Scripting
Joe Fraddy 7 3,996 Último mensaje 20 Febrero 2015, 04:52 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines