OneWireHub работает вообще ?

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Библиотека для эмуляции 1wire устройств.

https://github.com/orgua/OneWireHub

Проверил - ниодин пример не работает.  программа   от даллас onewireviewer вообще невидит ниодного устроцства  из примера.

Сканер нормально определяет реальные  устройства, железка собрана на китайском FT232 usb-com модуле.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

в описании написано. что либа не использует прерывания и таймеры. соответвенно все задержки нужно предварительно калибровать, иначе нифига работать не будет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

в описании написано. что либа не использует прерывания и таймеры. соответвенно все задержки нужно предварительно калибровать, иначе нифига работать не будет

это да, программа лежит в примерах
 

/*
 *    Test-Code for calibration - this sketch determines the value for "instructions per loop" for your µC/CPU-architecture
 *
 *      setup: upload sketch to controller and hook it up to a OW-master, it will calibrate itself to the "seen" reset-pulses
 *      NOTE: you will need a serial-port to make this work
 *
 *      --> read value per serial-com and write it to /src/platform.h to YOUR specific architecture
 *          >>>>  constexpr uint8_t VALUE_IPL {0}; // instructions per loop
 *
 *      --> alternative: activate gpio-debug and measure 1ms-high-state after calibration, adapt VALUE_IPL accordingly to match 1ms
 *
 *      --> test it with a normal sensor-sketch (like ds18b20_thermometer.ini)
 *
 *      --> if it works please make a pullrequest or open an issue to report your determined value
 *          >>>> https://github.com/orgua/OneWireHub
 */

#include "OneWireHub.h"
#include "DS18B20.h"  // Digital Thermometer, 12bit

constexpr uint8_t pin_led_dbg   { 13 };
constexpr uint8_t pin_onewire   { 8 };

auto hub     = OneWireHub(pin_onewire); // do an bus-timing-calibration on first sensor-attachment

auto ds18b20 = DS18B20(DS18B20::family_code, 0x00, 0x02, 0x0B, 0x08, 0x01, 0x0D);    // Digital Thermometer

/////////////////////////////////////////////////////////////////////////
/////// Main Code              //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////

void setup()
{
    Serial.begin(115200);

    Serial.println("OneWire-Hub calibration by observing the OW-Bus");
    Serial.flush();

    hub.attach(ds18b20);

    pinMode(pin_led_dbg, OUTPUT);
    digitalWrite(pin_led_dbg,HIGH);
}

void loop()
{
    digitalWrite(pin_led_dbg,HIGH);
    const timeOW_t value_ipl = hub.waitLoopsCalibrate();
    digitalWrite(pin_led_dbg,LOW);

    Serial.print(value_ipl);
    Serial.println("\t instructions per loop");

    hub.waitLoopsDebug();

    hub.poll();


    // advanced calibration loop --> try to track and measure it with a logic analyzer
    if (false)
    {
        io_reg_t debug_bitMask = PIN_TO_BITMASK(pin_led_dbg);
        volatile io_reg_t *debug_baseReg = PIN_TO_BASEREG(pin_led_dbg);
        pinMode(pin_led_dbg, OUTPUT);
        DIRECT_WRITE_LOW(debug_baseReg, debug_bitMask);

        const timeOW_t loops_1ms = timeUsToLoops(uint16_t(VALUE1k));
        timeOW_t loops_left = 1;
        while (loops_left)
        {
            DIRECT_WRITE_HIGH(debug_baseReg, debug_bitMask); // Fast high low flank
            DIRECT_WRITE_LOW(debug_baseReg, debug_bitMask);

            uint32_t retries = loops_1ms; // volatile needs ~2.5ms for the 1ms-loop .... but in a separate function it works as expected
            while ((!DIRECT_READ(debug_baseReg, debug_bitMask)) && (--retries)); // try to wait 1ms while LOW

            DIRECT_WRITE_HIGH(debug_baseReg, debug_bitMask); // switch to HIGH

            retries += loops_1ms;
            while ((DIRECT_READ(debug_baseReg, debug_bitMask)) && (--retries)); // try to wait 1ms while HIGH
            loops_left = retries;

            DIRECT_WRITE_LOW(debug_baseReg, debug_bitMask);
        }

        loops_left = 1;
        while (loops_left)
        {
            DIRECT_WRITE_HIGH(debug_baseReg, debug_bitMask); // switch to HIGH

            uint32_t retries = loops_1ms;
            while ((DIRECT_READ(debug_baseReg, debug_bitMask)) && (--retries)); // try to wait 1ms while HIGH

            DIRECT_WRITE_LOW(debug_baseReg, debug_bitMask);

            retries += loops_1ms;
            while (!(DIRECT_READ(debug_baseReg, debug_bitMask)) && (--retries)); // try to wait 1ms while LOW
            loops_left = retries;

            DIRECT_WRITE_HIGH(debug_baseReg, debug_bitMask); // Fast high low flank
            DIRECT_WRITE_LOW(debug_baseReg, debug_bitMask);
        }
    }
}



 

b707
Онлайн
Зарегистрирован: 26.05.2017

это не более чем учебное пособие. На гитхабе есть другие эмуляторы.

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

спасибо хлопцы, буду изучать.

Я нашeл эмулятор  который сразу определяется но он на ds18b20 настроен по регистрам.

пока  трудно понять что и где перенастроить для eeprom DS2502 .

https://github.com/mikaelpatel/Arduino-OWI

sadman41
Offline
Зарегистрирован: 19.10.2016

У серожи принцип - сначала напрячь всех, потом напрягаться самому.

kolyn
Offline
Зарегистрирован: 18.01.2019

Как будто это что-то плохое.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, вообще-то - плохое. 

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Не  будьте рабами Сережи - не напрягайтесь!

Всё что бы только в радость и в интерес!

А  вообще  сначала я напрягся и уже  3 суток, апотом  за подмогой пошел.

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

калибровка тоже не работает

какой-то тухлый проект

создал тем у с вопросом в ветке автора

https://github.com/orgua/OneWireHub/issues/75

 

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

у кого есть интерес поковыряться и всем помочь? для atmega 328 16M  arduino 1.8.5

Надо с таймингами разобраться, автор что-то  перемандил и решил сделать  универсальное под все железки и  версии компилятра но нерабочее.

 500р. закину

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

После некоторого изучения вопроса, выяснилось что проблема может быть и в компиляторе. avr  gcc Скачал все версии библиотеки, ниодна не работает. Скачал версию среды которая по моему мнению могла быть во время создания библиотеки, это 2016. Первая версия 0.2.0 заработала в ARDUINO IDE 1.6.0 Но через две секунды ее переставал видеть OneWireViewer. Сигналы при этом шли и дешифратор протокола на анализаторе их определял.

Дело замедляется отсутствием информации в каком году какая ардуина вышла и с какой версией компилятора.

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

выяснил, после перехода на gcc492 перестала нормально работать библиотека 020
а на ардуино с gcc481 работает первая версия библиотеки без шаманства.
gcc492 появился с версии arduino1610