Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

us_uart1«Создайте пожалуйста урок или хоть какое-то объяснение как программировать под 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- одинаковая и минимально возможная и как можно ближе друг к другу. Номиналы строго указанные выше.
cdc_sch

Разводим, травим, получаем такую штукенцию
at90usb162_board2

Паечный скилл потихоньку растет, хоть и далек от идеала.
at90usb162_board

Если с ходу засунуть в USB то определится в системе так:
at90usb162

Таким образом у нас сразу есть готовое устройство, в чем его плюс? В том что если скачать атмеловскую софтину, то можно шить этот камень без всяких программаторов. Но наша задача получить устройство к которому можно подключаться как COM порту. У атмела на сайте можно найти аппнот «AVR272: USB CDC Demonstration: UART to USB Bridge, on megaAVR with USB». В принципе вариант нормальный, качаете готовый пример, правите под себя и юзаете, подробное описание прилагается. А мы пойдем на север 🙂

Я решил идти другим путем — для ленивых. Запускаем CAVR, настраиваем как CDC
cdc_setup

Чуток правим исходник и теперь мы можем кидать байты на комп, как мы это делали бы при помощи юарта, для примера будем кидать Hello раз в секунду.

#include <90usb162.h>
#include 

// USB Device functions
#include 

// USB CDC Virtual Serial Port functions
#include 

// USB initialization
#include "usb_init.h"
#include 

// 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<

После прошивки, венда потребует от нас свежий драйвер, выкладывать его не буду, находится в папке примеров CAVR. Но это еще не все, так как он не имеет подписи, то владельцам Win 8 предстоят пляски с бубном - нужно перезагрузить комп с отключением проверки цифровой подписи и только тогда он установится.
cdc_cavr

В итоге в диспетчере устройств появится заветный компорт.
cdc_virtualCom

И в терминалке будут видны приходящие байты. Скорость передачи настраивается в свойствах COM порта в диспетчере устройств. Проверено и на 9600 работает, и на 115200 работает. Так что развлекаемся :)
terminal_cdc

Собственно поставленная задача решена, про теорию не было сказано ни слова, но явление временное.

Прошивка, разводка, исходники

25 комментариев: AT90USB162 CDC USB-UART

  • Жандос:

    А как в программаторе от PROTTOSA AVR910 без всяких FTDI и аппаратной поддержки USB на МЕГА8 реализована коммутация с ПК, и как можно это использовать в других проектах(на что еще годится?), например USB звуковуха? Ждем продолжения статей на эту тему. 🙄

  • admin:

    В AVR910 все это реализовано программно, со всеми вытекающими недостатками. Кстати на базе AT90USB162 делают программаторы клоны AVRISP

  • Александр:

    а какую максимальную скорость передачи можно установить? 115200 или можно больше

  • admin:

    Вроде можно больше 115200

  • Юрий:

    А что у Вас за версия CAVR?
    У моей настройка USB намного хуже…

  • Руслан:

    Присоединяюсь к вопросу Юрия. Какая версия CVAVR, или это плагин CVAVR к AVRStudio?

  • Руслан:

    Разобрался.
    В CodeVisionAVR V3.16 Evaluation такая же настройка.

  • Дим:

    Было бы замечательно рассмотреть и остальные режимы — джойстика, клавиатуры и мыши, а то возникают вопросы как передавать нажатую клавишу в USB или передвижение мыши и есть ли другая команда для CDC вместо printf?

  • Александр:

    вот
    printf(«hello»);
    это передать, а как принять от ПК?

  • admin:

    x = getchar(); прием побайтный

  • Дим:

    «x = getchar(); прием побайтный»

    не знаю как у всех, а у меня терминал тупо виснет и все, передаваемые данные не обрабатываются

    и все же как принимать?

  • Дим:

    Admin, разжуй, пожалуйста нубам, здесь прием не так прост, как кажется — если с ПК передать данные, то все просто виснет, будь то терминалка, или какой-то другой софт, насколько здесь большой приемный буфер USB? Пробовал функции из библиотеки usb_cdc.h на очистку буфера, не катит. (к слову вместо printf лучше пользоваться функциями от туда, так как не работает printf даже с #include , хотя компилируется) . В общем главный вопрос остается с приемом данных.

  • admin:

    у CAVR в папке examples есть пример работы с CDC, там есть описание использования getchar

  • Дим:

    Попробуйте сами принять данные, затык и все, в примерах эта функция вызывает функцию из usb_cdc.h, это понятно, но не принимает данные

  • Дим:

    Давайте разберемся, а то не я один такой, смотрю)

  • admin:

    Ок. Как будет время ковырну.

  • Дим:

    скачал кодвижн 3.2 — по сравнению с 3.12 этот вопрос видно ковыряли в направлении cdc — теперь хотя бы терминал не виснет, а при работе скажем с самописной прогой на той же визуал студио выдает ошибку типа «время ожидания операции записи истекло» (если использовать обычный UAB-UART на спец микросхеме — работает нормально везде и всюду) и все же в среднем все равно затык 🙁

  • Дим:

    USB-UART * (извиняюсь, жаль редактировать нельзя сообщение)

  • tag_:

    Аналогичный затык с описанным в экзампле getchar()`ом. Ещё странно, что usb_serial_available() возвращает 0. И, кстати, странная штука с этими AT90USB162: delay_us() с любым аргументом создаёт долбанистически огромную задержку, delay_ms() при этом работает как полагается…

  • admin:

    Если все и правда так печально, то попробуйте использовать 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');

  • Sergey:

    Flip не может открыть полученный hex файл. Было у кого нить такое

  • Дмитрий:

    Народ, кто-нибудь все же разобрался как принимать байты? Ни getchar(), ни usb_serial_getchar() не работают… Посмотреть бы как-то из чего эти функции состоят, но добраться до них не могу, usb_cdc.lib не открывается…

  • Дмитрий:

    Я так понимаю для входа в boot не нужно устанавливать перемычки на плате, то есть при подключении к USB он по умолчанию стартует с bootloader’а? Или все же нужен джампер с PD7 на VCC?

  • admin:

    все таки надо

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Счетчик
Яндекс.Метрика