«Создайте пожалуйста урок или хоть какое-то объяснение как программировать под usb на примере at90usb162. Как создать хотя бы самое элементарное USB устройство на аппаратном usb и чтобы оно распознавалось в компьютере.» — Сергей
В качестве конечной задачи, организуем мост USB-UART: со стороны мк данные будут отсылаться по USB, а со стороны ПК мы будет принимать данные с виртуального Com порта. Таким образом останется совместимость с программами работающими с обычным Com портом, т.е. можно заменить связку AVR+FTDI одной AT90. Нам понадобится AT90USB162-16AU, огрызок текстолита, 2 резистора по 22Ом, штырьки, разъем USB type B, кварц на 16МГц, 2 конденсатора по 12-22пФ, 1 конденсатор на 1мкФ, по питанию конденсатор на 0.1мкФ и желательно еще один на 10мкФ.
Собираем все по схеме, длина D+, D- одинаковая и минимально возможная и как можно ближе друг к другу. Номиналы строго указанные выше.
Разводим, травим, получаем такую штукенцию
Паечный скилл потихоньку растет, хоть и далек от идеала.
Если с ходу засунуть в USB то определится в системе так:
Таким образом у нас сразу есть готовое устройство, в чем его плюс? В том что если скачать атмеловскую софтину, то можно шить этот камень без всяких программаторов. Но наша задача получить устройство к которому можно подключаться как COM порту. У атмела на сайте можно найти аппнот «AVR272: USB CDC Demonstration: UART to USB Bridge, on megaAVR with USB». В принципе вариант нормальный, качаете готовый пример, правите под себя и юзаете, подробное описание прилагается. А мы пойдем на север 🙂
Я решил идти другим путем — для ленивых. Запускаем CAVR, настраиваем как CDC
Чуток правим исходник и теперь мы можем кидать байты на комп, как мы это делали бы при помощи юарта, для примера будем кидать Hello раз в секунду.
#include <90usb162.h> #include <delay.h> // USB Device functions #include <usb_device.h> // USB CDC Virtual Serial Port functions #include <usb_cdc.h> // USB initialization #include "usb_init.h" #include <stdio.h> // Use the USB Virtual Serial Port as printf output #define _ALTERNATE_PUTCHAR_ void putchar(char c) { usb_serial_putchar(c); } void main(void) { #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // USB Controller initialization in device mode // Note: This function also initializes the PLL usb_init_device(&usb_config); #asm("sei") // Wait for the USB device to be enumerated by the host while (!usb_enumerated); // Wait 1.5 seconds for the operating system to // load any drivers needed by the USB device delay_ms(1500); // Wait for the USB host to be ready to receive serial data by // setting the CDC Virtual Serial Port's RS-232 DTR signal high while (usb_cdc_serial.control.dtr==0); while (1) { printf("hello"); delay_ms(1000); } } |
После прошивки, венда потребует от нас свежий драйвер, выкладывать его не буду, находится в папке примеров CAVR. Но это еще не все, так как он не имеет подписи, то владельцам Win 8 предстоят пляски с бубном — нужно перезагрузить комп с отключением проверки цифровой подписи и только тогда он установится.
В итоге в диспетчере устройств появится заветный компорт.
И в терминалке будут видны приходящие байты. Скорость передачи настраивается в свойствах COM порта в диспетчере устройств. Проверено и на 9600 работает, и на 115200 работает. Так что развлекаемся 🙂
Собственно поставленная задача решена, про теорию не было сказано ни слова, но явление временное.
Прошивка, разводка, исходники
А как в программаторе от PROTTOSA AVR910 без всяких FTDI и аппаратной поддержки USB на МЕГА8 реализована коммутация с ПК, и как можно это использовать в других проектах(на что еще годится?), например USB звуковуха? Ждем продолжения статей на эту тему. 🙄
В AVR910 все это реализовано программно, со всеми вытекающими недостатками. Кстати на базе AT90USB162 делают программаторы клоны AVRISP
а какую максимальную скорость передачи можно установить? 115200 или можно больше
Вроде можно больше 115200
А что у Вас за версия CAVR?
У моей настройка USB намного хуже…
Присоединяюсь к вопросу Юрия. Какая версия CVAVR, или это плагин CVAVR к AVRStudio?
Разобрался.
В CodeVisionAVR V3.16 Evaluation такая же настройка.
Было бы замечательно рассмотреть и остальные режимы — джойстика, клавиатуры и мыши, а то возникают вопросы как передавать нажатую клавишу в USB или передвижение мыши и есть ли другая команда для CDC вместо printf?
вот
printf(«hello»);
это передать, а как принять от ПК?
x = getchar(); прием побайтный
«x = getchar(); прием побайтный»
не знаю как у всех, а у меня терминал тупо виснет и все, передаваемые данные не обрабатываются
и все же как принимать?
Admin, разжуй, пожалуйста нубам, здесь прием не так прост, как кажется — если с ПК передать данные, то все просто виснет, будь то терминалка, или какой-то другой софт, насколько здесь большой приемный буфер USB? Пробовал функции из библиотеки usb_cdc.h на очистку буфера, не катит. (к слову вместо printf лучше пользоваться функциями от туда, так как не работает printf даже с #include , хотя компилируется) . В общем главный вопрос остается с приемом данных.
у CAVR в папке examples есть пример работы с CDC, там есть описание использования getchar
Попробуйте сами принять данные, затык и все, в примерах эта функция вызывает функцию из usb_cdc.h, это понятно, но не принимает данные
Давайте разберемся, а то не я один такой, смотрю)
Ок. Как будет время ковырну.
скачал кодвижн 3.2 — по сравнению с 3.12 этот вопрос видно ковыряли в направлении cdc — теперь хотя бы терминал не виснет, а при работе скажем с самописной прогой на той же визуал студио выдает ошибку типа «время ожидания операции записи истекло» (если использовать обычный UAB-UART на спец микросхеме — работает нормально везде и всюду) и все же в среднем все равно затык 🙁
USB-UART * (извиняюсь, жаль редактировать нельзя сообщение)
Аналогичный затык с описанным в экзампле getchar()`ом. Ещё странно, что usb_serial_available() возвращает 0. И, кстати, странная штука с этими AT90USB162: delay_us() с любым аргументом создаёт долбанистически огромную задержку, delay_ms() при этом работает как полагается…
Если все и правда так печально, то попробуйте использовать LUFA
Прое..ался с проблемой затыка целый день. Вроде нашел решение. Вот решение с ком портом (не в лучшем виде, разбирайтесь сами, времени разжевывать нет):
HANDLE hCOM = CreateFile(c, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCOM!=INVALID_HANDLE_VALUE) {
COMMTIMEOUTS timeouts;
// GetCommTimeouts(hCOM, &timeouts);
EscapeCommFunction(hCOM, SETDTR);
EscapeCommFunction(hCOM, CLRBREAK);
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
if (!SetCommTimeouts(hCOM, &timeouts)) {
cout << "Error tm COM" << com << endl;
}
BOOL r = ReadFile(hCOM, &res, 1, &dw, NULL);//Прием первого байта если он есть
cout << "COM" << com << " is open OK!" << endl;
CloseHandle(hCOM);
На контроллере после инициализации отправляем первый байт, например:
while (usb_cdc_serial.control.dtr==0);
usb_serial_putchar('\n');
…
Flip не может открыть полученный hex файл. Было у кого нить такое
Народ, кто-нибудь все же разобрался как принимать байты? Ни getchar(), ни usb_serial_getchar() не работают… Посмотреть бы как-то из чего эти функции состоят, но добраться до них не могу, usb_cdc.lib не открывается…
Я так понимаю для входа в boot не нужно устанавливать перемычки на плате, то есть при подключении к USB он по умолчанию стартует с bootloader’а? Или все же нужен джампер с PD7 на VCC?
все таки надо