Новая темаОтветить Страница 1 из 1   [ Сообщений: 6 ]
Автор Сообщение
 Заголовок сообщения: про MHBUS
СообщениеДобавлено: 29 мар 2017, 17:25 

Зарегистрирован: 20 мар 2017, 22:38
Сообщения: 28
Привет, Алексей!
Подскажи, вот код, я хочу передать из слейва с мастер число 9, для этого использую команду MH_BUS_RESERV_0, в результате на мастере на LCD вылезает число 14130, чядн??
слейв:
Код:
if(MH_BUS_ADD == add) // Проверка не совпал ли адрес в пакете с адресом данного устройства
         {
            if(MH_BUS_COM == MH_BUS_RE_ADD)
            {
               // Замена текущего адреса на переданный в байте регистра
               
               if(MH_BUS_REG != add)
               {
                  mhbus_wr_add(MH_BUS_REG);
               }
               
               // При формировании пакета в режиме Слейв, данной функции не нужно передавать
               // в качестве аргумента адрес. Адрес функция берет из памяти EEPROM. Это сделано
               // для минимизации ошибки. В режиме Мастер, данной функции обязательно нужно
               // передавать адрес адресуемого Слейв устройства.
               
               
               mhbus_write(MH_BUS_COM, MH_BUS_REG, data);
               
            }
            else
            {
               // Здесь должен быть код при совпадении адреса
               
               if(MH_BUS_COM == MH_BUS_RETURN_T_1) // Если требуется вернуть температуру
               {
                  temperatura = ds1820_read_t(rom); // Получение температуры
                  
                  data[0] = (BYTE)(temperatura >> 8);
                  data[1] = (BYTE)temperatura;
                  
                  mhbus_write(MH_BUS_COM, MH_BUS_REG, data);
                }
               if(MH_BUS_COM == MH_BUS_RESERV_0) // Если требуется вернуть данные
               {
                  //temperatura = ds1820_read_t(rom); // Получение температуры
                  
                  data1[0] = (9);
                  //data1[1] = (155);
                  
                  mhbus_write(MH_BUS_COM, MH_BUS_REG, data1);
               }
            }
            
         }
// Конeц кода при совпадении адреса

