Из таблицы (стр. 134):
TX1IF доступен только для чтения, и, следовательно, вы не должны писать в него (я думаю, что это ничего не даст, если вы попытаетесь, но я бы не стал связываться с этим).
R-0
TX1IF
TX1IF: Бит флага прерывания передачи EUSART1
1 = TXREG1 буфер передачи EUSART1пусто (очищается при записи TXREG1)
0 = Буфер передачи EUSART1 заполнен
Кроме того, поскольку прерывание срабатывает сразу после установки TX1IE
, вы неНе нужно писать в TXREG1
, потому что прерывание немедленно запустит следующий символ, и это, вероятно, вызовет проблемы, поэтому удалите это:
PIR1bits.TX1IF = 0;
TXREG1 = Count;
У меня есть еще открытый вопрос ( volatile для переменной, которая читается только в ISR? ) о необходимости volatile
для буфера, и я думаю, что вам нужно отключить некоторые оптимизации, которые компилятор может попытаться сделать, и это подразумеваетчто вы не сможете использовать memset()
(в этом случае вы можете использоватьверсия memset, которую я сделал несколько дней назад: Безопасен ли `memcpy ((void *) dest, src, n)` с массивом `volatile`? (в данном случае memset_vout()
)).
Редактировать: Поскольку ответ (и его комментарии) на первый из этих двух вопросов говорит о том, что вам нужно изменчиво, чтобы предотвратить нежелательную оптимизацию.И поэтому вам нужно переписать memset (вторая ссылка).
У вас есть другая проблема: вы не сбрасываете TxCount
(который также должен быть volatile
по той же причине, что и буфер).) после завершения передачи второе отправленное вами (и последующие) сообщение всегда будет возвращаться в чеке.ISR должен сбросить это сразу после сброса TX1IE