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

 
 
> LPC2124 проблема с прерыванием на UART THRE
MALLOY2
сообщение Feb 21 2007, 14:51
Сообщение #1


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



При включении прерывания U0IER_bit.THREIE = 1 не происходит прерывание при этом в U0LSR бит THRE и TEMT установлины. Происходит только после того как что то запишеш в U0THR. Я уже замучялся...

Код инициализации:

Код
    ubuff = &u0buff;
       ubuff->tx_buff = u0_buff_tx;
       ubuff->rx_buff = u0_buff_rx;
    ubuff->tx_buff_size = sizeof(u0_buff_tx);
    ubuff->rx_buff_size = sizeof(u0_buff_rx);
    PCONP_bit.PCURT0 = 1; //UART power on
    PINSEL0_bit.P0_0 = 1;//select pin for UART0  
    PINSEL0_bit.P0_1 = 1;
    U0FCR = 0xC1;
    uart_bautrate(UART0,32);
    U0LCR = 0x03; //1-8-N
    INT_Plug(UART0_ISR,VIC_UART0,IRQ_int,IRQ_Slot0);
    VIC_IntEnable(BIT(VIC_UART0));
    U0IER_bit.RDAIE = 1;
    U0IER_bit.RXLSIE = 1;


код функции передачи


Код
int uart_send_str(TUartChanel dev, const char* data)
{
  TUART_BUFF* ubuff;
  int len,fsize,head,i;
  unsigned long old_irq;
  char *ptr;
  ubuff = &u0buff;
  fsize = 0;
  len = strlen(data);
  ptr = (char*)data;
  do
   {
    do fsize = uart_tx_free(dev); while(fsize == 0);
    if (fsize > len) fsize = len;
    head = ubuff->tx_head;
    for (i=0;i<fsize;i++)
     {
      ubuff->tx_buff[head] = *ptr++;
      if(++head == ubuff->tx_buff_size) head = 0;
     }
    ubuff->tx_head = head;
    old_irq = disable_IRQ();
    ubuff->tx_size = ubuff->tx_size+i;
    restore_IRQ(old_irq);
    U0IER_bit.THREIE = 1; //<= включаем прерывание и оно не происходит
    len = len - fsize;    
   }
  while((*ptr!='\0')&&(len > 0));
  return(0);
};


код main

Код
  //U0THR = 0x00;  //<- если включить эту строку UART начинает генерить прерывания
  while(1)
   {
     uart_send_str(UART0,"HELLO WORD");
   }





Код обработчика:

Код
void UART0_ISR (void)
{
unsigned int tmp;
TUART_BUFF* ubuff = &u0buff;  
switch((U0IIR>>1)&0x7)
  {
   case IIR_THRE:   // continue sending data
        if (ubuff->tx_size == 0)U0IER_bit.THREIE = 0;
        else
         {
          U0THR = ubuff->tx_buff[ubuff->tx_tail];  
          ubuff->tx_size--;
          if (++ubuff->tx_tail == ubuff->tx_buff_size) ubuff->tx_tail = 0;
         }  
        break;
   case IIR_RSL:    
        tmp = U0LSR;
        ubuff->last_error |= tmp & 0x9E;
        break;
   case IIR_RDA:    // receive data
   case IIR_CTI:    // time out
        tmp = U0RBR;
        if (ubuff->eho_state == ON)
         {
          while(!U0LSR_bit.THRE);
          U0THR = tmp;
         };    
        if ((tmp == 0x0D) || (tmp == 0x0A)) ubuff->str_flag = 1;
        if (ubuff->rx_size == (ubuff->rx_buff_size-1))
         {
          ubuff->last_error |= RC_FIFO_OVERRUN_ERR;
         }
        else
         {
          ubuff->rx_buff[ubuff->rx_head] = tmp;    
          ubuff->rx_size++;
          if (++ubuff->rx_head == ubuff->rx_buff_size) ubuff->rx_head = 0;
         }
        break;
   }//switch
}  //isr
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Feb 21 2007, 18:38
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Ну а потом пауза в передаче и ..... кто пинок делать будет? 'Проблема' отсутствия прерывания
при его первом разрешении просто высосана из пальца.


Это как раз и проблема, так я в процедуре отправки скопировал в буфе включил прерывание и он пошел колбасится, а тут еще и пинать надо smile.gif , так что это проблема не первого включения а проблема связана с тем что когда нечего передавать надо выключить прерывание, а когда надо что то передать приходится пинки раздавать разве это работа ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 21 2007, 20:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MALLOY2 @ Feb 21 2007, 17:38) *
Это как раз и проблема

Мне бы всегда такие "проблемы".
В "идеальном" с Вашей точки зрения железе дергать разрешение прерывания когда есть/нет чего передавать (разбираясь перед этим есть или нет чего)это типа "прямо" и правильно smile.gif. А глянуть на один флаг в момент начала передачи порции это "разве это работа".

Это гипотетический "идеальный" описанный Вами алгоритм.
Код
void print_zzz( char *string )
{
//"я в процедуре отправки скопировал в буфер"
    while( *string )
      {    tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++;
              tbuf.tail++;
    }
//"включил прерывание"
    U0IER |= IER_THREIE;

//"и он пошел колбасится"
}