мастер:
Код:
while(1)
   {
   err[0] = get_data(SLAVE_1);
   if(err[0] == MH_BUS_OK)
   {
      data1[0] = MH_BUS_BYTE_1;
      
   }

   //==========================================================================================
   //                                                Получение температуры
   //==========================================================================================

   //------------------------| Опрос первого датчика |-----------------------------

   err[1] = get_temeratura(SLAVE_1);
   
   if(err[1] == MH_BUS_OK)
   {
      temperatura[0] = MH_BUS_BYTE_2;
      temperatura[0] |= (MH_BUS_BYTE_1 << 8); // Сборка температуры
   }

   //==========================================================================================
   //                                             Вывод на дисплей
   //==========================================================================================
   
   //count = 0;
   
   //while(count < 2)
   {
      if(err[1] != MH_BUS_OK) // Здесь выводятся ошибки
      {
      //   sprintf(string, "T%d Err     0x%02X", count+1, err[count]);
         lcd_gotoxy(0,0);
         lcd_str_out(err[1]);
         lcd_str_out("T1 ");
         lcd_str_out("Ошибка");
      }
      else
      {
         sprintf(string, "T%d %i   Ok        ", count+1, temperatura[count]/10);
         lcd_gotoxy(0,0);
         lcd_str_out("T1 ");
         lcd_str_out(string);
      }
      //count++;
   }

   
   
   lcd_gotoxy(0,2);
   sprintf(string1, "T%d %i   Ok        ", data1[0]);
   lcd_str_out(string1);


Последний раз редактировалось Алексей bird 29 мар 2017, 18:19, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: про MHBUS
СообщениеДобавлено: 29 мар 2017, 17:28 

Зарегистрирован: 20 мар 2017, 22:38
Сообщения: 28
даже если я отключу слейв, на LCD всёравно это число 14130, а если data1 указать вместо temperatura, то на экране будут нули.
Обновлено: я понял откуда это число 14130, это с DS18B20, который установлен на мастере, но ведь переменные разные, как он влезает на экран не пойму я


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: про MHBUS
СообщениеДобавлено: 29 мар 2017, 18:24 
Аватара пользователя

Зарегистрирован: 02 мар 2013, 09:18
Сообщения: 1464
Откуда: Москва
Код:
lcd_gotoxy(0,2);

Дисплей на 20х4?
Цитата:
я хочу передать из слейва с мастер число 9

А по русски можно? :lol:
Что куда передать? Мастер делает запрос, слейв должен ответить.
Для упрощения отладки рекомендую вот эту программку.

_________________
Если долго мучиться, может быть получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: про MHBUS
СообщениеДобавлено: 29 мар 2017, 19:35 

Зарегистрирован: 20 мар 2017, 22:38
Сообщения: 28
Я понял откуда берется это число, смотри вот эта строка
Код:
sprintf(string1, "T%d %i   Ok        ", data1[0]);

даёт предупреждение
Цитата:
format '%i' expects a matching 'int' argument [-Wformat=]

Если убрать что-то: или T%d или %i предупреждение пропадает и значение восстанавливается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: про MHBUS
СообщениеДобавлено: 29 мар 2017, 20:31 

Зарегистрирован: 20 мар 2017, 22:38
Сообщения: 28
Также Алексей, прошу уточнить. Есть кусок твое кода:
Код:
BYTE get_temeratura(BYTE add) // Функция получения температуры
{
   BYTE data[4] = {0};
   BYTE test_data = FALSE;
   BYTE att = 0;
   
   while(att < ATT)
   {
      mhbus_write(add, MH_BUS_RETURN_T_1, 0, data); // Команда вернуть температуру датчика
      
      test_data = mhbus_read(100); // Ждем ответ от слейва.
      
      if(test_data != FALSE) att = ATT + 1;
      
      att++;
   }
   
   
   if((test_data == MH_BUS_OK) & (MH_BUS_ADD == add)) // Если пакет целый и совпал адрес
   {
      if((MH_BUS_REG == 0) | (MH_BUS_REG > MH_BUS_FAIL_DATA)) // Если пакет вернулся без ошибок
      {
         return test_data; // Пишем OK
      }
      else
      {
         return MH_BUS_REG; // Пишем логическую ошибку
      }
      
   }

   return test_data; // Пишем аппаратную ошибку

и код в слейве:
Код:
else
            {
               // Здесь должен быть код при совпадении адреса
               
               if(MH_BUS_COM == MH_BUS_RETURN_T_1  // Если требуется вернуть температуру
               {
                  temperatura = ds1820_read_t(rom); // Получение температуры
                  
                  data[0] = (BYTE)(temperatura >> 8);
                  data[1] = (BYTE)temperatura;
                  
                  mhbus_write(MH_BUS_COM, MH_BUS_REG, data);
               }
               
               // Конц кода при совпадении адреса

            }


Получается мне достаточно изменить команду MH_BUS_RETURN_T_1 на любую другую, взятую из mhbus_const.h и передавать данные, больше ничего менять не надо, верно? Естественно это будут другие процедуры по названию, но одинаковые(почти одинаковые) по содержанию.
А программа может и хорошая, но нет у меня сейчас порта, чтобы цепануть к компу((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: про MHBUS
СообщениеДобавлено: 29 мар 2017, 21:27 
Аватара пользователя

Зарегистрирован: 02 мар 2013, 09:18
Сообщения: 1464
Откуда: Москва
Цитата:
Если убрать что-то: или T%d или %i предупреждение пропадает и значение восстанавливается.

А что тут удивительного? Он же по русски пишет: "Какого хера ты хочешь чтобы я отформатировал два параметра, а при этом передаешь мне одну переменную!"
Цитата:
Получается мне достаточно изменить команду MH_BUS_RETURN_T_1 на любую другую, взятую из mhbus_const.h и передавать данные, больше ничего менять не надо, верно?

Чтобы еще раз не распинаться, в статье с программой глянь комментарий вот этот Алексей 21.03.17 14:47. В этом комментарии я выложил исходники слейва на котором тестил программу. Там есть и передача температуры, и байта, и байтов несколько. На любой вкус.

_________________
Если долго мучиться, может быть получится.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Новая темаОтветить Страница 1 из 1   [ Сообщений: 6 ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
     Рейтинг@Mail.ru           Яндекс.Метрика