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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Auratos
Родился
Сообщения: 16
Зарегистрирован: Пн окт 19, 2015 09:19:16

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

Сообщение Auratos »

Добрый день. Есть контроллер серии 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;
}
Вроде все передается, но все равно как будто не то. Подскажите, пожалуйста, как это сделать лучше? Или может у кого небольшой фрагментик готового кода завалялся :))
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

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

Вернуться в «PIC»