1-Wire DS18B20 en poderoso 1284p no puedo encontrar mis sensores, los mismos sensores funcionan con Duemilanove

He subido el DS18x20 Temperatureboceto de ejemplo (sin modificar, excepto que probé varios pines para la comunicación I2C) a mi probado Duemilanove y mi mighty 1284p.

En el Duemilanove mis dos DS18B20sensores de temperatura se encuentran y se leen correctamente:

ROM = 28 36 6D 51 4 0 0 75
  Chip = DS18B20
  Data = 1 D6 1 4B 46 7F FF A 10 43  CRC=43
  Temperature = 29.37 Celsius, 84.87 Fahrenheit
ROM = 28 19 6 51 4 0 0 86
  Chip = DS18B20
  Data = 1 A7 1 4B 46 7F FF 9 10 E0  CRC=E0
  Temperature = 26.44 Celsius, 79.59 Fahrenheit
No more addresses.
(...)

Mientras que el 1284p solo dice

No more addresses.

No more addresses.

(...)

No he cambiado el cableado de los sensores; están conectados +5/GND, los datos se extraen a +5V con un 2k7 y también al pin de lectura, respectivamente. He probado varios pines para la comunicación I2C: todos funcionan en Duemilanove, ninguno funciona en 1284p.

Asumo algunos problemas con I2C con mighty 1284p, pero tal vez alguien más tenga otra idea.

Aquí está el código (el boceto de ejemplo sin cambios, me han enseñado a "incluir el código usado, ¡siempre!", Así que aquí está):

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(0);  // on pin 10

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

Gracias.

¿Puede probar la actividad en el pin que está utilizando, por ejemplo. utilizando un osciloscopio? Debería ver actividad en el pin cuando intenta encontrar dispositivos. No use los pines d0 y d1, están cableados ligeramente diferentes en el Arduino, lo que puede causar problemas en algunas circunstancias. En una nota al margen: OneWire no es I²C.
Lamentablemente no tengo osciloscopio. Intentaré conectar mi buspirate y ver si puedo espiar algún dato de OneWire. ¡Gracias por el consejo!
OLS (usando BusPirate) parece ser incapaz de mostrar los niveles lógicos cambiando con el Arduino (OneWire funcionando) ni con mi 1284p (OneWire aún no funciona). El BusPirate en sí mismo puede leer y acceder a los dispositivos OneWire sin problemas.

Respuestas (1)

Resulta que tenía el ATMega1284p funcionando a "solo" 1 MHz. Fusionarlo para que funcione a 8 MHz hizo que todo funcionara bien. Conexión estable, reconocimiento confiable de sensores, sin pérdidas de datos por lo que puedo ver.

Intentaré ponerme en contacto con el mighty1284py Arduino OneWire Libraryla gente para discutir esto, supongo que su código asume que el dispositivo está funcionando a 8 MHz o que funciona a 1 MHz hace que la comunicación no sea confiable.