1-Wire DS18B20 auf mächtigen 1284p kann meine Sensoren nicht finden, dieselben Sensoren funktionieren mit Duemilanove

Ich habe den DS18x20 TemperatureBeispiel-Sketch (unverändert, außer ich habe mehrere Pins für die I2C-Kommunikation ausprobiert) auf meine bewährte Duemilanove und meine mighty 1284p.

Auf dem Duemilanove DS18B20werden meine beiden Temperatursensoren gefunden und korrekt ausgelesen:

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.
(...)

Wobei die 1284p nur sagt

No more addresses.

No more addresses.

(...)

Ich habe die Verkabelung der Sensoren nicht verändert; Sie sind mit +5/GND verbunden, Daten werden mit einem 2k7 auf +5V und auch auf den Lesestift gezogen. Ich habe mehrere Pins für die I2C-Kommunikation getestet - sie funktionieren alle auf dem Duemilanove, keiner funktioniert auf dem 1284p.

Ich vermute einige Probleme mit I2C mit mighty 1284p, aber vielleicht hat jemand anderes eine andere Idee.

Hier ist der Code (die unveränderte Beispielskizze, mir wurde beigebracht, "immer den verwendeten Code einzufügen!", also hier ist er):

#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");
}

Danke schön.

Können Sie die Aktivität auf dem Pin testen, den Sie verwenden, z. mit einem Oszilloskop? Sie sollten Aktivität auf dem Pin sehen, wenn er versucht, Geräte zu finden. Verwenden Sie nicht die Pins d0 und d1, sie sind auf dem Arduino etwas anders verdrahtet, was unter Umständen zu Problemen führen kann . Nebenbei bemerkt: OneWire ist nicht I²C.
Leider habe ich kein Oszilloskop. Ich werde versuchen, meinen Buspirat anzuschließen und zu sehen, ob ich irgendwelche OneWire-Daten ausspionieren kann - danke für den Tipp!
OLS (mit dem BusPirate) scheint weder die Änderung der Logikpegel mit dem (OneWire funktionierenden) Arduino noch mit meinem 1284p (OneWire funktioniert immer noch) anzuzeigen. Der BusPirate selbst kann die OneWire-Geräte problemlos lesen und darauf zugreifen.

Antworten (1)

Es stellte sich heraus, dass ich den ATMega1284p mit "nur" 1 MHz laufen ließ. Durch die Sicherung auf 8 MHz funktionierte alles einwandfrei. Stabile Verbindung, zuverlässige Erkennung von Sensoren, keine Datenaussetzer soweit ich das überblicken kann.

mighty1284pIch werde versuchen, mit den und Arduino OneWire Libraryden Leuten in Kontakt zu treten , um dies zu besprechen. Ich denke, ihr Code geht entweder fest codiert davon aus, dass das Gerät mit 8 MHz läuft, oder wenn es mit 1 MHz läuft, wird die Kommunikation unzuverlässig.