После того, как отколбасился еще некая процедура должна по каим-то признакам запретить прерывание

Это "НЕПРАВИЛЬНЫЙ"
Код
void print_zzz( char *string )
{
    U0THR = *string++;
    while( *string )
      {    tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++;
              tbuf.tail++;
    }
}

Ну и где "проблема"???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 21 2007, 22:22
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Feb 21 2007, 19:36) *
После того, как отколбасился еще некая процедура должна по каим-то признакам запретить прерывание
само прерывание - если из буфера извлечен последний символ.

Цитата(zltigo @ Feb 21 2007, 19:36) *
Это "НЕПРАВИЛЬНЫЙ"
Код
void print_zzz( char *string )
{
    U0THR = *string++;
    while( *string )
      {    tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++;
              tbuf.tail++;
    }
}

Ну и где "проблема"???

print_zzz("Tipa ");
print_zzz("test");
В результате "Tt" попало в FIFO а "ipa est" в буфер. Неувязка.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 21 2007, 22:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Feb 21 2007, 21:22) *
Неувязка.

Читаем внимательно - приводился текст ТОЧНО по предложенному возмущающимся заданию. В задании НЕ ПРЕДУСМОТРЕН вариант, когда вызов функции запонения буфера производится до его опустошения. Какие проблемы?
В противном случае - заводится флаг и реальная функция у меня выглядит так:
Код
void print_str( char *string )
{
    if( !(status_word & STW_THR_BUSY) )
    {   status_word |= STW_THR_BUSY;
        U0THR = *string++;
    }
    while( *string )
      {    tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++;
              tbuf.tail++;
    }
}



Цитата(Сергей Борщ @ Feb 21 2007, 21:22) *
само прерывание - если из буфера извлечен последний символ.

Само - нет. Для "хорошего" UART придется еще написать:
U0ICR |= IER_THREIE;
Для "плохого" - ничего лишнего.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
smac
сообщение Nov 29 2009, 15:42
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(zltigo @ Feb 22 2007, 01:40) *
.. реальная функция у меня выглядит так...

Извините за тупизну и поднятие старой темы, у меня есть вопросы касающийся кода функци приведнной в сообщении zltigo.
Как реализовано "выгребание" буфера tbuf.buf? В прерываниях? Как реализована установка флага STW_THR_BUSY? Интересует конечно не конкретный код а алгоритм.
Достаточно долго пытаюсь понять предложенное решение но что-то мозжечка не хватает, если не трудно, поясните пожалуйста.
Заранее спасибо.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MALLOY2   LPC2124 проблема с прерыванием на UART THRE   Feb 21 2007, 14:51
- - DASM   Читаем. Внимательно. The UART0 THRE interrupt (U0I...   Feb 21 2007, 15:07
- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 13:51) При ...   Feb 21 2007, 15:13
- - MALLOY2   Вот кривизна, одно растройство, придется драйвер п...   Feb 21 2007, 15:43
|- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 14:43) а чт...   Feb 21 2007, 15:56
|- - Alex03   Цитата(MALLOY2 @ Feb 21 2007, 17:43) Вот ...   Feb 21 2007, 17:19
|- - Alex03   Цитата(Alex03 @ Feb 21 2007, 19:19) Если ...   Feb 21 2007, 17:30
- - MALLOY2   Цитата7:6 Rx Trigger Level Select 00: trigger leve...   Feb 21 2007, 16:19
|- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 15:19) а эт...   Feb 21 2007, 17:23
- - MALLOY2   ЦитатаК какому кривому? Мой примерный перевод (уск...   Feb 21 2007, 17:41
|- - zltigo   Цитата(MALLOY2 @ Feb 21 2007, 16:41) но у...   Feb 21 2007, 18:25
|- - Alex03   Цитата(zltigo @ Feb 21 2007, 20:25) Цитат...   Feb 22 2007, 08:38
|- - zltigo   Цитата(Alex03 @ Feb 22 2007, 07:38) ИМХО ...   Feb 22 2007, 09:22
|- - Alex03   Цитата(zltigo @ Feb 22 2007, 11:22) Цитат...   Feb 22 2007, 10:44
- - MALLOY2   ЦитатаВ "идеальном" с Вашей точки зрения...   Feb 22 2007, 01:08
|- - zltigo   Цитата(MALLOY2 @ Feb 22 2007, 00:08) но к...   Feb 22 2007, 01:51
- - MALLOY2   Цитатаи нигде небыло проблем. Их нет и в LPC, ес...   Feb 22 2007, 12:18
|- - gladov   Цитата(MALLOY2 @ Feb 22 2007, 12:18) врям...   Feb 22 2007, 12:44
||- - zltigo   Цитата(gladov @ Feb 22 2007, 11:44) У Вас...   Feb 22 2007, 18:24
|- - zltigo   Цитата(MALLOY2 @ Feb 22 2007, 11:18) а у ...   Feb 22 2007, 18:12
- - MALLOY2   результат такой же , и АRM имеет команды которые ...   Feb 22 2007, 13:20


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:34
Рейтинг@Mail.ru


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