Отладочный режим библиотеки
  • Доброго времени суток!
    Имеется простенькая сеть на базе колибри - несколько передатчиков и одно приемное устройство. В простейшем случае передатчики отправляют на приемник несколько значений. Столкнулся с проблемой - периодически приемное устройство перестает обрабатывать данные от одного и более передатчиков, хотя передатчики сообщают о том, что пакеты успешно отправляются. Дополнительно проверил RF тракт Si4431 анализатором спектра, радиочасть работает правильно, т.е. в определенные моменты времени включается передатчик с заданной мною мощностью и выбрасывает в эфир пакет данных. Целостность сформированного пакета данных проверить не представляется возможным.
    Для отладки со стороны приемного устройства мне необходимо каким-либо образом получать отладочную информацию от библиотеки si4431. Например, мне нужно знать что отработала функция FIFOReset. Код функции в библиотеке выглядит так:
    void SI4431Class::FIFOReset(void)
    { //сброс FIFO
    EZ_WR(0x08, 0x02)
    EZ_WR(0x08, 0x00)
    }
    Что нужно добавить, чтобы в мониторе ком порта можно было убедиться, что данная функция (и не только она) отработала? И возможно ли это в принципе?
  • В демонстрационном скетче мастера для отладки инфа пишет в сериал, скорость 38400 бод. Т.е. если подключить плату к ПК, то через терминал будет видно пришедшие данные.
    Такой вариант вас устроит?
  • Немного не то. Мне нужно получать инфу на уровне библиотеки, к примеру, я хочу знать, ушла ли команда на установку нужного регистра в радиомодуль. Опять же, к примеру, хотелось бы увидеть что команда EZ_WR(0x08, 0x02) или аналогичная ушла в модуль.
  • Ну, в SI4431.cpp, в самой функции void SI4431Class::FIFOReset пишите лог в сериал, например:
    print_P(PSTR("\r\nFIFOReset run"));
    Будет:
    void SI4431Class::FIFOReset(void)
    { //сброс FIFO
    print_P(PSTR("\r\nFIFOReset run"));
    EZ_WR(0x08, 0x02)
    EZ_WR(0x08, 0x00)
    }
  • Именно так я сначала и попробовал, как в закомментированных строках ваш
    ей библиотечки.
    C:\Program Files\Arduino\libraries\EZRadio\SI4431.cpp: In static member function 'static void SI4431Class::FIFOReset()':
    C:\Program Files\Arduino\libraries\EZRadio\SI4431.cpp:179: error: 'print_P' was not declared in this scope
  • Скачайте старую версию либы.
    Там есть 3 файлика:
    compiler.h
    conutils.h
    conutils.c

    Подключите их к своему проекту, тогда в либе будут доступны для отладки несколько процедурок: put_message, put_messageP.
    С их помощью отлаживайте.
  • Скачал. Открыл ваш пример. Скомпилировал - все нормально. Раскомментировал строку #include "conutils.h" в файле SI4431.h. Опять скомпилировал нормально. Далее в библиотеке si4431.cpp снимаю комментарий со строки
    //put_messageP(PSTR("\r\nRadio is ready"));
    получаю ошибку
    SI4431\SI4431.cpp.o: In function `SI4431Class::Init(unsigned char)':
    C:\Program Files\Arduino\libraries\SI4431/SI4431.cpp:89: undefined reference to `put_messageP(char const*)'

    если снимаю комментарий со строки
    print_P(PSTR("\r\nRadio is ready"));
    получаю ошибку
    C:\Program Files\Arduino\libraries\SI4431\SI4431.cpp: In static member function 'static void SI4431Class::Init(u8)':
    C:\Program Files\Arduino\libraries\SI4431\SI4431.cpp:94: error: 'print_P' was not declared in this scope


    Что я делаю неправильно?
  • Можно сделать проще.
    В файл SI4431.h в самый конец добавьте
    extern char I2A_BUFFER[8];
    void put_message(char *s);
    void put_messageP(const char *s);
    void i2hex(unsigned int val, char* dest, int len);
    void console_init(void);


    Аналогично в SI4431.cpp в конец добавьте
    char I2A_BUFFER[8];

    static u8 putchar_(unsigned char send_char)
    {
    while (!(UCSR0A & 0x20));
    UDR0 = (unsigned char) send_char;
    return(send_char);
    }


    static u8 getchar( void )
    {
    while ( !(UCSR0A & (1<<RXC0)) )
    {

    }
    ;
    return UDR0;
    }


    /*******************************
    put message from SRAM to UART
    *******************************/
    void put_message(char *s)
    {
    while (*s)
    putchar_(*s++);
    }


    /*******************************
    put message from FLASH to UART
    *******************************/
    void put_messageP(const char *s)
    {

    while (pgm_read_byte(s))
    putchar_(pgm_read_byte(s++));
    }


    void i2hex(unsigned int val, char* dest, int len)
    {
    register char* cp;
    register unsigned int n;
    char x;
    dest[len]=0x00;
    n = val;
    cp = &dest[len];
    while (cp > dest)
    {
    x = n & 0xF;
    n >>= 4;
    *--cp = x + ((x > 9) ? 'A' - 10 : '0');
    }
    return;
    }

    /****************************************************************************
    **
    ** Initializes UART0
    **
    ** Parameters: None
    **
    ** Returns: None
    **
    ****************************************************************************/
    void console_init(void)
    {
    /* UART0 initialisation */
    UCSR0B = 0x00; /* disable while setting baud rate */
    UCSR0A = 0x00;
    UCSR0C = 0x06; // 8 bit data
    UBRR0L = 103; // set baud rate 9600 low speed ( @ 16 MHz)
    UBRR0H = 0x00; /* set baud rate hi */
    UCSR0B = 0x18; //RX and TX are enabled
    }


    Теперь ошибок быть не должно, put_messageP будет доступно.
  • Спасибо!
    Еще столкнулся с непонятной штукой. Есть пример одного мастера и нескольких клиентов, передающих мастеру температура с датчика 18В20. Все переменные объявлены как long. Клиент получает от датчика температуру и отправляет мастеру. Так вот, когда значение температуры отрицательно (например -1), мастер получает его как 254 и т.д.
    Подскажите что может быть, пожалуйста!
    Коды в прилагаемом файлике.
    http://rusfolder.com/39691712
  • На самих клиентах температура определяется правильно?
    Т.е. при передаче данные передаются искаженно.

    Для корректной передачи данных, нужно полученную температуру умножать на 100.
    Например:
    21.10*100=2110
    -5.50*100=-550
    Смотрите пример SensorData[0] = 31.11*100;

    А затем, на мастере обратно делить на 100

    s16 Temperature_x100 = (s16) (pSensorData-> Register0);
    if (Temperature_x100 < 0) {
    Serial.print("-"); //Печатаем "-";
    Temperature_x100 = -Temperature_x100; // преобразем в положительное
    }
    u16 Temp = Temperature_x100 / 100; //Целая часть
    Serial.print(Temp);
    Serial.print(".");
    Serial.print(Temperature_x100 - Temp * 100);
    Serial.print("C\r\n");

    Смотрите пример
  • Иван, спасибо за подсказку. Но не помогло. На клиентах температура определяется корректно, также корректно складывается в буфер. Но в мастер приходит неправильная. Все типы переменных (в т.ч. в библиотеках) объявлены как long. Обошел добавлением в пакет передаваемых данных признака знака температуры.

Привет, незнакомец!

Похоже, вы новенький! Чтобы пообщаться с нами, кликните на одну из кнопок ниже :)

Войти с помощью OpenID

В этом теме: