Registros PORT, DDRB y PIN arduino Uno

Hola estoy haciendo unas pruebas para trabajar con los registros con el Arduino Uno.

Tengo un problema, enciendo y apago un led con el registro PORT, concretamente utilizo el PIN11 y hago que se encienda y apague el led cada segundo y funciona correctamente.
Pero el problema es que conecto el pin 11 con el 10 del arduino, (el PIN 10 lo he configurado como entrada), leo el pin 10 con PINB & (1<<PB2) ) y guardo ese valor en una variable y lo imprimo por el monitor serial.
Pero no consigo que salga nada en el monitor serial.

Alguien sabe porque o donde estoy cometiendo un fallo?

byte my_var = 0; //Variable para guardar la información leída en PORTB

void setup() {
  //Pin10 como entrada el resto salida.
  //Para tener comunicación Serial añadir  DDRB |
  DDRB = DDRB | 0b11111011;
}

void loop() {
  //Enciende todos los Pins
  PORTB = 0b11111111;
  my_var = (PINB & (1<<PB2)) ; /* Lee el pin 2 de PORTB y lo coloca en la variable.*/
  Serial.println(my_var);
  delay(1000);
  //Apaga Pin 11
  PORTB = 0b11110111;
  my_var = (PINB & (1<<PB2)) ; /* Lee el pin 2 de PORTB y lo coloca en la variable.*/
  Serial.println(my_var);
  delay(1000);
}

Gracias,

Un saludo.

Te faltó Serial.begin() quizá; no sé, digo yo ::slight_smile:

PD:

//Para tener comunicación Serial añadir   DDRB |

No sé de dónde lo sacaste, pero eso no tiene sentido.

Primero: el | (OR a nivel de bits) se usa para activar (poner en 1) determinados bits, en este caso para definir pines como salidas; pero nada que ver con el puerto serial porque...
Segundo: el registro que estás tocando no afecta en absoluto al puerto serial (USART).
Tercero: los pines del puerto serial están en el puerto D, no en el B. Además, si el USART está habilitado, ni DDRD ni PORTD tendrán efecto alguno sobre los pines 0 y 1 (rima no intencional por cierto).

Gracias :slight_smile: .

Lo vi aquí: http://panamahitek.com/registro-port-puerto/

Código actualizado.

int my_var = 0; //Variable para guardar la información leída en PORTB

void setup() {
  //Pin10 como entrada el resto salida.
  DDRB = 0b11111011;
  Serial.begin(9600);
}

void loop() {
  //Enciende todos los Pins
  PORTB = 0b11111111;
  my_var = (PINB & (1<<PB2)) ; /* Lee el pin 2 de PORTB y lo coloca en la variable.*/
 Serial.print("Pin a 1: ");
  Serial.println(my_var);
  delay(1000);
  //Apaga Pin 11
  PORTB = 0b11110111;
  my_var = (PINB & (1<<PB2)) ; /* Lee el pin 2 de PORTB y lo coloca en la variable.*/
  Serial.print("Pin a 0: ");
  Serial.println(my_var);
  delay(1000);
}

Obtengo salida por el monitor serial. Pero porque cuando el pin esta en HIGH la lectura que realiza da 0 y cuando el pin esta en LOW la lectura realizada es 4.

salida.jpg

salida.jpg

edgar1421:
Lo vi aquí: http://panamahitek.com/registro-port-puerto/

El consejo no es del todo correcto. Está bien dejar los dos primeros bits en 0, pero no aplica para cualquier puerto (X); si hablamos de puerto serial, sería únicamente para el puerto D.

Por cierto, en el puerto B se suelen reservar los dos últimos (más significativos) bits; ya que esos pines son los que conectan con el oscilador externo de 16 MHz.
En el puerto C también, el penúltimo no hace nada y el último conecta con el botón de RESET (razón por la cual los pines A6 y A7, en un Nano o Pro Mini, no pueden ser digitales).

edgar1421:
Obtengo salida por el monitor serial. Pero porque cuando el pin esta en HIGH la lectura que realiza da 0 y cuando el pin esta en LOW la lectura realizada es 4.

Cuando escribas al puerto B (PORTB), evita poner en 1 el tercer bit (pin 10); de lo contrario la entrada activará su pull-up y... al parecer invierte la lógica cuando se intenta hacer la lectura (PINB).

Ya lo del 4 es porque operas sobre el tercer bit y no el primero. Si quieres que en su lugar imprima "1", desplaza dos bits hacia la derecha o declara la variable como boolean.

Me parece que ese tema quedo bien explicado en ArduWiki.