Arduino:Примеры/DS2408 Switch

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Работа с PIO-чипом DS2048[1]

Этот пример показывает, как при помощи библиотеки OneWire работать с PIO-чипом DS2048.

Код

#include <OneWire.h>

/*
 * 8-канальный PIO-чип DS2408
 *
 * Написан Гленном Тревиттом
 *
 * Пара примечаний о DS2408:
 *   - в отличие от большинства портов ввода/вывода, у DS2408 нет 
 *   битов, чтобы задать режим контакта (входной/выходной). Если вы 
 *   даете команду считывания, они будут входными, а если делаете 
 *   запись, то выходными
 *   - чтобы считывать с этого PIO-чипа, нужно воспользоваться 
 *   подтягивающими резисторами на 10 кОм
 */

void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
  for (uint8_t i = 0; i < count; i++) {
    Serial.print(addr[i]>>4, HEX);
    Serial.print(addr[i]&0x0f, HEX);
  }
  if (newline)
    Serial.println();
}

void ReadAndReport(OneWire* net, uint8_t* addr) {
  Serial.print("  Reading DS2408 ");
  PrintBytes(addr, 8);
  Serial.println();
	
  uint8_t buf[13];  // помещаем все в буфер – чтобы было проще рассчитывать CRC
  buf[0] = 0xF0;    // считываем регистры PIO 
  buf[1] = 0x88;    // адрес самого младшего бита
  buf[2] = 0x00;    // адрес самого старшего бита
  net->write_bytes(buf, 3);
  net->read_bytes(buf+3, 10);     // 3 байта для команды, 6 байтов для данных, два 0xFF, два CRC16
  net->reset();

  if (!OneWire::check_crc16(buf, 11, &buf[11])) {
    Serial.print("CRC failure in DS2408 at ");  // "Ошибка CRC в DS2048 на "
    PrintBytes(addr, 8, true); 
    return;
  }
  Serial.print("  DS2408 data = ");  // "  Данные DS2048 = "
  // первые 3 байта содержат команду (адрес регистра):
  Serial.println(buf[3], BIN);
}

OneWire net(10);  // на 10-ом контакте

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

void loop(void) {
  byte i;
  byte present = 0;
  byte addr[8];
  
  if (!net.search(addr)) {
    Serial.print("No more addresses.\n");  //  "Адресов больше нет.\n")
    net.reset_search();
    delay(1000);
    return;
  }
  
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.print("CRC is not valid!\n");  //  "CRC не корректен!\n")
    return;
  }
  
  if (addr[0] != 0x29) {
    PrintBytes(addr, 8);
    Serial.print(" is not a DS2408.\n");  //  " – это не DS2048.\n")
    return;
  }

  ReadAndReport(&net, addr);
}

См.также

Внешние ссылки