Добрый день. Есть контроллер серии PIC18. Возникла сейчас необходимость производить передачу по USART в прерывании. Раньше для этого я использовал функцию, и работало все без прерываний:
Нужно именно использовать прерывания, чтобы контроллер не отвлекался надолго на передачу. Но что-то не могу найти хотя бы одного примера, как это организовывается.
Все, что придумал, это
Вроде все передается, но все равно как будто не то. Подскажите, пожалуйста, как это сделать лучше? Или может у кого небольшой фрагментик готового кода завалялся 
Код: Выделить всё
void usart_Tx(void* buf,BYTE size)
{
BYTE i,j;
UINT16 k;
char* ptr = (char*)buf;
TRAN; // установить признак передачи для переключения переходника TTL-RS485
PIE1bits.RCIE = 0; // запретить прерывание от приемника USART
for(i = 0; i < size; i++)
{
TXREG1 = ptr[i]; // запись байта в буфер передатчика USART
while(!PIR1bits.TXIF); // ожидание опустошения буфера
for(j = 0; j < 255; j++) // временная выдержка для достижения скорости передачи
k++;
}
REC; // установить признак приема для переключения переходника TTL-RS485
PIE1bits.RCIE = 1; // разрешить прерывание от приемника USART
}Все, что придумал, это
Код: Выделить всё
char* ptr = (char*)usart_rx_buf;
// количество данных для передачи
void tx_str(BYTE cnt)
{
PIE1bits.TXIE = 1;
TRAN; // установить признак передачи для переключения переходника TTL-RS485
PIE1bits.RCIE = 0; // запретить прерывание от приемника USART
totalElementstoSend = cnt;
sendPointer = 0;
REC; // установить признак приема для переключения переходника TTL-RS485
PIE1bits.RCIE = 1; // разрешить прерывание от приемника USART
}
void usart_Tx_Int(void)
{
BYTE i,j;
UINT16 k;
TXREG = ptr[sendPointer];
while(!PIR1bits.TXIF); // ожидание опустошения буфера
for(j = 0; j < 255; j++) // временная выдержка для достижения скорости передачи
k++;
sendPointer++;
if (sendPointer >= totalElementstoSend)
PIE1bits.TXIE = 0;
PIR1bits.TXIF = 0;
}
