про MHBUS

Здесь рассматриваются вопросы относящиеся к работе библиотеки AXLIB
Ответить
Алексей bird
Сообщения: 28
Зарегистрирован: 20 мар 2017, 22:38

про MHBUS

Сообщение Алексей bird » 29 мар 2017, 17:25

Привет, Алексей!
Подскажи, вот код, я хочу передать из слейва с мастер число 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 раза.

Алексей bird
Сообщения: 28
Зарегистрирован: 20 мар 2017, 22:38

Re: про MHBUS

Сообщение Алексей bird » 29 мар 2017, 17:28

даже если я отключу слейв, на LCD всёравно это число 14130, а если data1 указать вместо temperatura, то на экране будут нули.
Обновлено: я понял откуда это число 14130, это с DS18B20, который установлен на мастере, но ведь переменные разные, как он влезает на экран не пойму я

Аватара пользователя
gurvinok
Сообщения: 1471
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: про MHBUS

Сообщение gurvinok » 29 мар 2017, 18:24

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

lcd_gotoxy(0,2);
Дисплей на 20х4?
я хочу передать из слейва с мастер число 9
А по русски можно? :lol:
Что куда передать? Мастер делает запрос, слейв должен ответить.
Для упрощения отладки рекомендую вот эту программку.
Если долго мучиться, может быть получится.

Алексей bird
Сообщения: 28
Зарегистрирован: 20 мар 2017, 22:38

Re: про MHBUS

Сообщение Алексей bird » 29 мар 2017, 19:35

Я понял откуда берется это число, смотри вот эта строка

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

sprintf(string1, "T%d %i   Ok        ", data1[0]);
даёт предупреждение
format '%i' expects a matching 'int' argument [-Wformat=]
Если убрать что-то: или T%d или %i предупреждение пропадает и значение восстанавливается.

Алексей bird
Сообщения: 28
Зарегистрирован: 20 мар 2017, 22:38

Re: про MHBUS

Сообщение Алексей bird » 29 мар 2017, 20:31

Также Алексей, прошу уточнить. Есть кусок твое кода:

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

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 и передавать данные, больше ничего менять не надо, верно? Естественно это будут другие процедуры по названию, но одинаковые(почти одинаковые) по содержанию.
А программа может и хорошая, но нет у меня сейчас порта, чтобы цепануть к компу((

Аватара пользователя
gurvinok
Сообщения: 1471
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: про MHBUS

Сообщение gurvinok » 29 мар 2017, 21:27

Если убрать что-то: или T%d или %i предупреждение пропадает и значение восстанавливается.
А что тут удивительного? Он же по русски пишет: "Какого хера ты хочешь чтобы я отформатировал два параметра, а при этом передаешь мне одну переменную!"
Получается мне достаточно изменить команду MH_BUS_RETURN_T_1 на любую другую, взятую из mhbus_const.h и передавать данные, больше ничего менять не надо, верно?
Чтобы еще раз не распинаться, в статье с программой глянь комментарий вот этот Алексей 21.03.17 14:47. В этом комментарии я выложил исходники слейва на котором тестил программу. Там есть и передача температуры, и байта, и байтов несколько. На любой вкус.
Если долго мучиться, может быть получится.

Ответить