Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

PIC18F25K22. USART. Прерывание по передаче данных

Вт янв 29, 2019 11:34:47

Добрый день. Есть контроллер серии 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;
}


Вроде все передается, но все равно как будто не то. Подскажите, пожалуйста, как это сделать лучше? Или может у кого небольшой фрагментик готового кода завалялся :))

Re: PIC18F25K22. USART. Прерывание по передаче данных

Чт янв 31, 2019 10:05:11

Auratos писал(а):Вроде все передается,
А что ещё нужно ? :)
Ответить