Короче, здравсте. В недавних темах я поднимал вопросы по поводу железа, как присобачить мою прелестную ATmega8A-PU к компуктеру.
И ураааа, прошил, подключил, определилось. Я безмерно рад. Попробовал все примеры, всё работает. Сразу побежал шить то что я хотел, а именно GPIO вот эт вот прошилось, лампочки подсоединил, мигаютс. Ну и читаются конечно с ножек значения. Всё хорошо.
И вот я такой думаю, для самоделки я буду слать на AVR данные с управляющей программы, сама AVR будет дёргать драйвер L293D (который мне по ошибке сунули в посылку лет 7 тому назад гыгы), также AVR будет считывать значения с двух эмм оптопар, ну типа как в мышке между колёсиком, и слать эти данные обратно на компуктер, тот в свою очередь по состоянию этих оптопар будет узнавать что действие выполнено или нет решая тем самым продолжать слать те или иные команды к AVR GPIO.
Прежде чем собирать самоделку решил побенчить скорость передачи данных, мудрить не стал взял пример называющийся hid-data
внутри управляющей программы внёс небольшие изменения, так что-бы avr передавала данные на компьютер 1000 раз подряд по 128 байт.
...
if(strcasecmp(argv[1], "read") == 0)
{
//тут не было цикла
for (int i = 0; i < 1000; ++i)
{
int len = sizeof(buffer);
if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0)
{
fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
}else{
hexdump(buffer + 1, sizeof(buffer) - 1);
}
}
}
....
На стороне прошивки микроконтроллера я убрал запись в EEPROM и навесил цикл как имитацию некой работы, тупо в данные счётчик писал.
uchar usbFunctionRead(uchar *data, uchar len)
{
if(len > bytesRemaining)
len = bytesRemaining;
/*eeprom_read_block(data, (uchar *)0 + currentAddress, len);*/
for (int i = 0; i < len; ++i)
{
data[i]=i;/*тупо вот так*/
}
currentAddress += len;
bytesRemaining -= len;
return len;
}
Всё пересобрал и прошил. Вариант передачи данных с ПК на МК проверять не стал +/- одно и тоже должно быть.
Замерял в лоб по времени отрабатывания управляющей программы. Ну как бы реальные условия гыгы. И воть чъво получилося…
Кварц 12Mhz
dron@gnu:~/hid-data-speed-test/commandline$ time sudo ./hidtool read > /dev/null
real 0m8,360s
user 0m0,008s
sys 0m0,011s
Кварц 16Mhz
dron@gnu:~/hid-data-speed-test/commandline$ time sudo ./hidtool read > /dev/null
real 0m7,261s
user 0m0,007s
sys 0m0,011s
Ну ок, считаем Это только читаем из контроллёра
- 12Mhz ->
(1000 * (128 * 8)) / 8.360
=122488
бит в секунду - 16Mhz ->
(1000 * (128 * 8)) / 7,261
=141027
бит в секунду
Важно что в примере было вот это
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x80, // REPORT_COUNT (128)
Я ещё не очень разобрался, но вроде понял что данные передаются по 8 байт за раз. Что собна видно было по счётчику который я писал в данные, если не отправлять в /dev/null
то всё видно.
Ну вроде не шибко много, но вроде и не мало. В байт можно сунуть 8 разных значений и получается 141 тысяча значений в секунду. Для GPIO это значит что я могу дрыгать быстро ножками и читать ножки в принципе довольно быстро. Я такой весь довольный лезу в даташит поглазеть на всякие приколюхи, заинтересовал UART и вижу в Table 20-12 для 16Mhz скорость передачи данных от 1Mbit/s или 2Mbit/s Это же в 7 и 14 раз быстрее чем через V-USB соответственно. Ну ладно два мегабита это фиг с ним, но один это уже круть.
И вот после этого коротенького вступления вопрос или даже скорее приём советов по поводу что лучше использовать в самоделках для коммуникации с ПК.
Пока что переходника USB-UART у меня нету и опыта работы с UART в виде написания для него программ тоже нету, переходник надо заказывать.
- 0 - Хочется простоты и надёжности (ну относительной для самоделок)
- 1 - Хочется делать штуки разные (есть 5 микроконтролелров)
- 2 - Хочется для каждой штуки написать утилиту для работы с нею
- 3 - Хочется что-бы утилиты могли сами определять с каким конкретно контроллером работать даже если их воткнуто все 5 штук
Ну по первому, делаешь и делай. Ок.
По второму с USB я так понял что могу взять халявный VID/PID Vendor Class и фигачить на них вообще всё что угодно, различая устройства по строковому описанию устройства, таким образом «драйвером» устройства будет программа. Даже свою клавиатуру могу забабахать и продавать её, хотя с этим вроде как проблемы и геморой с этими VID/PID ну да ладно.
Третье, ну третье вытекает из второго 5 юсб устройств с одинаковыми VID/PID, но разными строками описания не будут конфликтовать.
Это я всё понял для USB, а вот теперь USB-UART 3 преимущества которое я вижу это
- не надо никакой обвязки втыкнул в контроллер 4 провода и всё
- скорость, гораздо большая скорость передачи данных
- не будут заняты ~2 килобайта флеша и оперативки ~100 байт.
- может ещё чего, но в голову ничего не лезет
А вот теперь вопрос, могу ли я забабахать клавиатуру на AVR через USB-UART =))) Я так понимаю нет, немогу. Это и ещё кучка других подобных случаев идут в минус, а вот GPIO могу ибо «драйвер» это управляющая программа обычная.
Могу ли я впихнуть 5 штук USB-UART переходников и работать с каждым устройством отдельно? Будет какой то геморой, конфлиткты этих переходников и вообще?
Могу ли я при воткнутых 5 штуках USB-UART при этом на каждом из них будет висеть по AVR микроконтроллеру из пяти программ сделать так что-бы каждая программа присобачилась к нужному переходнику? Будет ли тут геморой?
Будет ли внезапная необходимость накатывать модули ядра аля блоб для USB-UART переходников?
Могут ли они честно вытягивать мегабит? Например PL2303HX USB to TTL он со шнурком сразу идёт, удобно, практично.
Короче, я всё это только пока-что палочкой тыкаю. Буду рад услышать советы, V-USB не шутсро, но работает уже сейчас, а вот огребу ли я гемороя от переходников, как в железной части, так и в последующем программном взаимодействии? Или же годно для устройств всяких (очень разнообраных) использовать переходничик? Софтовый USB vs Аппаратный USB и UART.
Дискас.