DS2408. Читать научились, а писать еще нет.

GreenDer
Offline
Зарегистрирован: 06.09.2013

Доброго времени суток, дорогие товарищи. Подскажите пожалуста как управлять этой заразой.  Состояние входов\выходов прочитать могу, а вот как управлять светодиодами, к примеру, не могу раму собрать. Подскажите хотя-бы в какую сторону копать. 

Судя по даташиту нужно записать в определённый регистр один байт. Но как это сделать ума не приложу.

Заранее благодарен.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

https://github.com/search?q=DS2408

Если в даташите не понятно то глянь библиотеку которую писали еще под старую версию IDE Arduino.

GreenDer
Offline
Зарегистрирован: 06.09.2013

Спасибо. Уже смотрю... Но что-то всё равно светодиоды не моргают, морды такие.

GreenDer
Offline
Зарегистрирован: 06.09.2013

Решено.

Судя по всему какя-то ошибка(несоответствие) в файле примера. Удалил одну строку с условием и светодиоды заморгали.

Всем спасибо за внимание.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

ну а написать остальным чего и как?

GreenDer
Offline
Зарегистрирован: 06.09.2013

Прошу прощения. Как-то не подумал.

001#include <WProgram.h>
002#include <DS2408.h>
003#include <OneWire.h>
004#include <string.h>
005 
006#include <stdio.h>
007 
008 
009#define DEVICE_BUS_PORT 10
010 
011DS2408  ds(DEVICE_BUS_PORT);
012 
013Device led_device    = {0x29, 0xF5, 0x22, 0x7, 0x00, 0x00, 0x00, 0xBD};
014Device reader_device = {0x29, 0xF5, 0x22, 0x7, 0x00, 0x00, 0x00, 0x47};
015 
016 
017Devices devices;
018uint8_t device_count;
019 
020static FILE uartout = {0} ;
021static int uart_putchar (char c, FILE *stream) {
022    Serial.write(c) ;
023    return 0 ;
024}
025void setup_stdout() {
026    fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
027    stdout = &uartout ;
028}
029 
030#ifdef CXA_PURE_VIRTUAL_FIX
031extern "C" void __cxa_pure_virtual(void);
032void __cxa_pure_virtual(void) { while(1); }
033#endif
034 
035void print_byte(uint8_t data);
036void print_address(byte* address);
037void print_devices(Devices* devices, uint8_t device_count);
038void setup_devices(Devices* devices, uint8_t device_count);
039void display_mode(Device device);
040void display_activity(Device device);
041void display_state(Device device);
042 
043void setup(void) {
044    Serial.begin(9600);
045    setup_stdout();
046 
047    Serial.println("Welcome2");
048 
049    device_count = ds.find(&devices);
050    print_devices(&devices, device_count);
051    setup_devices(&devices, device_count);
052}
053 
054 
055void loop(void) {
056    uint8_t state = 0;
057    bool left = 1;
058    for(int index=0; index<device_count; index++) {
059        print_address(devices[index]);
060         
061      //  if(devices[index][7] == 0xBD) {                  // Тут по идее идёт проверка на то что устройство дествительно является свитчем.
062            ds.set_state(devices[index], state);
063            for(int index1=0; index1<100; index1++) {
064                if(state == 0xFF || state == 0)
065                    left = !left;
066                if(left)
067                    state = (state<<1)+1;
068                else
069                    state = state>>1;
070                ds.set_state(state, true);
071             Serial.print("State: ");   Serial.println(state);
072                delay(100);
073            }
074     //   }
075         
076        display_mode(devices[index]);
077        display_activity(devices[index]);
078        display_state(devices[index]);
079        Serial.println();
080    }
081}
082 
083void setup_devices(Devices* devices, uint8_t device_count) {
084    for(int index=0; index < device_count; index++) {
085        ds.set_mode((*devices)[index], RESET_PIN_MODE(STROBE_MODE));
086    }
087}
088 
089void display_mode(Device device) {
090    Serial.print(" MODE=");
091    print_byte(ds.get_mode(device));
092}
093void display_activity(Device device) {
094    Serial.print(" ACTIVTY=");
095    print_byte(ds.get_activity(device));
096}
097void display_state(Device device) {
098    Serial.print(" STATE=");
099    print_byte(ds.get_state(device));
100}
101 
102void print_byte(uint8_t data) {
103    for(int index=0; index<8; index++) {
104        Serial.print(data & 1, BIN);
105        data = data >> 1;
106    }
107}
108void print_address(byte* address) {
109    Serial.print("[");
110    for(int index = 0; index < sizeof(Device); index++) {
111        Serial.print(address[index], HEX);
112        if(index < sizeof(Device)-1)
113            Serial.print(" ");
114    }
115    Serial.print("] ");
116}
117 
118void print_devices(Devices* devices, uint8_t device_count) {
119    Serial.print("Found ");
120    Serial.print(device_count , HEX);
121    Serial.println(" devices.");
122 
123    for(int index=0; index < device_count; index++) {
124        Serial.print(index+1, HEX);
125        Serial.print(". ");
126        print_address((*devices)[index]);
127        Serial.println();
128    }
129}

Проблемную строку пометил коментарием.

А вобще для того что-бы светодиоды запигали достаточно вот этого:

