Arduino &DS2413

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Ответить
tammat
Сообщения: 16
Зарегистрирован: 04 окт 2011, 15:42

Arduino &DS2413

Сообщение tammat » 16 ноя 2011, 09:30

Добрый день, всем!
Пытаюсь на основе библиотеки для DS2406https://github.com/dustin/arduino-2406
сделать библиотеку для DS2413.
Вроде бы согласно даташиту поменял все, но упорно не работает.
Кто-нибудь сталкивался с подобным.
Подскажите,где ошибка
Спасибо.
ds2413.h

Код: Выделить всё

#include <OneWire.h>

#include <inttypes.h>

#define DS2413_FAMILY       0x3A

#define DS2413_WRITE_STATUS 0x5A
#define DS2413_READ_STATUS  0xF5

#define PIO_A 0x20
#define PIO_B 0x40

// Represents a single 1wire switch on an MLan.
class ds2413Switch {

 public:

    // Construct the OneWireSwitch with the given OneWire bus and address.
    // addr must be 8 bytes.
    ds2413Switch(OneWire *b, uint8_t *addr);

    // Get the switch state.
    // An optional argument indicates *which* switch state in the case
    // where you have a TSOC package with two ports.
    bool get2413State(int port = PIO_A);

    // Set the switch state(s).
    void set2413State(bool pio_a, bool pio_b = false);

 private:
    OneWire *bus;
    uint8_t address[8];

    void read2413Status(uint8_t *buffer);
}; 
ds2413.cpp

Код: Выделить всё

#include <DS2413.h>

ds2413Switch::ds2413Switch(OneWire *b, uint8_t *addr) {
    bus = b;
    for(int i = 0; i<8; i++) {
        address[i] = addr[i];
    }
}

bool ds2413Switch::get2413State(int port) {
    uint8_t status[10];
    read2413Status(status);
    return (status[7] & port) == 0;
}

void ds2413Switch::set2413State(bool pio_a, bool pio_b) {
    uint8_t state = (pio_a << 5) | (pio_b << 6) | 0xf;
    bus->reset();
    bus->select(address);
    bus->write(DS2413_WRITE_STATUS);
    bus->write(0xF0);
    bus->write(0);

    bus->write(state);
    // Read the CRC data
    for (int i = 0; i < 6; i++) {
        bus->read();
    }
    // Write the status back.
    bus->write(0xFF,1);
}

void ds2413Switch::read2413Status(uint8_t *buffer) {
    bus->reset();
    bus->select(address);
    bus->write(DS2413_READ_STATUS, 1);
    bus->write(0, 1);
    bus->write(0, 1);

    for(int i = 0; i<10; i++) {
        buffer[i] = bus->read();
    }
    bus->reset();
}
 

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Arduino &DS2413

Сообщение Andrey_B » 16 ноя 2011, 12:24

tammat, увы, у Maxim нет единого стандарта работы с компонентами.
DS2413 и DS2406 слишком разные. Совсем разные.
Они совершенно по-разному управляются с точки зрения работы в 1-wire сети.
Посмотрите Memory Function Flow Chart у DS2406 и PIO Function Flow Chart у DS2413
Вам придется полностью переписать код работы с DS2413.

dmt
Сообщения: 42
Зарегистрирован: 18 май 2011, 14:28

Re: Arduino &DS2413

Сообщение dmt » 16 ноя 2011, 20:29

tammat, Andrey_B прав, и код с 2406 нельзя напрямую перенести на 2413. Но с точки зрения работы с данными 2413 проще. Согласно даташита функция чтения должна быть примерно такой

void OneWireSwitch::readStatus(uint8_t *buffer) {
bus->reset();
bus->select(address);
bus->write(F5, 1);
for(int i = 0; i<7; i++) {
buffer = bus->read();
}
bus->reset();
}


и в возвращенном buffer[] биты 0 и 2 будут соответственно состояние PIOA, и PIOB.

С записью в 2413 чуть сложнее, там опять же согласно даташита нужно после записи байта с битами состояния PIO еще раз послать этот байт, но в инверсном виде.

Кстати в дш имхо все очень подробно расписано с примерами.Если у вас есть низкоуровневая библиотека и позволяет быстродействие, переписать код вполне реально.

tammat
Сообщения: 16
Зарегистрирован: 04 окт 2011, 15:42

Re: Arduino &DS2413

Сообщение tammat » 17 ноя 2011, 09:07

Спасибо. попробую, но я не силен в Cи и немного торможу.У меня считывает не бит, а байт??? Как выделить 0 и 2 бит как false и true?
PS Я никогда до этого с микроконтолеррами на работал....
Биты считаем слева или справа???
то есть
в ds2413h должно быть
#define PIO_A 0x00
#define PIO_B 0x20
И в PIO_A и PIO_B будут храниться состояние ключей.
Так???
Как должна выгдядеть строка для 2413????
uint8_t state = (pio_a << 5) | (pio_b << 6) | 0xf;
Спасибо еще раз...и извините за ламерские вопросы...

dmt
Сообщения: 42
Зарегистрирован: 18 май 2011, 14:28

Re: Arduino &DS2413

Сообщение dmt » 17 ноя 2011, 21:37

tammat писал(а):Спасибо. попробую, но я не силен в Cи и немного торможу.У меня считывает не бит, а байт???
Я посмотрел библиотеку OneWire.cpp вы правы, read() считывает байт. Тогда цикл не нужен, после select(address) посылаем F5 и считываем байт, в этом байте как я говорил 0-й и 2-й биты состояние PIO
tammat писал(а): Как выделить 0 и 2 бит как false и true?
PS Я никогда до этого с микроконтолеррами на работал....
Можно по разному выделить бит из байта. Сдвигом >> и-или побитным. Дело вкуса ) Почитайте про битовые операторы например здесь - http://valera.asf.ru/cpp/book/c04_11.html
tammat писал(а): Биты считаем слева или справа???
младший справа
tammat писал(а): то есть
в ds2413h должно быть
#define PIO_A 0x00
#define PIO_B 0x20
И в PIO_A и PIO_B будут храниться состояние ключей.
Так???
Эх придется вникать :) .. Нет, не будут там состояния.... судя по коду, этими переменными просто задается местоположение бит в байте состояния. Если посмотреть на процедуру
bool OneWireSwitch::getSwitchState(int port) {
uint8_t status[10];
readStatus(status);
return (status[7] & port) == 0;
}
берется 7-й байт из массива считанного предварительно через ReadStatus и делатся побитное И с PIO_A (или PIO_B, как зададите переменную port)
если указанный бит и бит в 7-м байте = 1 то на выходе будет true, иначе false
tammat писал(а): Как должна выгдядеть строка для 2413????
uint8_t state = (pio_a << 5) | (pio_b << 6) | 0xf;
Спасибо еще раз...и извините за ламерские вопросы...
Да не за что :)
Серьезно, почитайте про битовые операторы, многое понятнее станет.

ps
Я бы на вашем месте подключил ключ, терминал или ЖКИ и попробовал для начала серийник считать, как в примерах с 18В20 написано на том же сайте. А потом бы вдумчиво покурив даташит попробовал считать байт PIO, вывести на дисплей и позамыкав ножки убедиться что он меняется. А потом уже с записью пробовать.
Там действительно код простой должен быть, еще проще чем 2406, поскольку никакого EPROM у 2413 нету и один байт определяет всё. Только разобраться надо что к чему :)

Ответить