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);
}
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).
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.
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.