Тут вчерась все-таки сделал посылку дата-блоков по 8 байт, буфер на 64 байта - короче скорость получилась вообще быстрая, может даже потом нужно будет по таймеру синхронизировать, хотя как по мне - так норм:
https://soundcloud.com/tronix286/vis...n-98-r-e-m-i-x
Но, обнаружилась другая достаточно неприятная проблема: через несколько тысяч фреймов ПЫК перестает реагировать на пакеты, перестает слать ACK хосту и как будто завис. Где, что зависает, как отдебажить - неведомо. Поэтому читал вчера вечером долго вслух сорцы. Пришел к выводу, что скорее всего зацикливается цикл приема бит в isr.asm:
PHP код:
#define USB_DPLUS PORTB,0
#define USB_DMINUS PORTB,1
#define USB_EOPCHK PORTB,2
RxLoop:
btfsc USB_DPLUS
bsf INDF,4
btfss USB_EOPCHK
goto Eop
btfsc USB_DPLUS
bsf INDF,5
btfss USB_EOPCHK
goto Eop
btfsc USB_DPLUS
bsf INDF,6
btfss USB_EOPCHK
goto Eop
btfsc USB_DPLUS
bsf INDF,7
incf FSR,F
clrf INDF
btfsc USB_DPLUS
bsf INDF,0
btfss USB_EOPCHK
goto Eop
btfsc USB_DPLUS
bsf INDF,1
btfss USB_EOPCHK
goto Eop
btfsc USB_DPLUS
bsf INDF,2
btfss USB_EOPCHK
goto Eop
btfsc USB_DPLUS
bsf INDF,3
goto RxLoop
Если смареть на оригинальную схему (у меня впрочем так же):

То видно, что RB2 - это есть D- и D+. Так как в один момент времени не может быть оба сигнала (D- и D+) в одинаковом логическом состоянии, кроме случая, когда это конец пакета. Тогда D- и D+ оба в нуле.
Но видимо так иногда складываются биты, что конец пакета пропускается. И тогда цикл зацикливается навечно. После того, как ПЫК перестал отвечать, если коротнуть RB2 на земелюшку, то он чудным образом начинает снова отвечать на мои ответы.
В цикле конечно нельзя добавлять никаких новых команд, потому что он и так оптимизирован по тактам (4 команды на каждый бит), частота пыка 24МГц. Поэтому счетчик по переполнению не добавить. Думал насчет WDT, но чет вроде не нашел команд как его остановить и включить - похоже он всегда работает в данном пик, а это плохо. Я бы по входу в isr включил его, а по выходу из цикла выключил. Но полный резет девайса - это не круто, слетят все настройки USB и он по любому отвалится от шины. То есть это не решение.
Решение мне видится только с хардварной стороны - когда там (на RB2) получился ноль, подержать его чуть-чуть. Или я не знаю. Впаял кстати вместо R2 15Kом на вышеприведенной схеме 3 Ком - немного отлегло, но не до конца. Может два часа работать, а потом возьми да и зависни.