01#include <DS2408.h>
02#include <OneWire.h>
03 
04 
05 
06 
07 
08#define DEVICE_BUS_PORT 10
09 
10DS2408  ds(DEVICE_BUS_PORT);
11 
12 
13Devices devices;
14uint8_t device_count;
15 
16 
17void setup(void)
18{
19 Serial.begin(9600);
20 device_count = ds.find(&devices);
21 
22}
23 
24 
25void loop(void)
26{
27    uint8_t state = 0;
28    bool left = 1;
29    for(int index=0; index<device_count; index++) {
30 
31            //  if(devices[index][7] == 0xBD) {                  // Тут по идее идёт проверка на то что устройство дествительно является свитчем.
32            ds.set_state(devices[index], state);
33            for(int index1=0; index1<100; index1++) {
34                if(state == 0xFF || state == 0)
35                    left = !left;
36                if(left)
37                    state = (state<<1)+1;
38                else
39                    state = state>>1;
40                ds.set_state(state, true);
41                delay(100);
42            }
43     //   }
44         
45 
46    }
47}

 

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

GreenDer ,

у вас  на шине подключенны 2 штуки ds2408 судя по ID устройств, на одной "висят" светодиоды, на другой физические кнопки, я правильно понимаю?

 

GreenDer
Offline
Зарегистрирован: 06.09.2013

Нет. на шине два ds2408 со светодиодами. Скетч поочередно переключает светодиоды на них. Кнопок нет.

Vittaly
Offline
Зарегистрирован: 19.04.2013

Добрый день!

Сложно сказать - переменная devices, видимо, описана в  DS2408.h, и поэтому из скеча ен понятна её структура. Ну проверить-то просто: напишите в 30-й строке (2-й скеч), что-нибудь типа:

Serial.Println(devices[index][7]);

И посмотрите, что она вам выводит: 0xBD или нет :).

GreenDer
Offline
Зарегистрирован: 06.09.2013

Да уже разобрался, спасибо.

Это явная ошибка автора скетча. index[7] это последний байт имени конкретного устройства. Т.к у меня все подключенные устройства имеют другие имена то проверка условия естественно заканчивалась false.

Видимо автор хотел сделать проверку на принадлежность устроства к семейству DS2408, но перепутал байты. Нужно было первый байт проверять.

Sirocco
Offline
Зарегистрирован: 28.09.2013

Хочу реализовать удалённое управление четырьмя релюшками. Думал купить DS2408. Скажите, какие плюсы у неё? Не легче ли использовать вместо неё atmega328? atmega328 стоит 30р. Ардуинка на atmega328 стоит 80р. А DS2408 стоит от 260р. Что ей можно сделать, чего нельзя реализовать на обычной ардуино?

Vittaly
Offline
Зарегистрирован: 19.04.2013

Да всё можно реализовать обоими способами. Основная фича DS2408 - это то, что в неё уже вшит протокол 1-wire. Т.е. вам вообще не надо париться с кодом на клиентской (исполняющей) стороне. Причём реализован он хардверно, с правильными таймингами. Т.е. танцы с бубном будут сведены к минимуму. Или даже полностью исключены, если и мастер хардверный использовать. Плюс почти никакой обвязки не надо. Но это всё актуально, если у вас большие расстояния. А если 4 релюшки в одном месте (иначе зачем DS2408?), да на рассоянии в пол-метра, то смысл, конечно не очевиден. В этом случае я б в сторону I2C какого-нибудь посмотрел...

Если же расстояния большие (несколько метров и дальше), то лучше бы именно хардверные 1-Wire устройства - больше вероятность, что заработает :).

Sirocco
Offline
Зарегистрирован: 28.09.2013

Ясно. Расстояние около 15метров.

У неё 8 каналов. Есть возможность сконфигурировать четыре как вход, и четыре как выход? Нужно подавать питание на релюхи, если релюха сработала, то при запуске устройства есть подтверждающий сигнал, когда устройство запустилость и нормально функционирует сухой контакт этого устройста размыкается. Тоесть нужно на некоторые подавать, а с некоторых считывать. Считывать нужно два состояния, либо Есть сигнал, Либо нет.

Vittaly
Offline
Зарегистрирован: 19.04.2013

У неё 8 IO каналов, каждый из которых может работать как угодно и независимо друг от друга. Т.е. 4 входа/4 выхода тоже можно. При этом она как таковая не конфигурируется специально. Режим работы зависит от схемы включения. А с точки зрения софта: там 2 регистра. В один регистр вы записываете состояния, которые хотите назначить соответствующим ногам (для Outputs), а из второго считываете реальное состояние ног в данный момент (режим Input). Там всё просто. 

Я в таком режиме работал с DS2413 - это двухканальный ключ. Но работает по-аналогии.

По поводу 15 м - I2C тогда не вариант. Тогда либо какой-нибудь RS485 использовать, либо вот как раз 1-wire. Для 1-wire 15 метров - это фигня. 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

можете поделиться примером, когда "В один регистр вы записываете состояния, которые хотите назначить соответствующим ногам (для Outputs)"?

Надо записывать все 8 состояний, или только одно, которое надо изменить?

Ни в одном из примеров в сети не удалось найти пример использования функции set_register, везде используют только set_state.

 

И в примере из поста #5 за что отвечают MODEACTIVTYSTATE,? В самой библиотеке комментарии настолько скудные, что нифига непонятно.

Vittaly
Offline
Зарегистрирован: 19.04.2013

Я работал только с DS2413. Если поможет - вечером приведу пример. Делал всё по Datasheet.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

думаю, поможет. Они во многом схожи.

GreenDer
Offline
Зарегистрирован: 06.09.2013

Один в один. Разница только в количестве пинов.

Vittaly
Offline
Зарегистрирован: 19.04.2013

Прошу прощения, никак не получается добраться до компьютера. Если подождёте, смогу ответить в четверг.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Я ещё жду :)

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Tomasina пишет:

Я ещё жду :)

Фигасе терпеливый какой!

где был?

 

see_watson
Offline
Зарегистрирован: 03.11.2016

ds2413 корявенький код записи

чтения