Отвечаю сразу всем.
Если вынести инкремент в отдельную операцию, получается вот что:
Код
84 usb_txtail++;
\ 00000026 .... LDI R30, LOW(usb_txtail)
\ 00000028 .... LDI R31, (usb_txtail) >> 8
\ 0000002A 8100 LD R16, Z
\ 0000002C 9503 INC R16
\ 0000002E 8300 ST Z, R16
85 usb_buffer[usb_txtail]=0x05;
\ 00000030 E005 LDI R16, 5
\ 00000032 9120.... LDS R18, usb_txtail
\ 00000036 E030 LDI R19, 0
\ 00000038 01F9 MOVW R31:R30, R19:R18
\ 0000003A .... SUBI R30, LOW((-(usb_buffer) & 0xFFFF))
\ 0000003C .... SBCI R31, (-(usb_buffer) & 0xFFFF) >> 8
\ 0000003E 8300 ST Z, R16
От (unsigned char) перед инкрементом или от & 0xFF ничего не меняется.
"ОНО" не должно выводить буфер еще раз, потому что вывод написан вот так:
Код
while (usb_txhead != usb_txtail) {
Usb_write_byte(usb_buffer[usb_txhead++]);
}
По идее, переход от 255 к нулю не должен ничем отличаться от перехода с 10 на 11, например.
А фиг..
Даже если заполнять буфер просто инкрементом, то оно потихонечку досчитывает до 255, потом быстро выводит буфер еще раз (уже заполненный) и продолжает.
Объявления переменных:
Код
volatile unsigned char usb_buffer[256];
volatile unsigned char usb_txhead;
volatile unsigned char usb_txtail;