реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не получается поймать глюк в CDC на AT90USB162, (не инкрементируется указатель)
QuickWitted
сообщение Mar 1 2012, 06:42
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



В свое время я разрабатывал бесплатный для повторения проект по управлению компьютером с ПДУ на AT90USB162.

Смысл проекта был в том, что бы поднять CDC и через него обработанные передавать данные на компьютер.
но так как код проекта был очень большой, то пришлось писать его на ассемблере (вариант брать процессор
с большим ОЗУ я тогда не рассматривал).

Данных было мало, все бегало шустро (для ИК больше и не надо).

Единственный найденный тогда глюк заключался в том, что выяснилось -
получившийся исходник не работает на прием в потоковом режиме.
Передача шла нормально пакетами, но прием работал только в байтовом режиме.

К тому же оказалось что большинство программ для Windows (включая ГиперТерминал)
передают данные в RS232 побайтово (и глюк практически не проявлялся).

Сейчас пользователи попросили приделать к существующему приемнику мигалку, аналог Эмбилайт'а.
Мигалку я приделал, и возникла необходимость в потоковой загрузке данных в процессор...

стандартная функция чтения буфера выглядит так

Код
char uart_usb_getchar(void)
{
  register Uchar data_rx;
  Usb_select_endpoint(RX_EP);
  if (!rx_counter) while (!uart_usb_test_hit());
  data_rx=Usb_read_byte();
  rx_counter--;
  if (!rx_counter) Usb_ack_receive_out();
  return data_rx;
}


глюк заключается в том что функция data_rx=Usb_read_byte();
(на асме - lds R20_Arg1, UEDATX)

по непонятным мне причинам постоянно читает только первый байт буфера и не инкрементируется.

пример
;0x20,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09 отправляю
;0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 приходит

Ну и собственно вопрос - Не подскажет ли доброуважаемый АЛЛ куда копать?

Долго копался сам, единственное что нашел:
в более свежих версиях исходника в эту функцию добавили еще одну строку
причем Usb_reset_endpoint_fifo_access вызывается везде перед чтением или записью...
но свежий исходник намного более сложен и я в нем к сожалению заблудился...
и не понятно нужна ли она для 162...

Код
char uart_usb_getchar(void)
{
  register char data_rx;

  if (!rx_counter) {
     while (!uart_usb_test_hit());
     [color="#FF0000"]Usb_reset_endpoint_fifo_access(RX_EP);[/color]
  }
  data_rx=Usb_read_endpoint_data(RX_EP, 8);
  rx_counter--;
  if (!rx_counter) Usb_ack_out_received_free(RX_EP);
        
  return data_rx;
}


Сообщение отредактировал QuickWitted - Mar 1 2012, 06:52


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
Дэм
сообщение Mar 1 2012, 06:55
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 23-05-04
Из: Барнаул
Пользователь №: 18



Дополню.

Данные со стороны компа передаются этой функцией
Цитата
BOOL TransmitCommChar(HANDLE hFile, char cChar);

Данная функция передает один (и только один) внеочередной байт в линию, не смотря на наличие данных в очереди передатчика, и перед этими данными. Однако управление потоком действует. Функцию можно вызвать только синхронно. Более того, если байт экстренных данных, от предыдущего вызова этой функции, еще не передан в линию (например из-за функций управления потоком), то попытка экстренной передачи еще одного байта завершится ошибкой.


Если же передать данные через WriteFile() допустим 2 байта и более, то на стороне микроконтроллера в буффере последний байт. Значит данные в FIFO, и программа в микроконтроллере забирает последний байт. Нужно узнать как из FIFO забрать все байты.


--------------------
Правильно заданный вопрос содержит половину ответа...
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Mar 1 2012, 07:48
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(Дэм @ Mar 1 2012, 11:55) *
Если же передать данные через WriteFile() допустим 2 байта и более, то на стороне микроконтроллера в буффере последний байт. Значит данные в FIFO, и программа в микроконтроллере забирает последний байт. Нужно узнать как из FIFO забрать все байты.


Представлю - Дэм разработчик плагина, QuickWitted (т.е. я) разработчик прошивки.

Что байты уходят видно по логеру. А по rx_counter видно, сколько их пришло уже со стороны процессора...
т.е. я со стороны прошивки вижу прибыло скажем 10 байт. Но при чтении читаю почему то только первый.

На этой же системе передачи идут команды в нулевом ендпоинте...
и там все окей (раз устройство вообще определилось) и при таком же чтении в нулевом ендпоинте указатель инкрементируется, а тут нет.

