AtTiny85 leyendo desde el PIN

0

Primero, soy un poco nuevo en este mundo AVR, por favor, no seas tan duro.

Estoy encontrando en un problema muy simple. Estoy intentando usar el ATTiny85 dentro del marco Arduino, pero sin las funciones Arduino digitalRead o digitalWrite (demasiado lento). No tengo ningún problema escribiendo señal a los pines (PORTB & = 0b00000001), pero cualquier cosa que intente, no soy capaz de LEER desde el pin (PINB & 0b0000001).

Sin embargo, esto no es del todo cierto. Lo que sea que intente (PINB & 0b000001, PINB & 0b000010, PINB & 0b000100, siempre valoro la lectura del PIN 0 (pin físico 5). ¿Alguien ha intentado leer el ATTiny? ¿Pin sin la función Arduino? Simplemente estoy tratando de hacer lectura digital aquí. (no analógico) Aquí un código de ejemplo que reproduce el problema.

  DDRB = 0b00001000; // set the LED pin as output.
  while (1) 
  {

    if ( PINB & 0b00000010 != 0) // read the PIN to check if the button is pressed.
    {
      PORTB = 0b00000000; //Turn Off the LED when the button is pressed
    }
    else
    {
      PORTB = 0b00001000;  //Turn on one LED by default
    }
  }  
}
    

1 respuesta

2

Todo se reduce a Prioridad del operador .

En C / C ++, != se evalúa antes de & . Como resultado, su condición es efectiva:

if ( PINB & (2 == 0))

Lo que debería quedar claro es que siempre va a ser 0 - 2 == 0 siempre es 0.

Tienes dos opciones:

  1. Use algo con mayor prioridad en la sentencia if, por ejemplo, () :

    if ( (PINB & 2) != 0 )
    

    Lo que funcionará como se esperaba: los paréntesis se evalúan antes del != .

  2. Confíe en el hecho de que cualquier valor distinto de cero se considera verdadero:

    if (PINB & 2) //True is anything non-zero.
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas