Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Странности с lufa-Generic HID device

Непрочитано 31.08.2013, 20:34  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Странности с lufa-Generic HID device

в общем, весьма близко к примерчику в луфа.
Софт на компе (компонент JEDI Hid Device) отсылает один output-report с "командой=0", которую МК запоминает в виде цифры (байта).

В вызове CreateGenericHIDReport эта цифра инкрементируется и отсылается назад (присваивается DataArray[1] и [2], uint16 делится на LO и HI).

Очевидно, в софте на компе должен получатся этот же инкремент. Однако..
цифра скачет сразу на несколько порядков, может с 1 до 40 прыгнуть. Если поставить паузу в цикле запроса get_report - то разрыв стремительно увеличивается.
Получается, что срабатывание CreateGenericHIDReport получается намного чаще моих вызовов его из софта на компе.

Что может быть причиной этому?

На борту еще весьма шустрый таймер (программная процедурка) (отключал, опустошал - не помогает) и наверно и все..
Реклама:
whoim вне форума  
Непрочитано 31.08.2013, 20:39  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: странности с lufa-Generic HID device

попробую более внятно
Код:
int main(void)
{
		SetupHardware();
		GlobalInterruptEnable();
		
    while(1)
    {
		HID_Task();
		USB_USBTask();
    }
}
Код:
void ProcessGenericHIDReport(uint8_t* DataArray)
{	
	/*обработка входящих репортов*/
	
	last_command = DataArray[0];

......

	if(last_command == 0x44 || DataArray[0] == 0x45) //команды 0x44,0x45 старт и стоп чтения eeprom
	{
		ext_eeprom_addr = 0; //сброс адресации eeprom
	}
Код:
void CreateGenericHIDReport(uint8_t* DataArray)
{
...
	if(last_command == 0x44)  //
	{
		DataArray[0] = 0x44; //возврат команды для проверки
		
		DataArray[1] = LO(ext_eeprom_addr);
		DataArray[2] = HI(ext_eeprom_addr);
		ext_eeprom_addr++; //инкремент адреса
Код:
  fillchar(usb_report,length(usb_report),0); 
  usb_report[1] := $44;
  send_out_report();

  n:=1;
  while( usb_report[1] = $44) do
    begin
    get_in_report(); (данные попадают в массив usb_report)
    Memo1.Lines.Add(IntToStr(n) + ' 0x'+IntToHex(usb_report[1], 2) + ' - ' + IntToStr( (usb_report[3] shl 8) or usb_report[2] ));
    inc(n);
    end; //while
whoim вне форума  
Непрочитано 01.09.2013, 00:13  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Ничо не понимаю, в общем то. Вызов процедуры, где "складывается" массив на отправку, явно происходит часто и густо без моего участия.
Я очень рассчитывал разместить там счетчик.. чтобы сэкономить на протоколе обмена, но видно не судьба
whoim вне форума  
Непрочитано 01.09.2013, 00:46  
Wiza_
Гражданин KAZUS.RUN
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Сообщение от whoim Посмотреть сообщение
Вызов процедуры, где "складывается" массив на отправку, явно происходит часто и густо без моего участия.
Каждую 1 мс если быть точным. Т.к. ваше устройство ничего не имеет права посылать без ведома компьютера, оно вынуждено проверять есть ли что ему отправить с каждым новым фреймом на шине.
Wiza_ вне форума  
Непрочитано 01.09.2013, 00:49  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Wiza_, не думаю, что там 1мс. Я таймеры не поднимал, библиотека не использует. Вызов идет в основном теле (постоянно, а в таймер переносятся свои заморочки).
К тому же

Код:
void HID_Task(void)
{
	/* Device must be connected and configured for the task to run */
	if (USB_DeviceState != DEVICE_STATE_Configured)
	return;

	Endpoint_SelectEndpoint(GENERIC_OUT_EPADDR);

	/* Check to see if a packet has been sent from the host */
	if (Endpoint_IsOUTReceived())
	{
		/* Check to see if the packet contains data */
		if (Endpoint_IsReadWriteAllowed())
		{
			/* Create a temporary buffer to hold the read in report from the host */
			uint8_t GenericData[OUT_REPORT_SIZE];

			/* Read Generic Report Data */
			Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);

			/* Process Generic Report Data */
			ProcessGenericHIDReport(GenericData);
		}

		/* Finalize the stream transfer to send the last packet */
		Endpoint_ClearOUT();
	}

	Endpoint_SelectEndpoint(GENERIC_IN_EPADDR);

	/* Check to see if the host is ready to accept another packet */
	if (Endpoint_IsINReady())
	{
		/* Create a temporary buffer to hold the report to send to the host */
		uint8_t GenericData[IN_REPORT_SIZE];

		/* Create Generic Report Data */
		CreateGenericHIDReport(GenericData);

		/* Write Generic Report Data */
		Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData), NULL);

		/* Finalize the stream transfer to send the last packet */
		Endpoint_ClearIN();
	}
}
или это и есть то вы имеете ввиду? Если готов - то огонь?
whoim вне форума  
Непрочитано 01.09.2013, 00:52  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Как бы у меня принцип задумывался такой.
uint8_t last_comand хранит "код" последней пришедшей команды.
То есть в set_output_report я отправляю эту команду, МК запоминает.
При вызове CreateGenericHIDReport внутри проверяется, соответствует ли last_command этой цифре, и если да - заполняется массив. Если я после заполнения массива обнулю last_command то эта теория не работает ВООБЩЕ.

