реклама на сайте
подробности

 
 
> Тема может быть избита. не понимаю как оргнизовать работу UART по прерывания(+)
AlHakim
сообщение Jan 8 2007, 12:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-02-05
Из: Уфа
Пользователь №: 2 474



Нашел примеры работы UART-a / которые выкладывал VAI? но у него используется только перрывание на прием. Я же хочу чтобы и на передачу и на прием работало по прерваниям

Мой код
в основной программе
Uart0PutChar(0x30); прерывание проходит
Uart0PutStr("qwe"); тут как карта ляжет, программа зацикливается
....
while(*str){
Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {} // программа зацикливается
Как я понимаю, происходит изменение указателя а в это время возникает прерывание на TX и указатель Uart0Tx.PtrRdByte принимает значение Uart0Tx.PtrWrByte

-----------------------------------------
Модуль Uart.c
Код
#pragma vector=USART0TX_VECTOR
__interrupt void irq_Uart0_Tx(void)
{
    if (Uart0Tx.PtrWrByte != Uart0Tx.PtrRdByte){
        Uart0Tx.PtrRdByte = ++Uart0Tx.PtrRdByte & UART_BUFFER_MASK;
        TXBUF0 = Uart0Tx.Buffer[Uart0Tx.PtrRdByte];
    }    //
    else{
         //
         // флаг на завершение Tx и необходимости переключится на прием
         //
//         if (EventFlags & fwRxWaitTime){
//             //bSwitchTxToRx = 1;                 // EventFlags |= fwSwitchTxToRx;
//             pRS485Tx = 0;                      // приемопередатчик на Rx
//         }

    }

#pragma vector=USART0RX_VECTOR
__interrupt void irq_Uart0_Rx(void)
{
    volatile char dummy;
    unsigned char RxData;

    if ( FE+PE+OE+BRK+RXERR ){                          // overflow or framing error -
        URCTL1 &= ~ (FE+PE+OE+BRK+RXERR);               // Clear error flags
        dummy = RXBUF0;                                 // dummy read to clear RXE flag
        }
    else{
         RxData = RXBUF0;                               // Read the received data
         if ((Uart0Rx.PtrWrByte + 1) != Uart0Rx.PtrRdByte){
            Uart0Rx.PtrWrByte = ++Uart0Rx.PtrWrByte & UART_BUFFER_MASK;
            Uart0Rx.Buffer[Uart0Rx.PtrWrByte] = RxData;
         }
    }
}

void Uart0PutChar(unsigned char TxData)
{
    Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
    while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {
        //
        //  Сброс сторожевого таймера
        //
    }   // Wait for incomming data
    Uart0Tx.Buffer[Uart0Tx.PtrWrByte] = TxData;
    if  ((IFG1 & UTXIFG0) != UTXIFG0)           //    UART0_ENABLE_TX_INTERRUPT;
        IFG1 |= UTXIFG0;
}

void Uart0PutStr(unsigned char *str)
{
//    while(*str) Uart0PutChar(*str++);  //*s++=Tmpchar;
    while(*str){
        Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
        while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {}   // Wait for incomming data

        Uart0Tx.Buffer[Uart0Tx.PtrWrByte] = *str++;
        if  ((IFG1 & UTXIFG0) != UTXIFG0)       //UART0_ENABLE_TX_INTERRUPT;
            IFG1 |= UTXIFG0;
    }
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlHakim
сообщение Jan 8 2007, 15:05
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-02-05
Из: Уфа
Пользователь №: 2 474



Цитата(Сергей Борщ @ Jan 8 2007, 16:54) *
Похоже, что нет. Когда все передано прерывание передачи не запрещается и в буфер ничего не пишется. Таким образом программа постоянно после выхода из обработчика передачи снова попадает в него же.

я не утвержадю что рабочий на все 100, но повторного вхождни я впрерывание не проихслжит поскольку аппаратно в перрывание снимается бит UTXIFG0

Попробую использовать ваш код

вот еще возникла пролемка, если не сложно прокомментируйте

while(*str) Uart0PutChar(*str++); //*s++=Tmpchar;

странно передает н мой текст а часть его плюс мусор в отлачике по шагам проходит в run-time не всегда, чаще нет, видимо используемые регистры в перрывание изменяются sad.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 8 2007, 15:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



У меня рабочий код. Пока тут в грязь не ткнули smile.gif
Пожалуйста wink.gif
Линейный буфер, slave,
timer декрементируется 1мс, Service вставляется в основной цикл программы.


Код
//pc DOMP protocol
char rx_buf1[RxBufSize1];
char *rx_head1;
char *rx_tail1;
char tx_buf1[TxBufSize1];
char *tx_head1;
char *tx_tail1;
char domp_status;
char usart1_last_received;

void Uart1Configuration9600(void)
{
    U1CTL = CHAR+SWRST;            // 8-bit character and reset, 8N1
      U1TCTL = SSEL0+SSEL1;          // UCLK = SMCLK (8MHz)
      U1BR0 = 0x00;                  // 7372800/9600 - 768 or 300h
      U1BR1 = 0x03;                  //
      U1MCTL = 0x00;           
      ME2 &= ~(UTXE1 | URXE1);  // Disable USART1 TXD/RXD
       U1CTL &=~SWRST;                 // end of reset     
      rx_tail1=rx_buf1;
      rx_head1=rx_buf1;
      IE2 &= ~(URXIE1|UTXIE1);                // Disable USART1 RX and TX interrupt
}

void ClearTxBuffer1(void)
{     __disable_interrupt();    
    tx_tail1 = tx_head1 = tx_buf1;
    __enable_interrupt();
}

void ClearRxBuffer1(void)
{    rx_tail1 = rx_head1 = rx_buf1;
}

void EnableReceiver1 ( void )
{    ClearRxBuffer1();                //
  ME2|= URXE1;  //    receiver enable
  IE2|=URXIE1;        // receive interrupt enable
//    UCSR0A &= ~ ( 1 << RXC0 );        // set receiver empty bit
}    


void Uart1Configuration(void)
{ Uart1Configuration9600();
  tx_tail1 = tx_head1 = tx_buf1; // without interrupt enable
  EnableReceiver1();
}

void EnableTransmitter1 ( void )
{//    tx_tail1=tx_buf1;        // transmitt from beginning
  ME2|= UTXE1;  //    transmitter enable
    IFG2|=UTXIFG1; // set transmitter empty bit
  IE2|=UTXIE1;  //  transmitt interrupt enable
}



#pragma vector=UART1TX_VECTOR
__interrupt void USART1_transmit(void)
{     if ((domp_status==DompTransmitting) &&
     (tx_tail1<tx_head1))
        {      TXBUF1 =*tx_tail1;
            tx_tail1++;
        } else
        { IE2&=~UTXIE1;  //  transmitt interrupt disable
//      ME2&= UTXE1;  //    transmitter enable
      IFG2&=~UTXIFG1; // clear transmitter empty bit
        domp_status_timer = 2;
        domp_status = DompWaitReceiving;
    }
}


#pragma vector = UART1RX_VECTOR
__interrupt void USART1_receive(void)
{    
      usart1_last_received=U1RXBUF;
//    this two lines for Echo
//    TXBUF1 = b;
//    EnableTransmitter1();

      if (domp_status == DompWaiting)
    {    if (usart1_last_received == START_RX_CHAR)
        {    rx_head1 = rx_buf1;
            domp_status = DompReceiving;
        }
        else return;
    }
    if (domp_status == DompReceiving)
    {    *rx_head1 = usart1_last_received;
        rx_head1 ++;
        if (rx_head1 >= rx_buf1+RxBufSize1)
        domp_status=DompProcessing;
        if (usart1_last_received == END_RX_CHAR) domp_status=DompProcessing;

    }
}
/*
#pragma vector = USART0_TXC_vect
__interrupt void USART_transmit_complete(void)
{    usart_status_timer = 2;
    domp_status = UsartWaitReceiving;
}
*/

void DompService(void)
{    char b;
    switch (domp_status)

{    case DompUnconfigured:    
            Uart1Configuration();
//            SetReceiveDirection;
            ClearRxBuffer1();
            domp_status = DompWaiting;
      break;
    case DompWaiting:    
            domp_status_timer = 2000; // time for receiving
            break;
    case DompReceiving:
            if (!domp_status_timer) domp_status = DompUnconfigured;
            break;
    case DompProcessing:    
            b = MyCorrectCommand();
            if (!b)
            {    ExecuteCommandAndPrepareAnswer();
        domp_status = DompWaitTransmitting;
                domp_status_timer=5;
            }
            else     
            {    
        domp_status = DompWaitReceiving;
                domp_status_timer = 1;
            }
            break;
    case DompWaitTransmitting:    
            if     (domp_status_timer == 0)
            {    
        SetTransmitDirection;
                domp_status = DompTransmitting;
                domp_status_timer = 500;
        tx_tail1=tx_buf1;
//                EnableTransmitter1();     !!!
            }
            break;
    case DompTransmitting:    
            if (!domp_status_timer)
              {    domp_status = DompUnconfigured; }
    
            break;
    case DompWaitReceiving:
            if (domp_status_timer == 0)
            {    ClearRxBuffer1();
              SetReceiveDirection;
                domp_status = DompWaiting;//UsartReceiving;
            }
            break;
    }                        
}

char Usart1EchoTest(void)
{   char b;
    Delay(2);
    b=rtc_data[rtcSecond];
    TXBUF1=b;
    ME2|= UTXE1|URXE1;
    Delay(10);
    if (U1RXBUF==b) b=1;
    else b=0;
    domp_status=DompUnconfigured;
    return(b);
}


Жуткие следы выбора размера табуляций и портирования с АВР blink.gif

Сообщение отредактировал Dog Pawlowa - Jan 8 2007, 15:44


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AlHakim   Тема может быть избита. не понимаю как оргнизовать работу UART по прерывания(+)   Jan 8 2007, 12:58
- - HARMHARM   Позволю себе сделать несколько замечаний. 1. При р...   Jan 8 2007, 13:58
- - AlHakim   Цитата(HARMHARM @ Jan 8 2007, 15:58) 2. П...   Jan 8 2007, 14:24
- - HARMHARM   Не успел добавить комментарии, прочтите моё сообще...   Jan 8 2007, 14:30
- - Сергей Борщ   Цитата(AlHakim @ Jan 8 2007, 11:58) Модул...   Jan 8 2007, 14:54
|- - rezident   Цитата(Сергей Борщ @ Jan 8 2007, 16:54) Ц...   Jan 8 2007, 15:33
||- - Сергей Борщ   Цитата(rezident @ Jan 8 2007, 14:33) Пере...   Jan 8 2007, 21:12
|- - zltigo   Цитата(Сергей Борщ @ Jan 8 2007, 16:54) В...   May 5 2008, 16:05
|- - AHTOXA   Цитата(zltigo @ May 5 2008, 22:05) Можно ...   May 6 2008, 18:30
||- - zltigo   Цитата(AHTOXA @ May 6 2008, 20:30) Или же...   May 7 2008, 05:38
||- - Сергей Борщ   Цитата(zltigo @ May 7 2008, 08:38) Просто...   May 7 2008, 06:50
|- - rezident   Цитата(zltigo @ May 5 2008, 22:05) Можно ...   May 6 2008, 18:42
|- - MrYuran   Цитата(rezident @ May 6 2008, 21:42) Для ...   May 7 2008, 04:39
|- - AHTOXA   Цитата(MrYuran @ May 7 2008, 10:39) Я вот...   May 7 2008, 04:59
||- - MrYuran   Цитата(AHTOXA @ May 7 2008, 07:59) Тогда ...   May 7 2008, 05:05
||- - AHTOXA   Цитата(MrYuran @ May 7 2008, 11:05) ну да...   May 7 2008, 05:19
|- - rezident   Цитата(MrYuran @ May 7 2008, 10:39) А я в...   May 7 2008, 08:56
|- - Сергей Борщ   Цитата(rezident @ May 7 2008, 11:56) Флаж...   May 7 2008, 10:05
|- - Сергей Борщ   Цитата(AlHakim @ Jan 8 2007, 14:05) Цитат...   Jan 8 2007, 15:41
- - jorikdima   Посматрите AppNotes на сайте TI. Для каждого семей...   Jan 8 2007, 15:25
- - AlHakim   Сергей Борщ Попробовал использовать Ваш код, полу...   Jan 8 2007, 15:41
|- - Сергей Борщ   Цитата(AlHakim @ Jan 8 2007, 14:41) Серге...   Jan 8 2007, 16:15
- - VAI   А я был уверен, что выкладывал и прием и передачу ...   Jan 8 2007, 15:51
- - jorikdima   http://www.ti.com/litv/zip/slac015k тут простейшие...   Jan 8 2007, 16:24
- - AlHakim   Спасбо всем, а в особенности Сергею   Jan 8 2007, 18:46
- - Kurt   вопрос действительно уже не раз поднимавшийся и в ...   May 7 2008, 05:28
- - Dog Pawlowa   Оппа... Понадобилось перевести передачу на прерыва...   Sep 20 2014, 18:37
- - Genadi Zawidowski   После добавления чего-то в буфер вызвать (запретив...   Sep 20 2014, 19:00
- - Dog Pawlowa   Цитата(Genadi Zawidowski @ Sep 20 2014, 22...   Sep 20 2014, 19:56


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 22:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016