Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

Код

  1. #include <OneWire.h>
  2.  
  3. /*
  4.  * 8-канальный PIO-чип DS2408
  5.  *
  6.  * Написан Гленном Тревиттом
  7.  *
  8.  * Пара примечаний о DS2408:
  9.  *   - в отличие от большинства портов ввода/вывода, у DS2408 нет
  10.  *   битов, чтобы задать режим контакта (входной/выходной). Если вы
  11.  *   даете команду считывания, они будут входными, а если делаете
  12.  *   запись, то выходными
  13.  *   - чтобы считывать с этого PIO-чипа, нужно воспользоваться
  14.  *   подтягивающими резисторами на 10 кОм
  15.  */
  16.  
  17. void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
  18.   for (uint8_t i = 0; i < count; i++) {
  19.     Serial.print(addr[i]>>4, HEX);
  20.     Serial.print(addr[i]&0x0f, HEX);
  21.   }
  22.   if (newline)
  23.     Serial.println();
  24. }
  25.  
  26. void ReadAndReport(OneWire* net, uint8_t* addr) {
  27.   Serial.print("  Reading DS2408 ");
  28.   PrintBytes(addr, 8);
  29.   Serial.println();
  30.        
  31.   uint8_t buf[13];  // помещаем все в буфер – чтобы было проще рассчитывать CRC
  32.   buf[0] = 0xF0;    // считываем регистры PIO
  33.   buf[1] = 0x88;    // адрес самого младшего бита
  34.   buf[2] = 0x00;    // адрес самого старшего бита
  35.   net->write_bytes(buf, 3);
  36.   net->read_bytes(buf+3, 10);     // 3 байта для команды, 6 байтов для данных, два 0xFF, два CRC16
  37.   net->reset();
  38.  
  39.   if (!OneWire::check_crc16(buf, 11, &buf[11])) {
  40.     Serial.print("CRC failure in DS2408 at ");  // "Ошибка CRC в DS2048 на "
  41.     PrintBytes(addr, 8, true);
  42.     return;
  43.   }
  44.   Serial.print("  DS2408 data = ");  // "  Данные DS2048 = "
  45.   // первые 3 байта содержат команду (адрес регистра):
  46.   Serial.println(buf[3], BIN);
  47. }
  48.  
  49. OneWire net(10);  // на 10-ом контакте
  50.  
  51. void setup(void) {
  52.   Serial.begin(9600);
  53. }
  54.  
  55. void loop(void) {
  56.   byte i;
  57.   byte present = 0;
  58.   byte addr[8];
  59.  
  60.   if (!net.search(addr)) {
  61.     Serial.print("No more addresses.\n");  //  "Адресов больше нет.\n")
  62.     net.reset_search();
  63.     delay(1000);
  64.     return;
  65.   }
  66.  
  67.   if (OneWire::crc8(addr, 7) != addr[7]) {
  68.     Serial.print("CRC is not valid!\n");  //  "CRC не корректен!\n")
  69.     return;
  70.   }
  71.  
  72.   if (addr[0] != 0x29) {
  73.     PrintBytes(addr, 8);
  74.     Serial.print(" is not a DS2408.\n");  //  " – это не DS2048.\n")
  75.     return;
  76.   }
  77.  
  78.   ReadAndReport(&net, addr);
  79. }

См.также

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

  1. github.com - DS2408_Switch.pde