То есть код команды я посылаю, он присваивается last_command, однако проверку ветка в CreateGenericHIDReport НЕ проходит.

Путаюсь вконец уже. Мож, целиком выложить? С библиотекой?
whoim вне форума  
Непрочитано 01.09.2013, 00:53  
Wiza_
Гражданин KAZUS.RUN
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Сообщение от whoim Посмотреть сообщение
/* Check to see if the host is ready to accept another packet */
Имеется ввиду что хост послал SOF для данной точки
Wiza_ вне форума  
Непрочитано 01.09.2013, 00:55  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Wiza_, ага.
Получается, CreateGenericHIDReport выполняется всегда с бешаной скоростью, а программа на компе забирает данные только когда они реально нужны..
Как в таких условиях организовать передачу из МК данных неизвестного состава и длинны? Я планировал по "метке" останавливать передачу, передавая программе на компе некий байтик..
whoim вне форума  
Непрочитано 01.09.2013, 00:57  
Wiza_
Гражданин KAZUS.RUN
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Не, мне хватило ковыряния с CDC. Второй раз я этого не переживу =)

Суть в том, что внутренние процедуры USB - не трогайте. В либе должно быть две процедуры с которыми вам надо работать: отослать массив, и колбэк на приём данных. В остальное лучше не лезть и не вникать. Только если для общего развития...
Wiza_ вне форума  
Непрочитано 01.09.2013, 00:57  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Странности с lufa-Generic HID device

Сообщение от whoim Посмотреть сообщение
Если я после заполнения массива обнулю last_command то эта теория не работает ВООБЩЕ
получается следующее, видимо
программа на ПК посылает команду в МК
команда запоминается
процедура CreateGenericHIDReport выполняется следом без оглядки на то, просит ли хост данные, попутно обнуляя команду
когда комп просит данные, уже поздно - метка обнулена
whoim вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клон AVRISP mk2 (основан на LUFA) работает, но есть проблема harchenko_pavel Микроконтроллеры, АЦП, память и т.д 80 14.05.2010 18:53
Помогите разобраться USB Device - HID - Joystick redb Микроконтроллеры, АЦП, память и т.д 6 11.03.2010 14:20


Часовой пояс GMT +4, время: 00:25.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.