|
и опять вопрос об драйвере obdev, AVR - CDC |
|
|
|
Aug 30 2009, 19:21
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Здраствуйте! Вобщем хочу сделать девайс который будет подключаться к ЮСБ и распознаваться как ещё один СОМ порт. Всякие дополнительные микрухи использовать не хочу поэтому хочу сделать на софтовом юсб от известного всем obdev. На сайте http://www.recursion.jp/avrcdc/ нашел пример AVR - CDC, только вот я вообще нифига не могу понять где там ф-ция для отправки и ф-ция для приема данных с компа. Может у кого нить есть небольшой примерчик где просто в бесконечном цыкле передаеться байт или массив на комп или пример, где можна получить принятый байт с компа и загрузить его в переменную(как например в случае обычного юарта ISR(UART_RXC_vect){peremennaia = UDR;}) ? ОЧЕНЬ ПРОШУ, ПАМАГИТЕ! Заранее БАЛЬШОЯ СПАСИБА!!!!!!!!!
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 27)
|
Aug 31 2009, 06:41
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Нужно немного изменить функцию (файл main.c) usbFunctionWriteOut: Код void usbFunctionWriteOut( uchar *data, uchar len ) //---Функция изменена ---// { h2d = *data; usbDisableAllRequests(); } Пример main: CODE int main(void) { // wdt_enable(WDTO_1S); odDebugInit(); hardwareInit(); usbInit(); intr3Status = 0; sei(); for(;;){ /* main event loop */ wdt_reset(); usbPoll();
/* host -> device (пример приема и обработки сообщений) */ if( usbAllRequestsAreDisabled() && 1 /*или флаг*/) { /* switch (h2d){ //Пример управления устройством со стороны ПК case '1': PORTB=1; break;
case '2': PORTB=0; break; } */ usbEnableAllRequests(); }
/* device -> host */ // Передача массива в виртуальный COM if( usbInterruptIsReady() && flag_sucess_buffer /*флаг передачи*/){ static uchar c; static uchar k;
for (k=0;k<REPORT_BUFFER_SIZE;k++) { (usbInterruptIsReady())? c = report_buffer[k], usbSetInterrupt(&c, 1): k--;
wdt_reset(); usbPoll(); if( usbAllRequestsAreDisabled()) usbEnableAllRequests(); } flag_sucess_buffer=0; }
#if USB_CFG_HAVE_INTRIN_ENDPOINT3 /* We need to report rx and tx carrier after open attempt */ if(intr3Status != 0 && usbInterruptIsReady3()){ static uchar serialStateNotification[10] = {0xa1, 0x20, 0, 0, 0, 0, 2, 0, 3, 0};
if(intr3Status == 2){ usbSetInterrupt3(serialStateNotification, 8); }else{ usbSetInterrupt3(serialStateNotification+8, 2); } intr3Status--; } #endif } return 0; }
Прежде чем передавать, необходимо что то положить в буфер и выставить флаг flag_sucess_buffer...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Aug 31 2009, 10:01
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Br.Misha @ Aug 31 2009, 10:46)  .... Еси не можте то скажите, в каком примере кода нада исправить то что вы мне сказали  ? Я же сказал: Цитата ... (файл main.c) ... AVR-CDC под Atmega8 ...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Aug 31 2009, 14:30
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
вот http://upwap.ru/540686 сделал всё как вы сказали. компилятор сказал что нету переемнный h2d и flag_sucess_buffer, я их обьявил, потом сказал что нету REPORT_BUFFER_SIZE. я думаю, что это должно быть что то типа #define REPORT_BUFFER_SIZE а вот что после этого писать я хз
|
|
|
|
|
Aug 31 2009, 15:24
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Я делал под более старую версию проекта. Сейчас посмотрел - у меня переделка с 2313 на мегу8 (делается несложно - немного подправить проект и все...). Исходный проект прилагаю:
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Aug 31 2009, 20:51
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Исправил только настройки юарта и в usbconfig.h выбрал ногу 4 вместо ноги 3. Полключил к ПК а он пишет неопознаное устройство  . попробовал заменить папку usbdrv на последнюю версию - эфект тот же. кстате, вы писали что переделали этот код с тини2313 на мегу8. можете кинуть тот, что под мегу?
|
|
|
|
|
Aug 31 2009, 21:00
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Br.Misha @ Aug 31 2009, 23:51)  Исправил только настройки юарта и в usbconfig.h выбрал ногу 4 вместо ноги 3... Нафига? И в каком проекте? То что я написал делали?
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Aug 31 2009, 21:54
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
А зачем ноги переопределять? Оставьте их в покое. Что 2313, что м8 подключаются к USB по линиям PD2 и PD3. Для того чтобы перенести проект на m8 достаточно в его свойствах указать тип МК. p.s. Цитата больше ничего не трогал но комп всё равно говорит "я хз что за девайс в ЮСБ" Забавно, проц 2313, зашили в мегу и удивляетесь, да еще и с кварцем на 16... p.p.s. Цитата Только что откомпилировал Ваш проэкт... Проект пишется с буквой "е"... Кроме того, он не мой, а в чистом виде осамовский. И абсолютно рабочий. Что в нем менять я написал. Вы же, как обычно, на это внимание не обратили...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 1 2009, 13:36
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Goodefine, еси я тя сильно задолбал то сорри, просто у меня не хочет это работать. Вобщем смотрите что я сделал: Скачал ваш проект, распаковал, открыл. В файл usbconfig.h есть строка #define USB_CFG_DMINUS_BIT 3, это означает что D- от юсб припаян к PD3 но в моей плате он на PD4 поэтому я написал так: #define USB_CFG_DMINUS_BIT 4, сохранил файл. Зашел в настройки проекта, там выбран tiny2313 и частота 12000000, а у меня мега8 с частотой 16Мгц поэтому я выбрал Device: atmega8 Frequency: 16000000. нажал ОК. Потом в main.c нашел строку UBRRL = 77; это значит, что АППАРАТНЫЙ юарт при 12МГц работает на скорости 9600bps но так как у меня 16МГц то для этой скорости нада написать UBRRL = 103; Откомпилировал проект, загрузил в МК, подключил к компу а ПК написал что неизвестное устройство  вроде всё сделал правильно но я хз почему не работает
|
|
|
|
|
Sep 1 2009, 15:19
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Br.Misha @ Sep 1 2009, 16:36)  ... но в моей плате он на PD4 поэтому я написал так: #define USB_CFG_DMINUS_BIT 4, сохранил файл. Зашел в настройки проекта, там выбран tiny2313 и частота 12000000, а у меня мега8 с частотой 16Мгц поэтому я выбрал... Что я могу сказать... Попробуйте запустить проект с минимальными телодвижениями - переделайте себе плату на использование 3-й ноги порта D и поставьте кварц на 12 Мгц. Дальше будет видно...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 4 2009, 14:55
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Я откопал кварц 12 МГц, впаял, настроил компил на мегу8, скомпилил, загрузил в МК, кодключил к компу и наконец то комп нашел новое устройство и попросил драйвер! ну я установил драйвер который Goodefine кинул вместе с проэктом и комп сказал что устройство готово к работе. После этого я поключил аппаратный ЮАРТ к компу открыл терминалку и соеденился с СОМ1 потом открыл ещё одну терминалку поключился в виктуальному СОМ4. в обеих терминалах настройки такие: 9600, 8бит, 1 стоп-бит, четность не проверяеться. Насколько я понял, при приеме какоги нить бита по UART он передаеться по ЮСБ и я должен видеть во второй терминалке то, что печатаю в первой но этого не происходит!!!! Goodefine, почему так? или я как то не правильно выбрал настройки?
|
|
|
|
|
Sep 4 2009, 20:34
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
>Связь между uart-ами должна быть физическая - соответствующие линии должны быть соединены >(Rx->Tx,Tx->Rx) через преобразователь уровней типа max232 (если требуется)... я точно так и сделал но не работает, щас хочу попробовать просто передавать массив на комп, вот что я сделал: в вашей проге написано: /* device -> host */ if( usbInterruptIsReady() && (UCSRA & (1<<RXC)) ) { uchar c; c = UDR; usbSetInterrupt(&c, 1); } я это убрал и написал так: volatile char text[10] = "Hello!"; volatile char text1=0; if( usbInterruptIsReady() && (text1<8) ) { uchar c; c = text[text1]; usbSetInterrupt(&c, 1); text1++; } но даные в комп НЕ ПЕРЕДАЮТЬСЯ!!! в терминалке ничего нету  . В чем проблема?
|
|
|
|
|
Sep 5 2009, 11:14
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Взял сегодня сам, вышеприведенный проект для тини2313 и проделал с ним следующие манипуляции: -В makefile указал тип mcu=atmega8 -там же заменил строчки ## Include Directories INCLUDES = -I"C:\Project\Recursion\CDC-2313.2008-01-27\usbdrv" -I"C:\Project\Recursion\CDC-2313.2008-01-27\." на ## Include Directories INCLUDES = -I"." -I"..\usbdrv" -I".." что позволяет размещать папку с проектом где угодно -для того чтобы не светилось ненужное теперь 2313 заменяем ВЕЗДЕ в makefile cdc2313 на cdcAtm8. Тоже самое делаем в файлах проекта *.aps и *.aws (редактируются в тоталкомандере по F4). Соответственно, переименовываем эти файлы в cdcAtm8. -удаляем результаты компиляции в папке default (файлы cdc2313.*) В итгое получаем рабочий проект для m8, с нормальными именами. Для примера, я изменил исходный файл main.c так, что при отправке с терминала в виртуальный порт цифры 1, в ответ приходит "Hello_World!". Разумеется при этом исходные функции устройства не работают. Думаю для чего это сделано, понятно...
Проект прилагаю. Одно небольшое замечание по поводу переопределения ноги D- . При необходимости, это лучше делать одновременно в двух файлах: usbconfig.h в корне папки проекта, и в usbconfig-prototype.h в папке usbdrv. Иначе можно поймать глюк...
cdcAtm8.rar ( 108.4 килобайт )
Кол-во скачиваний: 119
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 5 2009, 14:38
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Вобщем открыл я ваш проект, там были закоментированые строки UBRRL = 77; и UCSRB = (1<<RXEN) | (1<<TXEN);, я коменты убрал чтобы аппаратный юарт смог работать, переставил D- на ногу 4 в обеих файлах которые вы сказали. Прошил МК, загрузил прошивку подключил к компу, девайс компом распознался, открыл две терминалки, соеденился с двумя СОМ портами, отправил в виртуальный символ 1 но с аппаратного СОМ порта ничего не пришло  . Я немного переделал код и добавил вот это: DDRC |= (1<<2)|(1<<3);// на PC2 and PC3 припаяны светодиоды. PORTC |= (1<<3);//зажечь один светодиод. и несколько изменил одну функцию и вот что получилось: if( usbAllRequestsAreDisabled()&& 1) { switch (u2d){ ///Пример управления устройством со стороны ПК case '1': PORTC ^= (1<<3); break; case '2': PORTC ^= (1<<2); break; } usbEnableAllRequests(); } больше ничего не трогал, отправляю символы 1 и 2 в терминал но со светодиодами ничего не происходит  Кстате, какое в терминалке нада выбирать управление потоком? я всегда выбирал none. PS: юзал стандартную программу терминала и ещё одну какую то скачаную с инета(я ею посоянно пользуюсь при работе с СОМ).
|
|
|
|
|
Sep 5 2009, 15:43
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(Br.Misha @ Sep 5 2009, 17:38)  Вобщем открыл я ваш проект... Повторю еще раз для тех кто... Я что комменты зря поставил? В последнем проекте ничего сначала менять не нужно! Вообще ничего. Просто зашить (линии не меняем - PD2 и PD3) и все. Если терминалом в виртуальный ком отправить 1-цу (см. скриншот) то он ответит (в тот же терминал). Что непонятного то? Не надо делать хаотических попыток что то изменить... Насчет терминалки, выкладывал здесь. Работает точно (см. скриншот)...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 5 2009, 17:59
|
Местный
  
Группа: Validating
Сообщений: 253
Регистрация: 21-12-08
Пользователь №: 42 646

|
Блин, точно, я как то лохонулся..... сделал как вы сказали и заработало!!!!! даже пробовал светодиодами управлять, тоже получилось! Только вот почему то когда я заменил папку usbdrv на папку последней версии то девайс стал определяться но потом комп пишет ошибку, ну та лан, с этим я уже сам разберусь  И появились ещё два вопроса: 1. Насколько часто нада вызывать ф-цию usbPoll(); ? 2. Во всех примерах этого драйвера использовался сторожевой таймер. Обизательно ли его нада юзать?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|