Orden de configuración de pin analógico / digital AtTiny85 en la configuración

3

Error en el compilador o lo que sea?

Circuito simplificado hay 2 LEDs y 1 entrada analógica. El LED conectado al pin PB1 se enciende muy débil cuando la salida es alta. Parece que la salida se ha configurado en modo de alta impedancia. Eso sucede si dentro de setup() la entrada analógica A1 (pin 7, PB2) se configura después de la salida digital PB1. Si se cambia el orden de configuración de pin, todo está bien. ¿Es ese error del compilador?

/*            ____
    D5 PB5  1|o   |8  Vcc
    D3 PB3  2|    |7  PB2 A1   Voltage measurement, potentiometer
    D4 PB4  3|    |6  PB1 D1   --|>--|
       GND  4|____|5  PB0 D0   --|>--|
*/

byte led0 = PB0;
byte led1 = PB1;
byte potentiometer = A1;
int voltage;

/* It is important in which order pin configuration has been set.
Wrong order causes PB1 to high impedance, low current, output.
This must be compiler bug, I think.
If port BP1 setup has been made using straight to register there is no problem in order.
Any other analog input port and digital port combination works correctly. 
*/

void setup()
{
  pinMode(led0, OUTPUT);
  pinMode(led1, OUTPUT);  // Doesn't work if this is before pinMode(potentiometer, INPUT);
  //DDRB &= ~(1 << DDB2); // Alternative working setup for analog input A1
  pinMode(potentiometer, INPUT);  
  //pinMode(led1, OUTPUT);  // Works if this led1 setup is after pinMode(potentiometer, INPUT);
}

void analog_input()
{
  voltage = analogRead(potentiometer);
  if (voltage < 500) {
    digitalWrite(led0, HIGH);
    digitalWrite(led1, LOW);
  }
  else
  {
    digitalWrite(led0, LOW);
    digitalWrite(led1, HIGH);
  }
}

void loop()
{
  analog_input();
}
    
pregunta Paavo Merilinna

3 respuestas

1

Debe tenerse en cuenta que el IDE de Arduino no es compatible con ATtiny de forma inmediata. Hay varias implementaciones de terceros (por ejemplo, 1 , 2 , 3 ) que proporciona los archivos necesarios (en su mayoría, definiciones de pines) para Arduino, y no nos lo dijo cuál estás usando.

El error parece que la implementación que estás usando ha arruinado las definiciones de máscara de pin, ya que aplicar la máscara correcta directamente en tu código funciona. Debe verificar el código que termina compilando (específicamente las constantes utilizadas en la función pinMode() ) para detectar errores obvios. Hay archivos make para Arduino (por ejemplo, arduino-mk ) que pueden recibir instrucciones para proporcionarle el archivo *.cpp preprocesado, como lo ve el compilador. Siempre prefiero mirarlos, porque representan el código real , después de todos los trucos que saca el IDE de Arduino.

Si hacer eso suena demasiado difícil, te sugiero que envíes un error al desarrollador de la implementación que estás utilizando. O simplemente elija una implementación diferente, que probablemente tendrá un conjunto diferente de errores.

El error del compilador parece poco probable, ya que los compiladores generalmente se prueban rigurosamente antes de ser lanzados, a diferencia de los proyectos amateur en github.

    
respondido por el Dmitry Grigoryev
1

Como se indica en la documentación, no puede usar las definiciones de A # para pinMode (); obtendrá un comportamiento inesperado. Debe utilizar el número de pin de Arduino, o el PIN_xx define. PBx funciona en el tiny85, pero puede que no funcione en todos los chips: las definiciones de PBx provienen del compilador y están # definidas para el número de bits dentro de los registros de puertos que controlan ese pin.

Editar: interpretar mal el problema original.

    
respondido por el Dr. Azzy
0
  

. ¿Es ese error del compilador?

Al menos tres cosas están involucradas y potencialmente hay más.

  1. Su hardware.
  2. El puerto Arduino para su hardware.
  3. Thee compiladores.

Sin descartar los otros factores, es difícil culpar al compilador.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas

Comentarios Recientes

En el código de configuración Salida al encabezado GPIO Volumen USB agregado a los LED de estado Pin de lectura digital GPIO (gran velocidad de transmisión) Salida al LED de estado Código de estado de transferencia al código del temporizador Corriente de salida al LED de estado En el tiempo de ejecución (después del apagado) para el parpadeo del botón de apagado (porque se cancela) Escribir / agregar una conexión de terminal de datos a un Arduino para suministrar la entrada del usuario a: LED1 LED0 Toque de... Lees verder