|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
16FUSB или софтварный USB на младших PIC-ах
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну ясен пень, что программу перетрясти придётся на другой частоте, я вобщем-то предполагал...
Если не трудно - замерь всё же максимальную частоту, а то я давно уже купил вот такую хрень usb2lpt:
Gembird USB to Bitronics Converter
но " лапками шевелить" она, как оказалось, не умеет...
_________________ iLavr
|
14 Dec 2014 09:23 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Попробуем глянуть. Вот я думаю, может буферизацию сделать байт на 64? С другой стороны вряд-ли спасет положение... Надо менять на хардварный USB.
|
15 Dec 2014 02:03 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Есть ещё 2 трюка, которые могут помочь сравнительно просто организовать параллельный интерфейс.
Первый трюк - с "прошивочными и интерфейсными" USB-кабелями для сотовых телефонов:
они по сути представляют собой переходники USB-2-COM, причем сигналы RS-232 у них
5-вольтовые, а с точки зрения Венды они встают как COM-порты.
Причем, иногда позволяют использовать скорость обмена, большую, нежели максимальная,
устанавливаемая в Венде.
Я через два таких кабеля, соединенных RS-232-выводами соединял 2 компьютера по USB-портам,
как по COM-портам.
Так вот, если есть PIC или др.микроконтроллер с аппаратным последовательным интерфейсом, то
можно легко сделать из него параллельный порт, принимая данные (команды) от PC по виртуальному
COM-порту на USB, и отсылая по нему же назад данные с PIN-ов.
А второй трюк, собственно из-за него я и купил этот бестолковый адаптер - Gembird USB to Bitronics Converter. Я предполагал, что он не сможет работать побитно, но читал статью, где пишут, что можно
его использовать для управления чем-либо родными командами вывода на печать Венды, если соблюдать
протокол, характерный для обмена LPT и принтера CENTRONICS.
А для этого, как было написано в статье, достаточно подавать инвертированный сигнал STROBE на
собственный же вход BUSY.
_________________ iLavr
|
15 Dec 2014 06:38 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Итого, вместо 9 обращений по USB я ж могу слать только данные (2 обращения), а остальными ногами дергать в самом контроллере, в зависимости от того - первый это байт или второй:
То есть в обертке inpout.dll я должен контроллеру выдавать только данные (порт 0x378), причем пропускать каждый второй байт. В самом контроллере я должен использовать флаг, показывающий - первый байт пришел или второй. Если первый - то сам контроллер должен выставить bc1 = 1, bdir = 1. Если второй, то bc1 = 0, bdir1 = 1. И так по-кругу. Вчера уже поздно вечером попробовал - что-то не взлетает. Какие-то шумы и хрипы. Не очень хорошо в даташите показаны тайминги цикла записи и цикла записи адреса. Пытался сделать так как и было раньше: установил bc1=0, bdir=0 (YM inactive) выдал байт данных на ноги D0-D7 если первый байт то bc1=1, bdir=1 иначе bc1=0, bdir = 1 подождал около ~1500 нс установил bc1=0, bdir=0 (YM inactive) Не работает. То есть процедура вывода байта в ПИКе такая: | | | | Code: DIO_WriteByte:
bcf PORTA,3 ; bc1 = 0 bcf PORTA,4 ; bdir = 0
movlw 0x10 ; delay 0.00005 sec (24MHz) movwf TMP wait2: decfsz TMP goto wait2
;Put value in RB3-RB7 movlw B'00000111' andwf PORTB,W movwf TMP movlw B'11111000' andwf RXDATA_BUFFER+4,W ;wIndex Lo iorwf TMP,W movwf PORTB
;Put the last bits values in RA0-RA2 movlw B'11111000' andwf PORTA,W movwf TMP movlw B'00000111' andwf RXDATA_BUFFER+4,W ;wIndex Lo iorwf TMP,W movwf PORTA btfsc ODDEVEN,0 ; this is first byte in queque? goto second_byte ; no, goto second byte
; yes - thi is firs byte bsf ODDEVEN,0 ; set zero bit in ODDEVEN flag
bsf PORTA,3 ;bc1 = 1 bsf PORTA,4 ;bdir = 1
goto ctrl_done ; controll done
second_byte: bcf ODDEVEN,0 ; clear zero bit in ODDEVEN flag bcf PORTA,3 ; bc1 = 0 bsf PORTA,4 ; bdir = 1 ctrl_done:
movlw 0x10 ; delay 0.00005 sec (24MHz) movwf TMP wait: decfsz TMP goto wait
bcf PORTA,3 ; bc1 = 0 bcf PORTA,4 ; bdir = 0 return
| | | | |
В обертке inpout32.dll такое:
|
21 Dec 2014 04:25 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Оказываеццо, некошерно менять значения в порту командами BCF/BSF. Есть где-то вроде аппноут от микрочипа, но здесь все детально и так написано: http://www.piclist.com/techref/readmodwrite.htm . Иногда помогает задержка между BCF, но тоже говнокод и так типа нехорошо делать. Что ж, попробуем через read modify write.
|
21 Dec 2014 07:03 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Некошерно, но в оригинале прошивки так было и нормально работало себе?
_________________ iLavr
|
21 Dec 2014 11:29 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
В оригинале прошивки такого не было. Там как раз все культурно, через read modify write. Это я уже пытался bc1 bdir сам контролировать.
Переписал по нормальному, все равно не работает.
|
21 Dec 2014 11:44 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Ну ессно баг был в том, что я переменную в памяти PIC затирал потом в другом месте (не правильно описал). Поправил, заработало как и планировалось - по USB передаются только байты, а контроллер сам дергает BC1 и BDIR в зависимости от того - четный это байт или не четный. Все равно медленно, хотя с первым разом не сравнить:
https://soundcloud.com/tronix286/jok...chby-surgeon-1
Это уже видимо совсем предел. Остается только еще попробовать буферизировать паттерн (28 байт) в самом ПИКе, а потом его проигрывать параллельно с приемом новой порции данных (двойная буферизация), но что-то мне говорит о том, что это будет все равно медленно.
Все-таки наверное придется юзать другой PIC, с хардварным USB на борту. Как раз спаял недавно б/у PIC18F2550 с какой-то платы...
|
01 Jan 2015 14:39 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Окончательный код записи байта в YM:
| | | | Code: DIO_WriteByte:
;Put value in RB3-RB7 movlw B'00000111' andwf PORTB,W movwf TMP movlw B'11111000' andwf RXDATA_BUFFER+4,W ;wIndex Lo iorwf TMP,W movwf PORTB
;Put the last bits values in RA0-RA2 movlw B'11111000' andwf PORTA,W movwf TMP movlw B'00000111' andwf RXDATA_BUFFER+4,W ;wIndex Lo iorwf TMP,W iorlw B'00011000' ;set bc1=1, bdir=1 btfsc ODDEVEN,0 ;skip next intruction if first byte andlw B'11110111' ;set bc1=0, bdir=1 if second byte movwf PORTA
andlw B'11100111' ; set bc1=0, bdir=0 (inactive) movwf PORTA movlw B'00000001' ; toggle ODDEVEN flag xorwf ODDEVEN,F
return | | | | |
|
02 Jan 2015 04:38 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Тут провел небольшой тестик - в цикле писал 1000 байт и засек время выполнения: 1.085690 секунд. То есть скорость ~ 1000 байт/сек.....
Поснифал USB-трафик. Если я все правильно понял, то посылка от хоста контроллеру занимает 36 байт, контроллер отвечает хосту 28 байт. Итого на посылку 1 байта приходится физически 36+28=64 байта. То есть фактически скорость ~64Кбайт в секунду. Если я правильно понимаю, то 1,5Mbit/s USB 1.1 это ~192Kбайт в сек, то есть в пропускную способность не уперлись.
|
09 Jan 2015 14:29 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Короче, пришлось таки вкурить немного манов на тему USB протокола, как я ни сопротивлялся -) Поснифал USB-трафик, разобрался. Хотел сначала в след за контрол-пакетом слать дата пакет 8 байт данных, а потом просто запилил в ubr-пакет OUT передачу сразу 3 байт, вместо 1, как было раньше. Тем самым скорость передачи сразу возросла в три раза. Короче, заработало как и хотелось
https://soundcloud.com/tronix286/joke-of-jsbachby-surgeon-final
|
10 Jan 2015 04:56 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
|
11 Jan 2015 06:35 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
Ну, это буквально - ПОБЕДА!
|
11 Jan 2015 10:20 |
|
|
Who is online |
Users browsing this forum: No registered users and 0 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|