Вообщем, оптимизировал как мог код записи байта в PIC:
Код:
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
movwf PORTA
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
Ну, играет вроде:
https://soundcloud.com/tronix286/hig0dzhmm-nik-0tl99
Но мне кажется, что медленно. Или это меня уже глючит, не знаю. Или реально медленно. Дальше еще можно попробовать буферизировать в самом ПИКе паттерн из 28 байт, одновременно принимая байты во второй буфер (двойная буферизация), но это как-то сложно, да и вряд-ли выгорит по времени выполнения. Если только еще сжимать предварительно LZW или что там быстрое. Но это уже больше костыли какие-то. Уперся уже совсем в предел, мне кажется.
Либо так, либо менять на ПИК с хардварным USB.
---------- Post added at 14:29 ---------- Previous post was at 14:16 ----------
Ну вот выкинул еще одну команду
Код:
;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
iorlw B'00011000' ;set bc1=1, bdir=1
Так тоже работает. Но это все.