Т.е. подряд и без какого либо дополнительного инкремента

Код
    lds    R16_Tmp1, UEDATX
    sts    ReqType, R16_Tmp1    ; 1
    lds    R17_Tmp2, UEDATX
    sts    bRequest, R17_Tmp2    ; 2
    lds    R16_Tmp1, UEDATX
    sts    wValueL, R16_Tmp1    ; 3 string_type
    lds    R16_Tmp1, UEDATX
    sts    wValueH, R16_Tmp1    ; 4 descriptor_type
    lds    R16_Tmp1, UEDATX
    sts    wIndexL, R16_Tmp1    ; 5
    lds    R16_Tmp1, UEDATX
    sts    wIndexH, R16_Tmp1    ; 6
    lds    R16_Tmp1, UEDATX
    sts    wLengthL, R16_Tmp1    ; 7
    lds    R16_Tmp1, UEDATX
    sts    wLengthH, R16_Tmp1    ; 8



Сообщение отредактировал QuickWitted - Mar 1 2012, 07:59


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 1 2012, 08:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(QuickWitted @ Mar 1 2012, 11:48) *
Представлю - Дэм разработчик плагина, QuickWitted (т.е. я) разработчик прошивки.

Что байты уходят видно по логеру. А по rx_counter видно, сколько их пришло уже со стороны процессора...
т.е. я со стороны прошивки вижу прибыло скажем 10 байт. Но при чтении читаю почему то только первый.

На этой же системе передачи идут команды в нулевом ендпоинте...
и там все окей (раз устройство вообще определилось) и при таком же чтении в нулевом ендпоинте указатель инкрементируется, а тут нет.

Т.е. подряд и без какого либо дополнительного инкремента

Код
    lds    R16_Tmp1, UEDATX
     sts    ReqType, R16_Tmp1   ; 1
     lds    R17_Tmp2, UEDATX
     sts    bRequest, R17_Tmp2   ; 2
     lds    R16_Tmp1, UEDATX
     sts    wValueL, R16_Tmp1   ; 3 string_type
     lds    R16_Tmp1, UEDATX
     sts    wValueH, R16_Tmp1   ; 4 descriptor_type
     lds    R16_Tmp1, UEDATX
     sts    wIndexL, R16_Tmp1   ; 5
     lds    R16_Tmp1, UEDATX
     sts    wIndexH, R16_Tmp1   ; 6
     lds    R16_Tmp1, UEDATX
     sts    wLengthL, R16_Tmp1   ; 7
     lds    R16_Tmp1, UEDATX
     sts    wLengthH, R16_Tmp1   ; 8


Команда LDS , STS - это прямое обращение к данным в SRAM ( без инкремента или декремента) . Строго к определённой ячейке памяти И я не уверен , что в wLengthH , wIndexL и т.д. не записано одно и тоже число.

На asm чтение из буфера выглядит так

Код
ldi  count,10
Ldi ZH,HIGH(UEDATX)
Ldi ZL,LOW(UEDATX)

CYCLE:

LD  R20_Arg1,Z+  
st (или уже sts - если адрес приёмника не меняется) - кудато,R20_Arg1
dec count
brne CYCLE


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Mar 1 2012, 09:26
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(ILYAUL @ Mar 1 2012, 13:57) *
Команда LDS , STS - это прямое обращение к данным в SRAM ( без инкремента или декремента) . Строго к определённой ячейке памяти И я не уверен , что в wLengthH , wIndexL и т.д. не записано одно и тоже число.


А я уверен, что разные...
Т.к. UEDATX не переменная.
и должна инкрементироваться автоматом, на аппаратном уровне...

в том куске кода все эти данные получаются правильно, т.к. без них (точнее, если хоть одна из них будет не та)
не произойдет определение USB устройства в виндовсе...

А девайс опознается и без глюков в определении (по схеме и с прошивкой из первого поста темы)
уже год работает более чем у 200 пользователей на разных машинах...

вопрос в другом - а почему UEDATX иногда не икрементится?



--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Mar 1 2012, 10:35
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(QuickWitted @ Mar 1 2012, 14:26) *
вопрос в другом - а почему UEDATX иногда не икрементится?


После поста тут, мне в ICQ форумчане посоветовали проверить RXOUTI
да действительно, пропадало, нашел куда, прописал доп условие... rolleyes.gif

всем спасибо за участие (как доделаем мигалку по типу эмбилайт – отпишусь о результатах).


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016